From patchwork Wed Jan 18 23:19:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 9524951 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 1CAD06043A for ; Wed, 18 Jan 2017 23:20:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0D2232863D for ; Wed, 18 Jan 2017 23:20:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F385A28633; Wed, 18 Jan 2017 23:20:37 +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 E0A5B28633 for ; Wed, 18 Jan 2017 23:20:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751449AbdARXUe (ORCPT ); Wed, 18 Jan 2017 18:20:34 -0500 Received: from mail-dm3nam03on0070.outbound.protection.outlook.com ([104.47.41.70]:47780 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751432AbdARXU1 (ORCPT ); Wed, 18 Jan 2017 18:20:27 -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=zdS0lka7u4TBzpy3bbN0yoyiPvCcEXTEL14bhqmVC/U=; b=YjQ0D0fZkC3epjoOjBfWvUoJzSoJH7TxEFW3/9I5crT+aWDpIvivLGEObpIwpfk77gK9eMv+W7qFSNiKnb39n66A4awhMXRh7cEOJh1+BacmIUIvAenXognGoE0Ptist5UX7e1esPeN8vlocyI2ZrRY8f2jsAO/wH70X6UteZo8= Received: from MWHPR07CA0045.namprd07.prod.outlook.com (10.169.230.31) by CY1PR0701MB2092.namprd07.prod.outlook.com (10.163.142.154) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Wed, 18 Jan 2017 23:20:25 +0000 Received: from BN1BFFO11FD002.protection.gbl (2a01:111:f400:7c10::1:138) by MWHPR07CA0045.outlook.office365.com (2603:10b6:300:1c::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13 via Frontend Transport; Wed, 18 Jan 2017 23:20:25 +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 BN1BFFO11FD002.mail.protection.outlook.com (10.58.144.65) 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; Wed, 18 Jan 2017 23:20:24 +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; Wed, 18 Jan 2017 15:20:15 -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 v0INK29A027419; Wed, 18 Jan 2017 15:20:02 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id v0INK2AW027418; Wed, 18 Jan 2017 15:20:02 -0800 From: Himanshu Madhani To: , , , CC: , , Subject: [PATCH v3 09/12] qla2xxx: Add Dual mode support in the driver Date: Wed, 18 Jan 2017 15:19:42 -0800 Message-ID: <1484781585-27252-10-git-send-email-himanshu.madhani@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1484781585-27252-1-git-send-email-himanshu.madhani@cavium.com> References: <1484781585-27252-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)(189002)(199003)(92566002)(5003940100001)(47776003)(101416001)(107886002)(626004)(50986999)(76176999)(50226002)(8936002)(5001770100001)(189998001)(81166006)(81156014)(8676002)(33646002)(48376002)(106466001)(50466002)(105586002)(356003)(305945005)(2201001)(42186005)(86362001)(69596002)(6666003)(4001430100002)(54906002)(38730400001)(2906002)(2950100002)(39060400001)(80596001)(36756003)(4326007)(4720700003)(5660300001)(87636001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB2092; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; PTR:50-232-66-26-static.hfc.comcastbusiness.net; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD002; 1:XO+IIrQ99Z5m4v/nxAGeNwgc6jR4P5BNtCaYengEMbABMDI2mTPyFtkc3Fsob6Ntpax0czP3B4HhEO1drprhlOaHDjKFdmNfhiIndK3/eFAefsV96OghMLl+bXw0Vv3CW/wimzCnnEZwUdm5b3vgTPgO0vdcpyMQ8TBAaXhfv5jgIV3Yx2NnoUZMcJH2RrMWcJMtUqZVJoe9d8nreId8Y0+Vha9rLUl9B+nvQWxu+1KVCX3nTjTUPFouTS8wIOT2bX3x6sZlreACxHi+dwzZQoHDKU/naVLXi8cDDWYeXz4niKv/8ilrYbedU7bPzdpj5lWpk6JXyK+/UoY1uaq94fq4+eW+Q93eE5JYg0IqZkCbodg7aBQdLINHjFP4BOIImC+138OUL1YNq4Mm0/YTKzc9PLC1THNI2mbf3OXYlLjp8zPzHsn3gDKqXTIQFzttKonaR+3Und9BQ3GeCsF638YPt0BEdw18zEtKdAmKj/RGEdrGO2wPNLVI3gS9Rhepreypyp8W7tmNGWe53BRsVg== X-MS-Office365-Filtering-Correlation-Id: 3d894c0d-ace0-4b9d-72a8-08d43ff894ab X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CY1PR0701MB2092; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2092; 3:0KD6Fo+NkCvsBnUUswmGvjWhNxL2wVIEI+PL3SSvJrw4n4FnnsDDnSRpPkD3USagMwSrBvSia1cfZtxFvs7h5sODLZCeZSfKhMHC3GLnkIx9HCxaeNr7Qb0vj42qJtKmC2HKSl4Y4rcJWX3yzbpboOUTXR9yELydYFnX3cSXFmqT4pZFpk9c3N73oLh+/FDIqvZcNy2ifl9laxHqrFw4krWp2MRMII+uKUGkpf3XWcAva4jeE3mqQkQdI8eWdO4awzZ7Bmye50cfPLLAq83ZVQJiKWaK2G8g3m8GexoDwfw2aP1aNa7kmnOgi9TzL2RBM/CuVv7YfW4WrMgsdPnE8V6f7YkeTMISqsgiq00/7QS60JaAxlED1g02H/jj/qTI; 25:ZwkbcbsSqOVXBwr+N+RmF6PYUGnTEQqlhnN9g/007wXZ8l0kVbC+5Kqnt9buxQuc6kUn/hzH2oEQtHsH1Uatq9LuIiLK6r+VE454aeFXIQopixIF9f4mMRhMsvJCbXkQezmTBQKQ8L6MIqfzZUFTkaoeHGKlF2RTnDFUehM+ZTf+N7CZ799ypabtssT0yrjzGZUsFXAAdzobBpCzOIBED70X7HN/jd5+RlbtY0I/yQ0duYKKIMY0NrySUuFN+JgBx8vCpAv3eXUPHcO7I8rBUq6Qvq5l3wlbjvCZmuUYsdgwWmKaSROxCPiM8SA6Le7AEWX2jm+LpfCZGA0FaeWdr5F8i+zZt4SJUrZJKYb3fYOIrXuey8kTdnUHGgOzEo5ovFWFWCsH/EDbHVFgf1192H7IbGrlyXdPB4mvHrERBm3f/FGjnHwyoBtVOBfkh1vxdX9MjgHpZsO6QFeexSBA3Q== X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2092; 31:kUZuOBOWpMf+auaLYHVadCOanDVVsYPnQD3g6b+sFe7dYqy+/tMt+3wF2W922KhtWJ+i5JxucNlCuiy6w26pOuWz7lsjhaSjJk0psUuG+D3xCYoUIiINtcDIwOuxdWD/hmSyV3scdN6Pc2rPlrwKC6r67IQTlRDf9nztKxbgLCcPh1S2D/2ZsdVCEkstkzAcHuRVwgpUNoiC4HvU6lrqv5U2Gfp1o69skO71zlVIcgNRNpX6faNg5uFEX0+PO1DkyVJcbq6yRDD4WRzD24cCXLZkk+oHYnT+s1lLMAqdHR0=; 20:G3w1biZZAB4GpkAzEITv+eDhpwRCjYzAdEvK/hw6gvXRn26qxG0j6kMwjrTP/pjY+8Xsw9TRnQilS9iqCXyGbjXqKhaWkI7wnU81HoUxAjJsUkEntPzsOnTKHaMz9m7BUA4Dx1HMawVAcMut+xpBX6N8/hSQMFhb5n29B5T22h3TE+EjC8tPHvi+jMEqsXhNzR6oim1+iYjMfdWl+jiu7pyXZxu2qHUB04nVOar8Ta8Vols2X5WTbJd2GUHyHQ6IHveETro9EIINelSOzVftGM/3jzQOqmnl9kMDbot99Tk8qLnEj2J7xjw6SFxehuRcDFZRToZDBfiL+6pgHknjGRsPqMekwOsSUxn1SZLQsDp68oCQBMaHMK1/3ARwOdQ82JthPO4Jv+mlL/5UqZUER9UQi+MqWadcuD3u1pqYWzctMBfO+rwhkfUNpu1qOUYQNxD97nJ3gsE9tF9AsG/HXoyGs2wa5SjE50Pl1yg2MHrd6J6wxauJqhzUxw5Z3NRq X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13015025)(13023025)(13024025)(13017025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123564025)(20161123562025)(20161123560025)(20161123555025)(6072148); SRVR:CY1PR0701MB2092; BCL:0; PCL:0; RULEID:; SRVR:CY1PR0701MB2092; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2092; 4:1FCL+JfZx+fqCt0CBdYmcZxJrQuI9Imf17NT+2bk/IyGaaea3sJnJTTN4MwSqS3Z5ayQ53ccPMA1IKmbGOJ1V0gMpGr/lPF3ARQrOYlnHGkhSCIX0evqcxc+LXsO4Srntq0nfyhiKLcepnPvar9sKdzXUjGFlHlab3XwCgayXSx6pTTWm6sV8KfcHp1yOT5M3MLAOxojijzZ45W751E/PJcv/X/RmBQer9tUXaJR2QryJjk+HbjV1ekd3qQpKDacAnDk3T7JpAlTxW2zAr0Q3MKFEFNdUT5t83Kdtg5rjvmibONG/eKDEMBGb0UeySQZ6gT9HPmYLsmzAcICJ+/lDCKdVl8oee4ui2pN3vBch0bgj+ePfozT22UB5GbIaSnuzTzD/H5fWDdtYHv5HZPLh4l2vdRFPHP9rq9TRM5/n7suSDvtjBeP1jOLdbrDWn3MnIpGDk06T+QPkmUggmCkfaugqLsuhY0KcmXiD26BSv2XLGUE4ds+DaEsOs/VR3rN9pwB6hQsBScxUEypG1PMLcvDrk7zep8sBzu/M5sTfoxqav+a34lzwSPFYQdtFJ/NysSBgeJTZXtJZho+0cuTERJpPykqOdWH8JvZ+g0CltDyJemJt2sFLZLRAEVJ9zYBYdrkhLd0cVsQ8io5K8Q1LbihVEAjKdyf4J0BHyDTX+g= X-Forefront-PRVS: 01917B1794 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB2092; 23:e7esGbcdX+B2fqTTLiE4UGs8zleD7CMuKolnCZa?= =?us-ascii?Q?2bFeOgnR0RAt085Hi/8dX2AGNLfAjVxJbgY9V4n1kR8WpZHJCQdjaZiHDN3X?= =?us-ascii?Q?1ntRgb81toh8D7kSMXlLSWcmFuNfestLktfqBJLjS3f3UTa7+3mww/vZw/QR?= =?us-ascii?Q?fdBCPz8sDIlOsBobRBvyqnNY43lscgAt1b0tIHJPu57tnz8n9uoE+EjLGr/a?= =?us-ascii?Q?T6rDZlgBMTVW0IPUnqxnLEHabFSaGPr70NZCz+uJeOrI/8KvF5L9ubnG+qaJ?= =?us-ascii?Q?W73Y6xgPhDANlQNDhY+gWgz9baxzTPxvbRERb/C/CKn8jlNpGFjfx0Z0w/GT?= =?us-ascii?Q?VhhFwEkoUjcdCvQeABhcPENuF9+emk1TZAXEUZPwgfr3ziVciPp6gB/Wnc5x?= =?us-ascii?Q?dK5Mp/Yv0p43xk8NG0Vqu420St/1Q4S7PvMyO+AEiii+cDZuua2c8ZAnXGka?= =?us-ascii?Q?fH+aOAdmSaAg2PVKkTqCQzwdb7g15PPTIu/XvFsZINbYW67wV3G8HwKhyr54?= =?us-ascii?Q?/30VeAqTnB/b+KS31VaWlhC3sFs1ByvnwVEFN34q9tKZznGarA3hdJcvCFGD?= =?us-ascii?Q?/WqzCrbl6PxNtt96lyrd6GEmal5DnRIL5EbsTZDhhxVXMjYDjFWk/TKhCmrj?= =?us-ascii?Q?EgNZ9HPR5dzP2oz/q0RPRMk60wJ8gadcw921/NSXFisvlK+JiKcfqWdZ71E9?= =?us-ascii?Q?CmS2K9XHCE9WnTm9Tlvvu5qd3zpADdYwGRjRc/dpoWP4W/13Fed/LDv7ohHF?= =?us-ascii?Q?1z7LClMIo7hvK68qSSDEtGmRfR2LY5ApdsTRhBv49MRBiUhUVGF6oLlKNRwF?= =?us-ascii?Q?VmxK0xhFSceSncAsAj4jBL+tR+ddUF/WzzL8J+Jklw5IoGvrMcNw5DZkFfc4?= =?us-ascii?Q?BGhpjco4u91dcvdcvdPwCUbNrrwANgBKFFfomqAxMmCXLIvJTyj4nwPwCn8T?= =?us-ascii?Q?YEl4MT/jSvGgv9EItGJmKgV4okZF5KswGkJ0YUMtgvD7J5TX3RXz9+EmZzWQ?= =?us-ascii?Q?105ajtp1wnYUS79/ld8SMsvvJ8IAvU6VDTpJlMs7lR8/Vd2c0Gq7FuG0E7Ut?= =?us-ascii?Q?ayXh74XZQW7isv7kaYJZ/iwPCTd8RgGx7hgTMlFLNQ2P1oMkD0VdGXZ5yX2z?= =?us-ascii?Q?b5wTEKvqlar3k01xUSn5le7JYXm23xhI3?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2092; 6:Qkr5UB3l7CtTtG6T3i2njXLWdeLdBfqzdrBjq+sWN08rBE1r9ufN9kCWzX2xAEs7YSKqXXrQ/27XgD11U7OpStgRG9RHX2037z2sG0sjMTmj0fgQHJ5cipKhTXtdChWGvDAxf788EHXvJclcduiQuIqG7noPuvl07AM73qvDvVvTqz7PYrYO4UrUDnW5hfNDaJx4zClUDZflE44WmzcuiuH/IToAsABbgd78dFkai89uGDWtPOZYKflQbKOqZVxAHLSkHmO7CSNoP+mq8tRF1rAXJEqmtUA2wXdb3UAOYjxae35V9MWwOLpaZcoove9sohcfGb+XIVBCLtYhFzRkXQ/Tp1yjGKY3M1AGk4UAX9VmyBTuLgD9pbb5y8dWaw6KmaLv4rItAYR/VBwlE6hMDdvsacIREuk29d2k+v0p1ac=; 5:J+4vqxqf/nFKpYkpcZQrT3tegcFRgwFbuRq4r2knP+MWXPWB/kdz0PMICy/bT6SmojFRLKLvSOMTf51ujhiz6cSoGV7dq2dZXoaiGlut625xPKwt82Ox4PVnyy9+eJzcvW7ZMRyXLAQCF9d678hbHS/tHKbuaF0R+jRQzcTIwsQ=; 24:0Aw7rVI/tnxotWCqT9z142v/lZiGStQASGIAj+8TAKfdtv/ewxHcSA3yAjz7AmO84r1uCFZ4wdPlQzZO/pTkBAOaAxO6z8gTxOFsie3X+NA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB2092; 7:wWt+U6H26P1mBdQ3lzX4PkKsbqFICgSbeyPaEbMTel6WTpOAAYYGwVbHbQfZWGkDWrVif1SEubaihcNrwHd97hlugSyvScwgbJRCUC9cWBUYTnD3wndOsGaV6DxRSGctuBDtJtfhSENoYTIwseQmIQPZN5jrk/rfe2qWjLCDfXsUuZSY1ToblDHAHP8A4qNl8+G7LNFStTSEtK47STw4+N5NxOjqNLeD7BqPW1qj3YKkos27BCW/D6AuWHHs167Szc5bh88nRNXsvL4oxYIYrBfcOp5gx5rembVNXswUd56RW4Jq/OYooulv4/DT4yeGPvSSIJsjVrQEIyU5sLPGjwmUxBYWezXH3pU+bBm9/X0H8ZVAg8djqqKXBUC0lK3BNFM+RXkNuj+cnTMfJ0hbMofdl/BzE3yWVWl5blI5ULnNi89CmoQ5mv+oEqx6+TfQ0fhk/QS4jzmMkbxeGYFF5w== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2017 23:20:24.1353 (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: CY1PR0701MB2092 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 e628107..2e9142d 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1568,8 +1568,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; @@ -3994,7 +3993,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 b5cfab0..225d2bf 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) */ @@ -5263,6 +5273,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 " @@ -5272,10 +5308,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; @@ -5826,7 +5863,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; @@ -5849,8 +5889,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; @@ -5945,9 +5985,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); @@ -5978,7 +6015,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; - } /* @@ -5997,7 +6033,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++) { @@ -6090,8 +6126,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; @@ -6104,7 +6142,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); @@ -6189,11 +6244,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; @@ -6206,7 +6263,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); @@ -6316,10 +6389,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; } @@ -6474,6 +6548,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; }