From patchwork Mon Jan 16 20:35:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 9519417 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D03CC60210 for ; Mon, 16 Jan 2017 20:36:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0883281F9 for ; Mon, 16 Jan 2017 20:36:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B50B62824F; Mon, 16 Jan 2017 20:36:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 066472823E for ; Mon, 16 Jan 2017 20:36:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751455AbdAPUg5 (ORCPT ); Mon, 16 Jan 2017 15:36:57 -0500 Received: from mail-bl2nam02on0083.outbound.protection.outlook.com ([104.47.38.83]:59648 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751430AbdAPUgl (ORCPT ); Mon, 16 Jan 2017 15:36:41 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=5aQt5Lr71TLxFOxI7kmk/r5kXdJQM4/jTWc5zYq13sc=; b=APHXuvS3L/eoLx/1mBLn0orsnMajtuj3tR7DsZe8gJivM1XSMVlwfQRd17q4eRlZT/6PmLLTGsE864y+684pKToRus0zkAX6caGB8xrwtxIN22c6sm8R0NNDCTiuFtNWGBZ9hFMT8MxUVUXsKQoVOBe/JfsPYiH3h83PpN0IiYI= Received: from DM2PR07CA0047.namprd07.prod.outlook.com (10.141.52.175) by CO1PR07MB208.namprd07.prod.outlook.com (10.242.167.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Mon, 16 Jan 2017 20:36:27 +0000 Received: from BL2FFO11FD016.protection.gbl (2a01:111:f400:7c09::196) by DM2PR07CA0047.outlook.office365.com (2a01:111:e400:2414::47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12 via Frontend Transport; Mon, 16 Jan 2017 20:36:27 +0000 Authentication-Results: spf=none (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; linux-iscsi.org; dkim=none (message not signed) header.d=none; linux-iscsi.org; dmarc=none action=none header.from=cavium.com; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BL2FFO11FD016.mail.protection.outlook.com (10.173.160.224) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.803.8 via Frontend Transport; Mon, 16 Jan 2017 20:36:26 +0000 Received: from dut1171.mv.qlogic.com (172.29.51.171) by CAEXCH02.caveonetworks.com (10.17.4.29) with Microsoft SMTP Server id 14.2.309.2; Mon, 16 Jan 2017 12:35:54 -0800 Received: from dut1171.mv.qlogic.com (localhost [127.0.0.1]) by dut1171.mv.qlogic.com (8.14.7/8.14.7) with ESMTP id v0GKZeTK029131; Mon, 16 Jan 2017 12:35:40 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id v0GKZeXX029130; Mon, 16 Jan 2017 12:35:40 -0800 From: Himanshu Madhani To: , , , CC: , , Subject: [PATCH v2 09/12] qla2xxx: Add Dual mode support in the driver Date: Mon, 16 Jan 2017 12:35:21 -0800 Message-ID: <1484598924-29066-10-git-send-email-himanshu.madhani@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1484598924-29066-1-git-send-email-himanshu.madhani@cavium.com> References: <1484598924-29066-1-git-send-email-himanshu.madhani@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(39450400003)(2980300002)(428002)(199003)(189002)(5003940100001)(92566002)(107886002)(5001770100001)(48376002)(626004)(189998001)(50466002)(6666003)(4720700003)(2950100002)(5660300001)(76176999)(50986999)(42186005)(20001)(356003)(81166006)(8676002)(81156014)(8936002)(101416001)(50226002)(36756003)(106466001)(305945005)(69596002)(105586002)(80596001)(47776003)(33646002)(2201001)(39060400001)(38730400001)(86362001)(4326007)(54906002)(2906002)(4001430100002)(87636001); DIR:OUT; SFP:1101; SCL:1; SRVR:CO1PR07MB208; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; PTR:50-232-66-26-static.hfc.comcastbusiness.net; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD016; 1:hSLjgQUdOW17jYVDxIsVbs3FMkPR2eZBGFE20ryrvqoL6CrgZ5wZNLpeiHTtRGRGxhU0/ZeNIe9RdTpG0pimTWEScd7fmBeB1ILEK0FBqnQYXNITm+m0vOYMBoHS6a6Zs1GSWNJgPI0MWQv8CT3ei7hP6LL4uUvY67kqKW4gqJU5kH5OXQzCivaex8T9MpHk6WCrtGOI26YnGmvWcAhlA8yH5BR1HV9gD+20OJnhHuCa4ShGbkdgVzDVVC0kZxU4i4IOaqIheLyAaQV/6iiTPgVTif5VZE9iK33mbVbsqlVHBi/9TR2fOLHhBELkUmsFQRzlLinSyKqHk4BsLMMo5EvZXGp0VG4x6fHZUPn9DbvFscZPEbzlOciWNwWry7AG0PZdM0JrawfhCm94QckO6zr3gWc/uxrdS+0ivy7Dv6wVx7KwguQI/JhpS5tHXn3PXr/Y/WyhXSZarXtRfM9gHIpX5LPJS/kZ82F49yAyCgo4dOtTCEFnpNVRn4UWVrBpZ43+h60g151NPlo7MvoW2w== X-MS-Office365-Filtering-Correlation-Id: d186368e-03ee-41ea-b7c4-08d43e4f5852 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CO1PR07MB208; X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 3:Cuec2kFTX9+4dZadoE8iQfCBfhWwuFWG5GH66T47OYf+NTwR9Tcir3g2tfi1Bh5ic/ODFppx0wjy96W/Ct3xy53e3YgzPgwpGC3+YBa/FD4jZFFXjx9cHr5NbZkrhag0g7rhxeZVfUAFhdA4DYXDSTVq6w5fjLxCJSCtu948gcEvdVqRaabtLl3VWEruNV66K9AMHeOpplQrjjQndfmmyMjjD1EhrBULQBLCdMioclJdSoOgInblui7Q5toIJFTCU2LByjjb75iHB0zchYgLknfhYBsAI/opPduM7DhM6WZGsXHnh5I4YQgEnLnE+uFxhD5Hp3Hn7rK+aHfKEvTn9bwk4aT4P72dgkwBG2eC/nTqG++8WrhWFQ3FES3P7MR2; 25:pTzyHTX+BNtB9R7XqYx3b9/r81bzO37NYUwLbPnIBQXEJuzrh3JfZtv1rO3TnyQ7Wj3wpWTkNCO3kXBI/+bwwJ6yxCdyDXRORA4ytDkTdgfmr/hIkmCdKIZ74hK9gXFdsYzEbkV/T3oa1JiwOB7RWOh3Can/NcsW+DUCwf9c8pNzsQiv2g0MiglwsIhmPbhZ3E41hVS0MfZwnH7aUZkye6PI8p6PSVJ9U3nQhkA+BqiG5qBPMZ+CDekZMO10bLqBFl2TVncV3XMhSBrgOyVVadJ7tlYHJWc9HtW7fk4Ql3uCCteHCfIOmw4ZIsF7Yl+9RRfNjhN5tIQA3S6OGHP1OExVqTwu5dELdxwEF8Dj3t8l7m0+K6xiAZi2R7IK167wov5aTybwI+0lImc8xHWaV6RMzvMdLYBoQwDF928RwJ1XVuyKxwparza6E7busQ7hJmlNLvJ6+TcGE9WO0vCEsw== X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 31:DEwFE3wbIvNC0ST1rADDXuTGMjdLYYW1UzxKG45aLErifjBqfHjOIX/T06cvZe4vh1dT/IE6D11YpC+aHd02b7WR+kSupCK4JM9kTG5kBe7Ul0SK5M9MsZwFdWmFA6ikwqx6GrtnH0WcFPYOsfkHVHgUvHtEY3yenUTmrqZd6AtjMPwfYWqyKm8A+mPtzQUw3FDZ/4BBo4zx/GEg7U+nW1JZZGbV3+ao/P5NH9hEWj7sRl7qww9/CjPen+ICf4TtPgIC+tyhge1hpARWWKG08w==; 20:i0IHaf6wBCTIZFoU8Ld5+GlVM0YZNce5c5z/mZzhApn8nRJwNZORpWyj4VGFKloWU7jCDAJ+RMZSuvmhkgTT38O3QVm9xN/2EsZWgrzUGyEBYOonaEYzAVwyDm4oJvCv6Uiia+w+/tlAG6J3XH6+Gfg19pnIIWHYUdXx1HUSnMwQtAYHhNkEedAmizQt2e49k99tPM1OFVbBFnbA0f2f9U7SSyITQBeUPrjcxyJ2dKz2BkiUanz4tLIpTOPCuCbMKYoOS8NKyBKLJUF7kwfAaYMvgnVkZpNPb1SoVBrB8jqysTpt+9gFd66KL8EkLgZhxDQDLzR3dZUoXe5wCutZqVkTCTmMzwOy10kl9zoeRcnKpLa4cbMEV2CQbm9/cu/MeYu9+uez8s8jA73ON5ePp2ZyJrzajirPcNKh4UoJjr6JGsGSoHSQ68eNTSp4axfVXkaKi5GcXsVArzgrwk/81E9txjfvXpTkLo0rwirwlb7m5gmW8wxkJl1NHC3T8TyA X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13023025)(13017025)(13015025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123562025)(20161123555025)(20161123564025)(20161123560025)(6072148); SRVR:CO1PR07MB208; BCL:0; PCL:0; RULEID:; SRVR:CO1PR07MB208; X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 4:KH6Vrr5peHhPxZGrAQPtweZl0YTD8ab+08xI9chHnrSHy0EXbNIsyXPSM1EkpF4lac2K3Qu3VNZO7Ccpe7v9TLnx1VZ2hXAWSH6bMO4l71jRWgSSXM0pnjiaSJaSVjbQZHuT2mwykLU+KCEBqOw+EbDdeyfGE7Z7ehVQ7/v7eRFTXyXN8DlH+dLFlVV1krgeapcETH2ABxw1oeNyO4HLyocGid6rg5r65X+Tigu46GZn4pJEWWz+zDQvIPkQi1CAhAdpAM91DxWtqz9JTgB0E/GMzfMk60FMQVNNQjb8mBqAcFxaFlG+v9lqOaXdYP+rDaRgxa6ufUAEWaghtabttXx3MS6VacGzMqlM97hc/jXTEsp98+DgPTV/HRM/2EKYpTOeQAVLdftVsZzdmayI+BB9g0/rdfVK2qWvGsXK0HKYyg1duvXcmCcAIGPgQKHLry6/3QT5zpj3pNZSb3fPeXqZH13Rn8aJ70p7tfWtMB9zfEOYjrGlUIHYSxnVNTl7HSxrHHqs1xzVA+sXEvK8lw1QzST6pBVD9snvgVEM+vYe5LmgYzc1T0tvkSQrQ68IZ/RLeQcPxvG4cWZ+eiA0yVruYttDlGfi8mdrJfxo9c8MYM80kjFBNj76JA2w1hZMJ/OauYjICJ788Us0dRpwjAT7yHZqj1XfaG7LO9kncZ8= X-Forefront-PRVS: 01894AD3B8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CO1PR07MB208; 23:vTTqx8CMGvuExpQZlBHXBwbkBW2tTqe0jPcAuLCSGK?= =?us-ascii?Q?GU23hVQ5PhFUHu4sLFSSVMQI89KZ+V/clGbQvTksCwwesAQJHFr9J7A4RYJe?= =?us-ascii?Q?pq8mW6zjkd8e2HpXzwUgo1mEuGL8C66AMFfzt590PX5pXjFD5OrbfIzMxsf8?= =?us-ascii?Q?QM1OXXsb/0IWsPhzMIs9/LnJ3YbazD1G55dj8lxF29SlqF2+OpQFtIE51NQx?= =?us-ascii?Q?/aX6u3DNQ9gX8JJ80Lzlm1TVx6yYJ6xZLSZky01eMXvQjuUwloDGQr/jaiFE?= =?us-ascii?Q?L3Piw6g+GAh5OVxGRS/MChclmVU2ujfTtwXgubIEuV1S03zxk0EyEgDaSuB0?= =?us-ascii?Q?YdwbLy7aFz8TQtHRPUaQgh1rYaMrp1FldY2fRZQtHeS7OjyUSSx+IY+EdWnD?= =?us-ascii?Q?Lt1wADWYds6pX7LEKGN53uavjr2HJjbtJfxSISdgsIokV7Q40XuAeACZPqMQ?= =?us-ascii?Q?dFgD5WBsHLu4+oBEp7XA485d6QNBgkVgCOdqWr4Y99APXVIY9PBICQXthRYP?= =?us-ascii?Q?iUa8GBT7J+tuV2v8xRTxud5YnQ17r2YhpSsaZ38Eyy0HzabnNwvhiiUTi7h3?= =?us-ascii?Q?kks0W1jZpP18qyv88QB2auE5sRUV497vKg0AdWDCpFAX0Z3zeCwihuJc8ixU?= =?us-ascii?Q?ZV3VsA6c6rXPNhFq7Q/2J7Yn4K+q8LIoWjkZvLdpqnhcLgfqiiNhZMYWV0nF?= =?us-ascii?Q?EIo18jWtwkYNcmav7iVL0FApYFt3UEbhqCJn6XiHnO3MWepLyvfj0cC9IDyi?= =?us-ascii?Q?zQ7oPoFBauNfqmxjXGcVUDZvMtgCeW1fSl82BLcEHHwas34yhFBJ/8EawhAo?= =?us-ascii?Q?0r8mRMyx/y1uAQdcugO7eamrl6XlgLQp6sUhTxNDszN+Mezzx24Id+kb5bQ9?= =?us-ascii?Q?+ZAFvl8E/1RS5UQXqqgicgfrahdkWzrw68VXpLjjjERIloLq8fn9FcqasLEM?= =?us-ascii?Q?6MT2rqn7H3OhPEPI0EdzEsDy0BIf7UWPp5nNElSZ87fndqNBiFEe4o9q50vK?= =?us-ascii?Q?819cVLpkJQktY4bsh5o55gNL75aBIzoB7BT60GWd51182svfAkHfmIsW4Fc5?= =?us-ascii?Q?SlMmMG61lhoM/hSeM32mwfl3OxU4pj6yc2f13Tg4YvOMYRhF2Ogi7+wNNBQC?= =?us-ascii?Q?bFpJvsKpbB1k4+zZgJfWII/VB7VeBA5/OSUsWY58FTDtAGuG8yyQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 6:LHzFmrfP9nluz8FDBtw6yM7O6EuPLJ7bJdpVJvm+QCGzpqc3R2oTxYDpDO7dColQn9kMsowlHceiftHJerQU8G+l/aqywJssacXUb+sCS/n2rWDwhUjYGj+C+gviFYK0zhZRgu9IzNvTuv3FpB9BYf4Mrfj9EhnyHjcPAkp5gYQevh4SVOYDmqH/eCBUhewiE9MqHf2U+IEfDloyDfVtyFpz1+4AKkq6y8Ileov5mcxgrZdQNQ+v0cdUU9cAN98O9ZdpIy0NGmU08jDV5GVm2YAoddkLvmdokFe2FNZjiPMVa3ny6RmfSaLGS275lAjCr4phyBqiYwa/uzwTBdwKKiTOnz4YYymkVm2ROGkJW6ur4hUFqJO5I4vK1IdlRdfT6VExocBZBThxgc037/Zpz+6ER8DIh58IsGi2doAdEOk=; 5:NiHHQUh7nl5kU2KAk4iBVFKDe4jyHwULKrdVY6Kj8Z2Lss/aBKNtJmDoQChFIJNR1Lxdg+x0uxAkieC6ccwwYMV9qXQE2Waf/DQAFotZoiSz//ZHorm1b3m/dvGLf9T/YAalYDoanwruCkYtbBZxm4KLjXvH3OmKqcDlK8Wtlks=; 24:e7AgA6qEQGx1pt8myNUhaucqQcd/ziKM6VPHLMuCzbrdoXSsR7foX8EH1JQ5J5eAsMdpo4pQk7API2N5l7ztyvuUWXTGqjCBXhI8zFxUOOU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 7:bKT6S9rk8/KPjULhgTdssLzZ93J2G/M4OlTLq5XLOmFBQCe2IR4lnOpknJAlYgU0sRKyg4Zyef8LzczKc7Tq7qtluGwYzjdMDBl9tapXnUog2/b4PyTu/Jn0NlwektJfwPmuEUD6sR8uAfMVNcJatrotit5DGyCVPZeABwB5SFcA6s1vKDjU2Ng5/QFKreY2MsnS0Jw0ULcPcGk9cwSsTQGiVCIwWDm5MKeDqatP/QGlCafd7d4dRVVrfgt1UACA7XjFayOSFMR/aAfQxn6GaA7P/Hqng6z6GFxrqZfCKp2Om7ydqkmzqafIvERzqoAVeXl7j1qaPO9D11paCgj6yZ/qXWzU8KEfGFIiUUcxaFIivFmAO42G1Bo/die6QkXiL3eSMWk3TeLWT3hCezIEI5dVnHz0efFbFYwNVRnFXgtCcCZW1T4Opr4i7iO8brvKUr9b+hcPXhOTHT+1lh36dQ== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2017 20:36:26.7649 (UTC) X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=711e4ccf-2e9b-4bcf-a551-4094005b6194; Ip=[50.232.66.26]; Helo=[CAEXCH02.caveonetworks.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR07MB208 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Quinn Tran Add switch to allow both Initiator Mode & Target mode to operate at the same time. Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani --- drivers/scsi/qla2xxx/qla_def.h | 1 + drivers/scsi/qla2xxx/qla_init.c | 6 +- drivers/scsi/qla2xxx/qla_isr.c | 19 ++++++- drivers/scsi/qla2xxx/qla_target.c | 110 +++++++++++++++++++++++++++++++------ drivers/scsi/qla2xxx/qla_target.h | 3 + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 +- 6 files changed, 119 insertions(+), 22 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 253f991..fd179df 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -3390,6 +3390,7 @@ struct qla_hw_data { #define FLOGI_SP_SUPPORT BIT_13 uint8_t port_no; /* Physical port of adapter */ + uint8_t exch_starvation; /* Timeout timers. */ uint8_t loop_down_abort_time; /* port down timer */ diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 705f3db..a4e92c7 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1571,8 +1571,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, } } - if (qla_ini_mode_enabled(vha) || - qla_dual_mode_enabled(vha)) + if (qla_ini_mode_enabled(vha) || qla_dual_mode_enabled(vha)) rval = qla2x00_init_rings(vha); ha->flags.chip_reset_done = 1; @@ -3997,7 +3996,8 @@ static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t *vha, nvram_t *nv) * Process any ATIO queue entries that came in * while we weren't online. */ - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || + qla_dual_mode_enabled(vha)) { if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) { spin_lock_irqsave(&ha->tgt.atio_lock, flags); diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 99088ff..62066af 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -1029,7 +1029,8 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, qla2x00_mark_all_devices_lost(vha, 1); - if (vha->vp_idx == 0 && !qla_ini_mode_enabled(vha)) + if (vha->vp_idx == 0 && + (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha))) set_bit(SCR_PENDING, &vha->dpc_flags); set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); @@ -1642,6 +1643,7 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, fcport->d_id.b.area, fcport->d_id.b.al_pa, le32_to_cpu(logio->io_parameter[0])); + vha->hw->exch_starvation = 0; data[0] = MBS_COMMAND_COMPLETE; if (sp->type != SRB_LOGIN_CMD) goto logio_done; @@ -1677,6 +1679,21 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, case LSC_SCODE_NPORT_USED: data[0] = MBS_LOOP_ID_USED; break; + case LSC_SCODE_NOXCB: + vha->hw->exch_starvation++; + if (vha->hw->exch_starvation > 5) { + ql_log(ql_log_warn, vha, 0xffff, + "Exchange starvation. Resetting RISC\n"); + + vha->hw->exch_starvation = 0; + + if (IS_P3P_TYPE(vha->hw)) + set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); + else + set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + } + /* drop through */ default: data[0] = MBS_COMMAND_ERROR; break; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 8dcbc36..94bea80 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -55,8 +55,17 @@ "disabled on enabling target mode and then on disabling target mode " "enabled back; " "\"disabled\" - initiator mode will never be enabled; " + "\"dual\" - Initiator Modes will be enabled. Target Mode can be activated " + "when ready " "\"enabled\" (default) - initiator mode will always stay enabled."); +static int ql_dm_tgt_ex_pct = 50; +module_param(ql_dm_tgt_ex_pct, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(ql_dm_tgt_ex_pct, + "For Dual Mode (qlini_mode=dual), this parameter determines " + "the percentage of exchanges/cmds FW will allocate resources " + "for Target mode."); + int ql2x_ini_mode = QLA2XXX_INI_MODE_EXCLUSIVE; static int temp_sam_status = SAM_STAT_BUSY; @@ -1295,7 +1304,8 @@ int qlt_stop_phase1(struct qla_tgt *tgt) wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); /* Big hammer */ - if (!ha->flags.host_shutting_down && qla_tgt_mode_enabled(vha)) + if (!ha->flags.host_shutting_down && + (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha))) qlt_disable_vha(vha); /* Wait for sessions to clear out (just in case) */ @@ -5264,6 +5274,32 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); break; + case MBA_REJECTED_FCP_CMD: + ql_dbg(ql_dbg_tgt_mgt, vha, 0xffff, + "qla_target(%d): Async event LS_REJECT occurred " + "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, + le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), + le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); + + if (le16_to_cpu(mailbox[3]) == 1) { + /* exchange starvation. */ + vha->hw->exch_starvation++; + if (vha->hw->exch_starvation > 5) { + ql_log(ql_log_warn, vha, 0xffff, + "Exchange starvation-. Resetting RISC\n"); + + vha->hw->exch_starvation = 0; + if (IS_P3P_TYPE(vha->hw)) + set_bit(FCOE_CTX_RESET_NEEDED, + &vha->dpc_flags); + else + set_bit(ISP_ABORT_NEEDED, + &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + } + } + break; + case MBA_PORT_UPDATE: ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03d, "qla_target(%d): Port update async event %#x " @@ -5273,10 +5309,11 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); login_code = le16_to_cpu(mailbox[2]); - if (login_code == 0x4) + if (login_code == 0x4) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03e, "Async MB 2: Got PLOGI Complete\n"); - else if (login_code == 0x7) + vha->hw->exch_starvation = 0; + } else if (login_code == 0x7) ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03f, "Async MB 2: Port Logged Out\n"); break; @@ -5827,7 +5864,10 @@ static void qlt_set_mode(struct scsi_qla_host *vha) vha->host->active_mode = MODE_TARGET; break; case QLA2XXX_INI_MODE_ENABLED: - vha->host->active_mode |= MODE_TARGET; + vha->host->active_mode = MODE_UNKNOWN; + break; + case QLA2XXX_INI_MODE_DUAL: + vha->host->active_mode = MODE_DUAL; break; default: break; @@ -5850,8 +5890,8 @@ static void qlt_clear_mode(struct scsi_qla_host *vha) vha->host->active_mode = MODE_INITIATOR; break; case QLA2XXX_INI_MODE_ENABLED: - vha->host->active_mode &= ~MODE_TARGET; - vha->host->active_mode |= MODE_INITIATOR; + case QLA2XXX_INI_MODE_DUAL: + vha->host->active_mode = MODE_INITIATOR; break; default: break; @@ -5946,9 +5986,6 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) void qlt_vport_create(struct scsi_qla_host *vha, struct qla_hw_data *ha) { - if (!qla_tgt_mode_enabled(vha)) - return; - vha->vha_tgt.qla_tgt = NULL; mutex_init(&vha->vha_tgt.tgt_mutex); @@ -5979,7 +6016,6 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ct_req->req.rff_id.fc4_feature = BIT_1; } else if (qla_dual_mode_enabled(vha)) ct_req->req.rff_id.fc4_feature = BIT_0 | BIT_1; - } /* @@ -5998,7 +6034,7 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) uint16_t cnt; struct atio_from_isp *pkt = (struct atio_from_isp *)ha->tgt.atio_ring; - if (!qla_tgt_mode_enabled(vha)) + if (qla_ini_mode_enabled(vha)) return; for (cnt = 0; cnt < ha->tgt.atio_q_length; cnt++) { @@ -6091,8 +6127,10 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_24xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_24xx *nv) { struct qla_hw_data *ha = vha->hw; + u32 tmp; + u16 t; - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { if (!ha->tgt.saved_set) { /* We save only once */ ha->tgt.saved_exchange_count = nv->exchange_count; @@ -6105,7 +6143,24 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ha->tgt.saved_set = 1; } - nv->exchange_count = cpu_to_le16(0xFFFF); + if (qla_tgt_mode_enabled(vha)) { + nv->exchange_count = cpu_to_le16(0xFFFF); + } else { /* dual */ + if (ql_dm_tgt_ex_pct > 100) { + ql_dm_tgt_ex_pct = 50; + } else if (ql_dm_tgt_ex_pct == 100) { + /* leave some for FW */ + ql_dm_tgt_ex_pct = 95; + } + + tmp = ha->orig_fw_xcb_count * ql_dm_tgt_ex_pct; + tmp = tmp/100; + if (tmp > 0xffff) + tmp = 0xffff; + + t = tmp & 0xffff; + nv->exchange_count = cpu_to_le16(t); + } /* Enable target mode */ nv->firmware_options_1 |= cpu_to_le32(BIT_4); @@ -6190,11 +6245,13 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_81xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_81xx *nv) { struct qla_hw_data *ha = vha->hw; + u32 tmp; + u16 t; if (!QLA_TGT_MODE_ENABLED()) return; - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { if (!ha->tgt.saved_set) { /* We save only once */ ha->tgt.saved_exchange_count = nv->exchange_count; @@ -6207,7 +6264,23 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ha->tgt.saved_set = 1; } - nv->exchange_count = cpu_to_le16(0xFFFF); + if (qla_tgt_mode_enabled(vha)) { + nv->exchange_count = cpu_to_le16(0xFFFF); + } else { /* dual */ + if (ql_dm_tgt_ex_pct > 100) { + ql_dm_tgt_ex_pct = 50; + } else if (ql_dm_tgt_ex_pct == 100) { + /* leave some for FW */ + ql_dm_tgt_ex_pct = 95; + } + + tmp = ha->orig_fw_xcb_count * ql_dm_tgt_ex_pct; + tmp = tmp/100; + if (tmp > 0xffff) + tmp = 0xffff; + t = tmp & 0xffff; + nv->exchange_count = cpu_to_le16(t); + } /* Enable target mode */ nv->firmware_options_1 |= cpu_to_le32(BIT_4); @@ -6317,10 +6390,11 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_modify_vp_config(struct scsi_qla_host *vha, struct vp_config_entry_24xx *vpmod) { - if (qla_tgt_mode_enabled(vha)) + /* enable target mode. Bit5 = 1 => disable */ + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) vpmod->options_idx1 &= ~BIT_5; - /* Disable ini mode, if requested. */ + /* Disable ini mode, if requested. bit4 = 1 => disable */ if (qla_tgt_mode_enabled(vha)) vpmod->options_idx1 &= ~BIT_4; } @@ -6475,6 +6549,8 @@ static int __init qlt_parse_ini_mode(void) ql2x_ini_mode = QLA2XXX_INI_MODE_DISABLED; else if (strcasecmp(qlini_mode, QLA2XXX_INI_MODE_STR_ENABLED) == 0) ql2x_ini_mode = QLA2XXX_INI_MODE_ENABLED; + else if (strcasecmp(qlini_mode, QLA2XXX_INI_MODE_STR_DUAL) == 0) + ql2x_ini_mode = QLA2XXX_INI_MODE_DUAL; else return false; diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 5e56192..ac86b37 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h @@ -45,10 +45,12 @@ #define QLA2XXX_INI_MODE_STR_EXCLUSIVE "exclusive" #define QLA2XXX_INI_MODE_STR_DISABLED "disabled" #define QLA2XXX_INI_MODE_STR_ENABLED "enabled" +#define QLA2XXX_INI_MODE_STR_DUAL "dual" #define QLA2XXX_INI_MODE_EXCLUSIVE 0 #define QLA2XXX_INI_MODE_DISABLED 1 #define QLA2XXX_INI_MODE_ENABLED 2 +#define QLA2XXX_INI_MODE_DUAL 3 #define QLA2XXX_COMMAND_COUNT_INIT 250 #define QLA2XXX_IMMED_NOTIFY_COUNT_INIT 250 @@ -975,6 +977,7 @@ extern int qlt_lport_register(void *, u64, u64, u64, * is not set. Right now, ha value is ignored. */ #define QLA_TGT_MODE_ENABLED() (ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED) + extern int ql2x_ini_mode; static inline bool qla_tgt_mode_enabled(struct scsi_qla_host *ha) diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index e37d7ee..8b878a2 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c @@ -1744,7 +1744,7 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr; struct fc_vport_identifiers vport_id; - if (!qla_tgt_mode_enabled(base_vha)) { + if (qla_ini_mode_enabled(base_vha)) { pr_err("qla2xxx base_vha not enabled for target mode\n"); return -EPERM; }