From patchwork Wed Mar 21 06:09:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 10298619 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 4C279600F6 for ; Wed, 21 Mar 2018 06:10:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3BB0D29716 for ; Wed, 21 Mar 2018 06:10:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 308E62971E; Wed, 21 Mar 2018 06:10:01 +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.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI 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 47E1129716 for ; Wed, 21 Mar 2018 06:09:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751526AbeCUGJ5 (ORCPT ); Wed, 21 Mar 2018 02:09:57 -0400 Received: from mail-by2nam03on0074.outbound.protection.outlook.com ([104.47.42.74]:11344 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751455AbeCUGJx (ORCPT ); Wed, 21 Mar 2018 02:09:53 -0400 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=wvMip7oosl4gT/UL9yUmIFk2KdoAjWK7aW5Ydhp/PB0=; b=F4+pgC1vGmyQHMMRgp+1vDcYmzbCjeZ8PYo44nUClf8Zl4mNK7tPr01qqVPu8raQQp5WejaCycFE6kAmfcSK+F8NfpTY/kjei5F1vFntATe9nRIBuElT4zl+xbOuQ7T4To2tTtfHifH6V7tesGSOV2QPEhgSaMc6FjRrzQvo9OQ= Received: from SN1PR0701CA0017.namprd07.prod.outlook.com (2a01:111:e400:5173::27) by SN6PR07MB4221.namprd07.prod.outlook.com (2603:10b6:805:62::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.588.14; Wed, 21 Mar 2018 06:09:51 +0000 Received: from BL2FFO11FD022.protection.gbl (2a01:111:f400:7c09::186) by SN1PR0701CA0017.outlook.office365.com (2a01:111:e400:5173::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.609.10 via Frontend Transport; Wed, 21 Mar 2018 06:09:51 +0000 Authentication-Results: spf=fail (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=cavium.com; Received-SPF: Fail (protection.outlook.com: domain of cavium.com does not designate 50.232.66.26 as permitted sender) receiver=protection.outlook.com; client-ip=50.232.66.26; helo=CAEXCH02.caveonetworks.com; Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BL2FFO11FD022.mail.protection.outlook.com (10.173.161.101) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.20.527.18 via Frontend Transport; Wed, 21 Mar 2018 06:09:51 +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.347.0; Tue, 20 Mar 2018 23:09:42 -0700 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 w2L69gfG029519; Tue, 20 Mar 2018 23:09:42 -0700 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id w2L69ggS029518; Tue, 20 Mar 2018 23:09:42 -0700 From: Himanshu Madhani To: , CC: , Subject: [PATCH v4 04/13] qla2xxx: Add changes for devloss timeout in driver Date: Tue, 20 Mar 2018 23:09:32 -0700 Message-ID: <20180321060941.29468-5-himanshu.madhani@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20180321060941.29468-1-himanshu.madhani@cavium.com> References: <20180321060941.29468-1-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)(39380400002)(346002)(376002)(39860400002)(396003)(2980300002)(1109001)(1110001)(339900001)(189003)(199004)(1076002)(106466001)(86362001)(48376002)(478600001)(36756003)(305945005)(336012)(85426001)(110136005)(54906003)(50466002)(356003)(72206003)(50226002)(8936002)(81166006)(81156014)(8676002)(26005)(42186006)(316002)(87636003)(16586007)(105606002)(6666003)(2906002)(59450400001)(2950100002)(51416003)(5660300001)(76176011)(69596002)(47776003)(186003)(80596001)(4326008); DIR:OUT; SFP:1101; SCL:1; SRVR:SN6PR07MB4221; H:CAEXCH02.caveonetworks.com; FPR:; SPF:Fail; PTR:50-232-66-26-static.hfc.comcastbusiness.net; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD022; 1:JhQZ3vWPMDDBduJu24RBk9kvWIe6TcL/3Jq9dqFzfeqkgo00j8eQSqkYNeL5di7A48JioSpCoHmky0Y45VwnMr+IdwoMkWqZN/j1srpOSTkNRbM9hI+7X+AUpvKCdtfu X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 07aa531f-3a13-45cb-a853-08d58ef25bcb X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060); SRVR:SN6PR07MB4221; X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4221; 3:ohwqeWAoyUbmZfpCY+gbJs20+i4DC7goXr/CslesqY1RXuWCukcMJa9lCbitM8BTB7GkygokobxeKZzPOB1d+JJSKmIPJyEy3Apks3U9ncOZYisrIqzjkaWJPW9zNN2m9Ef6yIR2ur+TvR2Z/oGU6rhpgoJP0Q7+IeRSfdcQ4kqUSFB7hEqM45sVRAfPS+3VjVPk7wZu8g+dWmHadACYkhlhHsXCyEqegLapU3qDl4YRWZh2165tkRIAoqPSCP8nFPzZ4aYTSq6T0crY8YeBZbMt2KjbkKm9CpAawEZbs/Cf6mTtzMzT1lXlYdLTNU7RQJgTExGGvEy85lSdF2nSJZaDIBjtpM6EqIt3AvU9vr0=; 25:QT8g9yHBzaxHmnXRc7h61/uslmFQDkMTt0xZ+Wy4mEtlDX27oSrVpyJSHCDHVLefEiR/Q4FmWKgTFvAVDFUbqVtel3Q8VKcOhSv+g4qBlaMwHSdzCmebnCxNzAnpkK6Z/1bF92yvjv8JXZXZKxayfmUzKoUenVsnbkm/RK22wCASyq6XcCBj0mo07LAV2BGFITKfkw9P5tmMACC7ktX70H3KdOevR6l1c37KOIlEzhg0plA5mNNSgibgwU9NFGoqaZ5JL/W10R/eFC+YaTVb5jOlv8zJ7bbPZ/OFst7PSBvWJwd2eRjKQ71oVb+xsmfpKdJwbU6M1FcBSiMcnjmzgA== X-MS-TrafficTypeDiagnostic: SN6PR07MB4221: X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4221; 31:zV8JABc/xHk0e55ETdCFvjc6/F1I+Jq/u0nDJuPIQQavwA2cF9LwmzqMyZ22ITZw2mhfkWEGc+nvNn25EwKJnc3kBoSNvTfYMCs8fKWAPJsXRecAy2VChP6zNsOG2AiWIPmTgMFo+0uUg8KDjj1rT6xoZ9AXH7idasxutiHta6cuQaFOmm5aCdirUidBt9YZDcyY+9j0BcQOUfH36Vu+ThDaOqoCMWzelgD/3Ug0LI8=; 20:k3cT4iHUocvK1rRQ+f/b6pn+lF1v4TvYQ3lk05R7QIr4A2yeB7rnycLsC97XeT+TqYl6OBQX8YDbUD7dtCPSqWRKMMFItDDWnBC28uoT8UYzcfcMHVag1gQiCJSxdc8C05hMGOdNmqbTrPT1eN8TaR9N5nzXeIEvdACpmrYNSKVxVGxnnCzzu73iWP1aZXoaO/klh1JZg3uJNuVxiPfDBU40scQNTrsRnLfZ0r2nLT3nlUKHRDuFMViG9yNjTMKGRFnBgmDYZD6P6/4IF6A9SxYR2qX58U7STKtL8YKyG5dq+fFjf9IhAMqYqGbP7rO3yZkKFq8xDmqTvebTW4yyqD7FleRNBcViEGY8WJVCRudi7aVMSaDcWRcESciJ9ckjDE7xKRTuEgCDZo35tIoBDLvQq/pidbIcvECOztMg+LzT+EUIxXF+zf8JOicAg+2m0RVWjBuJMRTUHz06FnUroDN4IgsKvOunfckUpUsP65e8pnXzMXHhv7V7ipsAbFpH X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231221)(944501319)(52105095)(93006095)(93001095)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(6072148)(201708071742011); SRVR:SN6PR07MB4221; BCL:0; PCL:0; RULEID:; SRVR:SN6PR07MB4221; X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4221; 4:AnlHfM47hU1+xF0NvfAw0x8dgnjal49xTtl849e1eamY8cVPupyDks7uU4dIbnza0tzZdrtbKeUZ9ar1j1zbcpS9xBsahy3w153x7ycL6aIwY2tr3+NZNj9zJ7dcR1lC8RS+NE4zZlgoL28dIN3Ii9gU8yf6cpMDIZy4qzyrCcDevqKEPpxH/VzSXbMG4F8ehlmoO/XjQ6KiesGDES3lqO8S5d1K65JHkVM1PIYLK/AmSFNRNqTIcYadf2MvkGBEih3LOODlagbinyEKW4Ymrg== X-Forefront-PRVS: 0618E4E7E1 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN6PR07MB4221; 23:voyFJ4nEnmgKMC1Zv8NnZVG+zJZpAn+Fx/N/ixkPG?= =?us-ascii?Q?oqMB5hmNzJDoQegXFAoQ+ji9R5H+xpRdHlmNTSnhK+QPkaDlqOrkGCiRuT11?= =?us-ascii?Q?foId7nY01gY0Q5wELQ+n9MoAcFn/Zqt155CaHxK4Oper5H/WbpuKW7hzubNm?= =?us-ascii?Q?KLfBY5Ze7q4jQiIOVnUGue0Vz4xwArJfC+wmpTCdwMxO7SZ8BKrDfyJu0pk8?= =?us-ascii?Q?hV32nL9HGPzgE+drYfyGDn5I9KaRRWlhpx87g0yylUxHOoMf9L8qGl/ymgTM?= =?us-ascii?Q?vqaJFC6MJVpCjmf/NMQyubS/+qbhhTZS3mKnCK+7WJgbdsssLQu0Uc9DAgrm?= =?us-ascii?Q?e06q7XNAcdgpDdCD3kBLOItR+dQBsHV1r9Rlf7xGiYsjSKz81szdM/sB1gJj?= =?us-ascii?Q?H/eZp4ON8LmKogcen91B2ah1TW+RH98iqg0NXQ1rJbQ9sDMZ64S8Dzoay05+?= =?us-ascii?Q?PjYxmlbBR8lOWU+7WWmc2qkoxrGk76mxtlT4dcJeBq5rjl1u3rJrcIFKf7eI?= =?us-ascii?Q?p4/TipTg3O5by4UaH2xt3XsGOUrroEpCjxeijTQRTjeQrKGadKstZJCO2/4h?= =?us-ascii?Q?BmkxvHSyz6zh6BPtFmg9ARKH3Igdl+0H51eFGWhf+evBkaAWTgdzWhFS4Igy?= =?us-ascii?Q?O8J72XdDYUoj0ANuOxiA47mDyx8KgUuE5zFbml71H+taQeW0mnq01qzjkZnA?= =?us-ascii?Q?NuJQRSjKsdCM2IQ7XlFu+lLX1Jbyd8Gj6518u4Xpg79riv9m/A2wFxJtTpON?= =?us-ascii?Q?c/T24zIRSvQrFSY5D9d2ewCN3SeZSd1t5eZ+pcynq6zWHZNyEepdWz1ayMU1?= =?us-ascii?Q?KmWT6YIXD+JjTz8hgVmeTdMZX5wKmKzj3ZbastS0ktX4xty5Mef4AYXr2B9Y?= =?us-ascii?Q?cc5b1u735f6K8RC+H/gLnDwdykkKq6XGWAEWKQ/KZ1TetRUk17AkglQVftnm?= =?us-ascii?Q?cY0bHHuvC0XF9MaD8HO+Nf7fRtOoRwHTj2PAHeRn/q7unYtn3GG5vtWTuNRs?= =?us-ascii?Q?YwcrzkYEGldSjhWX2of6IOL99hGvwlv/yPg64xOHklxbre6KHeKZUVxEDRj2?= =?us-ascii?Q?DOakE8h0l+z5jloJ4yWfOsWtIMA6Zq06B8NAg75rVVgfnclp1n9myYWjDcY6?= =?us-ascii?Q?EynZg6vqic=3D?= X-Microsoft-Antispam-Message-Info: KUIi0ml3kCZ+DAEQeu12r4E3VzMHxN7uX1x0GDCB0bK2W+Cqfnj7mBOJNfpuV0NY8wlgRMlmedPXUDKr1rFFFStKcNT1MlyFBVtC8vcxEbd10hR2El05h1dB4lsp1ZP8dy7bFcEshNp/9CHDFzsn8Tkxbx3PDT/s5yHinsnawp6A8CMrjsaQtnOkMWxiMI53 X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4221; 6:BDKtldVltHxm89WvI0A7qd7cX19yQhGIK0OvcQ0mL9P1OTCumswMkBizvba6L5wAtMtJmDA/RLPcp8yvDopSTa8Mscd3akNdvi/N+Kx4hzq9tEc4NU0fu6Z9KddBW4xx5abHgqnVaGEJPhTctLZ0NHcq3lyLSEcLlCVR4oZaD/6GGmY9tSWQiioLLUlOLDiopEyV9suOCrlTjsjOOux65vzlr/dj9XdXVdJ4xc2zs+IxBNjEEWI36vfEgPI7YcI1u3cDAw20QoqaTEokdgm4x6XCZy39B1CBBrSj5dFCJ2Zh+DCmX65TwlNYrYBK6X6dWohJ2Ej4r0RDCYJ56VhGkxpI96qMvQ5nDZ1jdCB8l2c=; 5:z56VWZUuB3xAeoE3WbY0PkDAyh+BD3yK7XhWc1CNChnu8DZO9DS4Yw0BVf7lfIZpw2WJvoRzNjd9Mv33wGe85apo6/HVvdJSZhYFNMWk70RejlenhJBdesQV/NLYsA28p0nkep0a7VpULjQmr8hROCZJZwkmta3rLVKsP9nm/nM=; 24:WTMu+CjC7FfnIY5+ns3/3QqCsq1exmC/Nr3isngnUeb+IKhYu4I0z/evMkYVFC0h8QUi0K6Jk52gfZfDGJlUQjQ2ZvB2k5Y3DTUQ9F8/HPw=; 7:Eh8xB+e1wrgnh1bphthBHM+QR19Bkej3bOnkSg99WWS0Rd9FNi2PQE/ejoK8/ftTw7G8CX++yJQFgSKbkm2UvN6NAZqgsAPekd42DMNs8ZJ3Mvgyf8rw/MPoo/Q6iW/YW5efKYnkHcApF0eQVO/KZ234POkKtONtTYq9xyzwQR3gJ9g1+FV4z3d6ggC75xQlM/aEF1DDsDesqBtWMhozXoR8ENcA4RMGAZ3gMKc+DarbDW+CXjPJxgr51Cz34X2R SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2018 06:09:51.2664 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 07aa531f-3a13-45cb-a853-08d58ef25bcb 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: SN6PR07MB4221 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: Darren Trapp Add support for error recovery within devloss timeout, now that FC-NVMe transport support devloss timeout. Signed-off-by: Darren Trapp Signed-off-by: Himanshu Madhani Reviewed-by: Hannes Reinecke Reviewed-by: Johannes Thumshirn --- drivers/scsi/qla2xxx/qla_def.h | 1 + drivers/scsi/qla2xxx/qla_init.c | 8 +++ drivers/scsi/qla2xxx/qla_isr.c | 5 +- drivers/scsi/qla2xxx/qla_nvme.c | 142 +++++++++++++++++--------------------- drivers/scsi/qla2xxx/qla_nvme.h | 6 +- drivers/scsi/qla2xxx/qla_target.c | 13 ++-- drivers/scsi/qla2xxx/qla_target.h | 2 +- 7 files changed, 87 insertions(+), 90 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index be7d6824581a..56f78dce4d3c 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2355,6 +2355,7 @@ typedef struct fc_port { #define NVME_PRLI_SP_DISCOVERY BIT_3 uint8_t nvme_flag; #define NVME_FLAG_REGISTERED 4 +#define NVME_FLAG_DELETING 2 struct fc_port *conflict; unsigned char logout_completed; diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 1878a6f24ddb..7f8bfa0454d2 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -5517,6 +5517,14 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha) break; } + if (fcport->fc4f_nvme) { + if (fcport->disc_state == DSC_DELETE_PEND) { + fcport->disc_state = DSC_GNL; + vha->fcport_count--; + fcport->login_succ = 0; + } + } + if (found) { spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); continue; diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 16c43bd9bb83..93f2f1df7168 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -1910,7 +1910,7 @@ qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk) } else { switch (le16_to_cpu(sts->comp_status)) { case CS_COMPLETE: - ret = 0; + ret = QLA_SUCCESS; break; case CS_ABORTED: @@ -1922,7 +1922,8 @@ qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk) "NVME-%s ERR Handling - hdl=%x completion status(%x) resid=%x ox_id=%x\n", sp->name, sp->handle, sts->comp_status, le32_to_cpu(sts->residual_len), sts->ox_id); - fd->transferred_length = fd->payload_length; + fd->transferred_length = 0; + iocb->u.nvme.rsp_pyld_len = 0; ret = QLA_ABORTED; break; diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c index 91f8b3c2afb6..5ee447680ddd 100644 --- a/drivers/scsi/qla2xxx/qla_nvme.c +++ b/drivers/scsi/qla2xxx/qla_nvme.c @@ -16,15 +16,13 @@ static void qla_nvme_unregister_remote_port(struct work_struct *); int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) { - struct nvme_rport *rport; + struct qla_nvme_rport *rport; + struct nvme_fc_port_info req; int ret; if (!IS_ENABLED(CONFIG_NVME_FC)) return 0; - if (fcport->nvme_flag & NVME_FLAG_REGISTERED) - return 0; - if (!vha->flags.nvme_enabled) { ql_log(ql_log_info, vha, 0x2100, "%s: Not registering target since Host NVME is not enabled\n", @@ -33,38 +31,35 @@ int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) } if (!(fcport->nvme_prli_service_param & - (NVME_PRLI_SP_TARGET | NVME_PRLI_SP_DISCOVERY))) + (NVME_PRLI_SP_TARGET | NVME_PRLI_SP_DISCOVERY)) || + (fcport->nvme_flag & NVME_FLAG_REGISTERED)) return 0; INIT_WORK(&fcport->nvme_del_work, qla_nvme_unregister_remote_port); - rport = kzalloc(sizeof(*rport), GFP_KERNEL); - if (!rport) { - ql_log(ql_log_warn, vha, 0x2101, - "%s: unable to alloc memory\n", __func__); - return -ENOMEM; - } - rport->req.port_name = wwn_to_u64(fcport->port_name); - rport->req.node_name = wwn_to_u64(fcport->node_name); - rport->req.port_role = 0; + memset(&req, 0, sizeof(struct nvme_fc_port_info)); + req.port_name = wwn_to_u64(fcport->port_name); + req.node_name = wwn_to_u64(fcport->node_name); + req.port_role = 0; + req.dev_loss_tmo = NVME_FC_DEV_LOSS_TMO; if (fcport->nvme_prli_service_param & NVME_PRLI_SP_INITIATOR) - rport->req.port_role = FC_PORT_ROLE_NVME_INITIATOR; + req.port_role = FC_PORT_ROLE_NVME_INITIATOR; if (fcport->nvme_prli_service_param & NVME_PRLI_SP_TARGET) - rport->req.port_role |= FC_PORT_ROLE_NVME_TARGET; + req.port_role |= FC_PORT_ROLE_NVME_TARGET; if (fcport->nvme_prli_service_param & NVME_PRLI_SP_DISCOVERY) - rport->req.port_role |= FC_PORT_ROLE_NVME_DISCOVERY; + req.port_role |= FC_PORT_ROLE_NVME_DISCOVERY; - rport->req.port_id = fcport->d_id.b24; + req.port_id = fcport->d_id.b24; ql_log(ql_log_info, vha, 0x2102, "%s: traddr=nn-0x%016llx:pn-0x%016llx PortID:%06x\n", - __func__, rport->req.node_name, rport->req.port_name, - rport->req.port_id); + __func__, req.node_name, req.port_name, + req.port_id); - ret = nvme_fc_register_remoteport(vha->nvme_local_port, &rport->req, + ret = nvme_fc_register_remoteport(vha->nvme_local_port, &req, &fcport->nvme_remote_port); if (ret) { ql_log(ql_log_warn, vha, 0x212e, @@ -73,10 +68,11 @@ int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport) return ret; } - fcport->nvme_remote_port->private = fcport; - fcport->nvme_flag |= NVME_FLAG_REGISTERED; + rport = fcport->nvme_remote_port->private; rport->fcport = fcport; list_add_tail(&rport->list, &vha->nvme_rport_list); + + fcport->nvme_flag |= NVME_FLAG_REGISTERED; return 0; } @@ -174,26 +170,23 @@ static void qla_nvme_sp_done(void *ptr, int res) if (!atomic_dec_and_test(&sp->ref_count)) return; - if (!(sp->fcport->nvme_flag & NVME_FLAG_REGISTERED)) - goto rel; - - if (unlikely(res == QLA_FUNCTION_FAILED)) - fd->status = NVME_SC_INTERNAL; - else + if (res == QLA_SUCCESS) fd->status = 0; + else + fd->status = NVME_SC_INTERNAL; fd->rcv_rsplen = nvme->u.nvme.rsp_pyld_len; list_add_tail(&nvme->u.nvme.entry, &sp->qpair->nvme_done_list); + return; -rel: - qla2xxx_rel_qpair_sp(sp->qpair, sp); } static void qla_nvme_ls_abort(struct nvme_fc_local_port *lport, struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd) { struct nvme_private *priv = fd->private; - fc_port_t *fcport = rport->private; + struct qla_nvme_rport *qla_rport = rport->private; + fc_port_t *fcport = qla_rport->fcport; srb_t *sp = priv->sp; int rval; struct qla_hw_data *ha = fcport->vha->hw; @@ -218,7 +211,8 @@ static void qla_nvme_ls_complete(struct work_struct *work) static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd) { - fc_port_t *fcport = rport->private; + struct qla_nvme_rport *qla_rport = rport->private; + fc_port_t *fcport = qla_rport->fcport; struct srb_iocb *nvme; struct nvme_private *priv = fd->private; struct scsi_qla_host *vha; @@ -226,9 +220,6 @@ static int qla_nvme_ls_req(struct nvme_fc_local_port *lport, struct qla_hw_data *ha; srb_t *sp; - if (!(fcport->nvme_flag & NVME_FLAG_REGISTERED)) - return rval; - vha = fcport->vha; ha = vha->hw; /* Alloc SRB structure */ @@ -275,7 +266,8 @@ static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport, struct nvme_private *priv = fd->private; srb_t *sp = priv->sp; int rval; - fc_port_t *fcport = rport->private; + struct qla_nvme_rport *qla_rport = rport->private; + fc_port_t *fcport = qla_rport->fcport; struct qla_hw_data *ha = fcport->vha->hw; rval = ha->isp_ops->abort_command(sp); @@ -288,11 +280,10 @@ static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport, static void qla_nvme_poll(struct nvme_fc_local_port *lport, void *hw_queue_handle) { - struct scsi_qla_host *vha = lport->private; - unsigned long flags; struct qla_qpair *qpair = hw_queue_handle; + unsigned long flags; + struct scsi_qla_host *vha = lport->private; - /* Acquire ring specific lock */ spin_lock_irqsave(&qpair->qp_lock, flags); qla24xx_process_response_queue(vha, qpair->rsp); spin_unlock_irqrestore(&qpair->qp_lock, flags); @@ -490,6 +481,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, srb_t *sp; struct qla_qpair *qpair = hw_queue_handle; struct nvme_private *priv; + struct qla_nvme_rport *qla_rport = rport->private; if (!fd) { ql_log(ql_log_warn, NULL, 0x2134, "NO NVMe FCP request\n"); @@ -497,14 +489,14 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, } priv = fd->private; - fcport = rport->private; + fcport = qla_rport->fcport; if (!fcport) { ql_log(ql_log_warn, NULL, 0x210e, "No fcport ptr\n"); return rval; } vha = fcport->vha; - if ((!qpair) || (!(fcport->nvme_flag & NVME_FLAG_REGISTERED))) + if (!qpair) return -EBUSY; /* Alloc SRB structure */ @@ -547,22 +539,27 @@ static void qla_nvme_localport_delete(struct nvme_fc_local_port *lport) static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) { fc_port_t *fcport; - struct nvme_rport *r_port, *trport; + struct qla_nvme_rport *qla_rport = rport->private, *trport; - fcport = rport->private; + fcport = qla_rport->fcport; fcport->nvme_remote_port = NULL; fcport->nvme_flag &= ~NVME_FLAG_REGISTERED; - list_for_each_entry_safe(r_port, trport, + list_for_each_entry_safe(qla_rport, trport, &fcport->vha->nvme_rport_list, list) { - if (r_port->fcport == fcport) { - list_del(&r_port->list); + if (qla_rport->fcport == fcport) { + list_del(&qla_rport->list); break; } } - kfree(r_port); complete(&fcport->nvme_del_done); + if (!test_bit(UNLOADING, &fcport->vha->dpc_flags)) { + INIT_WORK(&fcport->free_work, qlt_free_session_done); + schedule_work(&fcport->free_work); + } + + fcport->nvme_flag &= ~(NVME_FLAG_REGISTERED | NVME_FLAG_DELETING); ql_log(ql_log_info, fcport->vha, 0x2110, "remoteport_delete of %p completed.\n", fcport); } @@ -582,7 +579,7 @@ static struct nvme_fc_port_template qla_nvme_fc_transport = { .max_dif_sgl_segments = 64, .dma_boundary = 0xFFFFFFFF, .local_priv_sz = 8, - .remote_priv_sz = 0, + .remote_priv_sz = sizeof(struct qla_nvme_rport), .lsrqst_priv_sz = sizeof(struct nvme_private), .fcprqst_priv_sz = sizeof(struct nvme_private), }; @@ -601,22 +598,6 @@ static int qla_nvme_wait_on_command(srb_t *sp) return ret; } -static int qla_nvme_wait_on_rport_del(fc_port_t *fcport) -{ - int ret = QLA_SUCCESS; - int timeout; - - timeout = wait_for_completion_timeout(&fcport->nvme_del_done, - msecs_to_jiffies(2000)); - if (!timeout) { - ret = QLA_FUNCTION_FAILED; - ql_log(ql_log_info, fcport->vha, 0x2111, - "timed out waiting for fcport=%p to delete\n", fcport); - } - - return ret; -} - void qla_nvme_abort(struct qla_hw_data *ha, struct srb *sp) { int rval; @@ -631,7 +612,7 @@ static void qla_nvme_unregister_remote_port(struct work_struct *work) { struct fc_port *fcport = container_of(work, struct fc_port, nvme_del_work); - struct nvme_rport *rport, *trport; + struct qla_nvme_rport *qla_rport, *trport; if (!IS_ENABLED(CONFIG_NVME_FC)) return; @@ -639,51 +620,52 @@ static void qla_nvme_unregister_remote_port(struct work_struct *work) ql_log(ql_log_warn, NULL, 0x2112, "%s: unregister remoteport on %p\n",__func__, fcport); - list_for_each_entry_safe(rport, trport, + list_for_each_entry_safe(qla_rport, trport, &fcport->vha->nvme_rport_list, list) { - if (rport->fcport == fcport) { + if (qla_rport->fcport == fcport) { ql_log(ql_log_info, fcport->vha, 0x2113, "%s: fcport=%p\n", __func__, fcport); init_completion(&fcport->nvme_del_done); nvme_fc_unregister_remoteport( fcport->nvme_remote_port); - qla_nvme_wait_on_rport_del(fcport); + wait_for_completion(&fcport->nvme_del_done); + break; } } } void qla_nvme_delete(struct scsi_qla_host *vha) { - struct nvme_rport *rport, *trport; + struct qla_nvme_rport *qla_rport, *trport; fc_port_t *fcport; int nv_ret; if (!IS_ENABLED(CONFIG_NVME_FC)) return; - list_for_each_entry_safe(rport, trport, &vha->nvme_rport_list, list) { - fcport = rport->fcport; + list_for_each_entry_safe(qla_rport, trport, + &vha->nvme_rport_list, list) { + fcport = qla_rport->fcport; ql_log(ql_log_info, fcport->vha, 0x2114, "%s: fcport=%p\n", __func__, fcport); init_completion(&fcport->nvme_del_done); nvme_fc_unregister_remoteport(fcport->nvme_remote_port); - qla_nvme_wait_on_rport_del(fcport); + wait_for_completion(&fcport->nvme_del_done); } if (vha->nvme_local_port) { init_completion(&vha->nvme_del_done); + ql_log(ql_log_info, vha, 0x2116, + "unregister localport=%p\n", + vha->nvme_local_port); nv_ret = nvme_fc_unregister_localport(vha->nvme_local_port); - if (nv_ret == 0) - ql_log(ql_log_info, vha, 0x2116, - "unregistered localport=%p\n", - vha->nvme_local_port); - else + if (nv_ret) ql_log(ql_log_info, vha, 0x2115, "Unregister of localport failed\n"); - wait_for_completion_timeout(&vha->nvme_del_done, - msecs_to_jiffies(5000)); + else + wait_for_completion(&vha->nvme_del_done); } } diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h index 7f05fa1c77db..7becfc1b3e69 100644 --- a/drivers/scsi/qla2xxx/qla_nvme.h +++ b/drivers/scsi/qla2xxx/qla_nvme.h @@ -14,6 +14,9 @@ #include "qla_def.h" +/* default dev loss time (seconds) before transport tears down ctrl */ +#define NVME_FC_DEV_LOSS_TMO 30 + #define NVME_ATIO_CMD_OFF 32 #define NVME_FIRST_PACKET_CMDLEN (64 - NVME_ATIO_CMD_OFF) #define Q2T_NVME_NUM_TAGS 2048 @@ -31,8 +34,7 @@ struct nvme_private { int comp_status; }; -struct nvme_rport { - struct nvme_fc_port_info req; +struct qla_nvme_rport { struct list_head list; struct fc_port *fcport; }; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 755d7a2a3eea..4f7cb7d86464 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -961,7 +961,7 @@ qlt_send_first_logo(struct scsi_qla_host *vha, qlt_port_logo_t *logo) logo->cmd_count, res); } -static void qlt_free_session_done(struct work_struct *work) +void qlt_free_session_done(struct work_struct *work) { struct fc_port *sess = container_of(work, struct fc_port, free_work); @@ -1169,11 +1169,14 @@ void qlt_unreg_sess(struct fc_port *sess) sess->last_rscn_gen = sess->rscn_gen; sess->last_login_gen = sess->login_gen; - if (sess->nvme_flag & NVME_FLAG_REGISTERED) + if (sess->nvme_flag & NVME_FLAG_REGISTERED && + !(sess->nvme_flag & NVME_FLAG_DELETING)) { + sess->nvme_flag |= NVME_FLAG_DELETING; schedule_work(&sess->nvme_del_work); - - INIT_WORK(&sess->free_work, qlt_free_session_done); - schedule_work(&sess->free_work); + } else { + INIT_WORK(&sess->free_work, qlt_free_session_done); + schedule_work(&sess->free_work); + } } EXPORT_SYMBOL(qlt_unreg_sess); diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index bb67b5a284a8..728ce74358e7 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h @@ -1016,7 +1016,7 @@ extern void qlt_fc_port_deleted(struct scsi_qla_host *, fc_port_t *, int); extern int __init qlt_init(void); extern void qlt_exit(void); extern void qlt_update_vp_map(struct scsi_qla_host *, int); - +extern void qlt_free_session_done(struct work_struct *); /* * This macro is used during early initializations when host->active_mode * is not set. Right now, ha value is ignored.