From patchwork Tue Mar 20 05:58:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 10296431 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 0555B60386 for ; Tue, 20 Mar 2018 05:59:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E598F28AA5 for ; Tue, 20 Mar 2018 05:59:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D9D1D29516; Tue, 20 Mar 2018 05:59:02 +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 B787F28AA5 for ; Tue, 20 Mar 2018 05:59:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751714AbeCTF7A (ORCPT ); Tue, 20 Mar 2018 01:59:00 -0400 Received: from mail-bn3nam01on0045.outbound.protection.outlook.com ([104.47.33.45]:16520 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751662AbeCTF6u (ORCPT ); Tue, 20 Mar 2018 01:58:50 -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=BYQDKf4LcDNkSO8dSZargPlhJA7Z4ErDHW64seSNujA=; b=WMDSwp9hcjb1iUs4sxmbbbJtDiE2phjoursTm0Hlvq6zHssp3Rw62otHFzwmwiZJnp9LuynZYg/Ow05CnCVJHYqW3jdWdMqbRGtuDfPY6X70G+CQ7+nEPAh482CtzVggpYCNp6U595KJl1I30Kd46elDhDRk5oTr/kzfHsUfsvw= Received: from BY2PR07CA0017.namprd07.prod.outlook.com (2a01:111:e400:7bff::12) by SN6PR07MB4304.namprd07.prod.outlook.com (2603:10b6:805:55::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.588.14; Tue, 20 Mar 2018 05:58:48 +0000 Received: from BL2FFO11OLC016.protection.gbl (2a01:111:f400:7c09::120) by BY2PR07CA0017.outlook.office365.com (2a01:111:e400:7bff::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.609.10 via Frontend Transport; Tue, 20 Mar 2018 05:58:47 +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 BL2FFO11OLC016.mail.protection.outlook.com (10.173.160.82) 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; Tue, 20 Mar 2018 05:58:47 +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; Mon, 19 Mar 2018 22:58:39 -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 w2K5wcOq005293; Mon, 19 Mar 2018 22:58:38 -0700 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id w2K5wcDk005292; Mon, 19 Mar 2018 22:58:38 -0700 From: Himanshu Madhani To: , CC: , Subject: [PATCH v3 03/13] qla2xxx: Add changes for devloss timeout in driver Date: Mon, 19 Mar 2018 22:58:27 -0700 Message-ID: <20180320055837.5246-4-himanshu.madhani@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20180320055837.5246-1-himanshu.madhani@cavium.com> References: <20180320055837.5246-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)(396003)(346002)(39850400004)(376002)(2980300002)(1109001)(1110001)(339900001)(199004)(189003)(336012)(54906003)(8936002)(36756003)(72206003)(1076002)(50226002)(110136005)(478600001)(2906002)(16586007)(5660300001)(4326008)(42186006)(76176011)(81166006)(81156014)(8676002)(51416003)(316002)(87636003)(6666003)(80596001)(105606002)(305945005)(69596002)(356003)(47776003)(85426001)(86362001)(186003)(59450400001)(50466002)(48376002)(26005)(106466001)(2950100002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN6PR07MB4304; H:CAEXCH02.caveonetworks.com; FPR:; SPF:Fail; PTR:50-232-66-26-static.hfc.comcastbusiness.net; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11OLC016; 1:8+x736xRIrTU9BdY+6cDSOmyLS48xogPfghxd6CmUhtPczblVUVDdrbvCjVr87OBl2gPiYlFbYpp/sk0jufJ1rhU2v5bQqIueyFNPeiqNELgeQ5sFLIFuTn8Qhksvnci X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 76649fe6-b7ac-426a-c625-08d58e27a584 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060); SRVR:SN6PR07MB4304; X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4304; 3:s7pJH1bj9N9O4uquw9plkr+HDAC9DvaTcB7ByLKLpWklNbBZV06torwHWBzT31AlWWspzgMDU58uwXDuKoEnhPCk3zh8d2d1JoyjJcIQmdctPmDVSv8nLUIda2WzBoHKA+U+dyxXEbe+lFHaweteuazrJ+1IYpAYGkwIai6sHk6wIX2Bq+m+kIOCg1OusSvAT2+kT71iZVeTkL4jkLBHKvD/MJedySh+gQufflAXwMwj7AIJcM1HOtQ07H69AfEbxVkzMUN3ubHudNVA9kpzAYGg3qEYYO97B0FFFafqNE34JJonX+AKuZmwgiGyVjJbFkzSkQHSm+MDBO+S+X9Q+ptsyFU6zFR02OES3zBoSdM=; 25:IKabTGtSYG4jsZGIm3Siz4Du/Ii+oN7L6Wg/bY0Nbk5gdyeRNr9kQLUPLkBjhDb2CTSvsEVllQ1P/aioaOqAfdGUop4I3NKi+eTF/nN33nSrItfAp89AyDPGtjzthwOefZ00McZ490f5St9qvzYVfsclHPUQUxhIZezMOKACQ2MQLNUGnS2DJv6no0/8Y4SX07tN7SWy5a61k1xQ+9Drzn0NtxmVTdYaqpnEZ0C+CBbdn43/sY2Smgr9xPjJ50+YS15Np6DRGYZFTIYHNirlyAJWxK6C+Lm+GI0TMt0RtEJ5AZbYa+e4PF0kYQvI6QGA/nrhb3hmZvxo4KtMyGY06A== X-MS-TrafficTypeDiagnostic: SN6PR07MB4304: X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4304; 31:9ke3HmFwbxBMSwrK1lPhpAyo1hFaAJQ4sFor5NKBMyNzz4j1E6wT2UnuDq6Sg6y4vZQj6Sr4rcxTRQmc3smN4YCBI7dKkJ3IpjxTR4INGkMlak8Ml+6O0QeiVYlWQktKkuNYKSN7IuRHsTzBipd1P+V9atU6ScWufVJOMXR3LKseOkuPQSEDc0RE5uMliU6Qm3cu+DQeDhwS2ugpZ9yJia++jA2zHsXsFdgy3ZkSC4E=; 20:lMmKf2OFFViAr2eOavmDHjEZm6v1IHdr60r6l4PP9GwurHjqvv49wy3g+yFYRqG3G7kDAzM4ZWDDJGWxeWpqXIkSOIdJm02BcFmClggsyO2EAvLGh5q3nk+07Oi0dsCF82E1z7rIuruoEDaAVyIHt98H8GQ9Cv4AA6RAUejdjG1esUXFAeCvFC/y2cBMCw/HQFsqL99SjqVrxhABA0oTpSo8XefR5AfJu6tZ9YkqUWVMrcJAZBP4iFSA1sVZ5KzfVokhQBiMWoturawUr7OYNO4Etd1ojLAlM6p03J+ZltZdAHl6XvsRNuOtk+acBUfL3dPmAkiawMILTZXGWHbVObmd73oT/JX+8ip2royJw9bYA/v7merNPRg2cFfmnkHWjsCq8Up1nrrcnF+TTGK+hAAnUbE2sZ+UhdOwPVhMrqMjk7xK5znw2LkM9mhVxqMog5IoiyUHWlWjWeCt781Q9IWdaUXSkmaVXbEV68xpHQacBTirawTlHRa3CiyAyDTI 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)(93006095)(93001095)(3002001)(3231221)(944501244)(52105095)(10201501046)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123558120)(6072148)(201708071742011); SRVR:SN6PR07MB4304; BCL:0; PCL:0; RULEID:; SRVR:SN6PR07MB4304; X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4304; 4:T7wcaoF83ITQLgFqZgwPEPzADtsuJo/Hl+Z8OruKnsBF6v4mdqP925y7km3QK/R0E81/HR9oulpkEuIEhF8igiTHn90aDnX649uzsZ6Epn4wR4zzqL68NlRtq704RKphYPF3iRIh8mdlGRP5SF5ndyv00ZYU0Wf21RuL3awWrAMpjSJOC5VWJIvM5MindqKolv/Udu/FA4hMmCBEfPNXm9DXDW6J62AUj2eEGYfCNwWFkU9YUac2KcY+18jtZvZl8Fd+OlgmdVORCxZ9Yo08sA== X-Forefront-PRVS: 061725F016 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; SN6PR07MB4304; 23:VUJMMkPg32gpO0WlPT1ZNERtUffFCYzeH5/Psouwp?= =?us-ascii?Q?qHaGVIBTO4WRqypylMIsraVRObwr6ANksIFN0Ipv9dphNAJ5yx43Q32w58Qs?= =?us-ascii?Q?TrHLod/7NKTk1+tQ9VZCjbbNtlqhRs4Eor1KWCvJOdtA+Zd5FzKNjQGnzkcX?= =?us-ascii?Q?fbcibc6YZY/qZ5CwqyY7jD1wPjh3pWZfovg9V/Wcsw1UlLQBS5XoDXGRSvNI?= =?us-ascii?Q?2KHyYMJtP8MVaRuwF8yyrTl1UtokNF4deSu4PFhyCzpehlm6RxI3XyDDgJjw?= =?us-ascii?Q?YIjaFItAv9SjXPHXytHDPNx0GpUCH/Kgd6wgO6dEaVIYydCSNhKf0r3+6NMQ?= =?us-ascii?Q?y++iglJhmIC1q/I1Ma77ffeIT32SbZQBLndPDbJv9WMi7SfrHRNpmsu9mC8Q?= =?us-ascii?Q?8D5bgRnXJHjU3aMsApsRwLuKAZ1rjmWtbFVDqNh5wegmFFU+oAh7DLO3ocG9?= =?us-ascii?Q?05yYy5rLBxsjqJ1bURhmWQkUZcOSMaLHOZnk5PjEuNk8iqzKGsQO6bmGvR5B?= =?us-ascii?Q?kuMyz5ZaFd2ruToHzQtiH2CGnNG57oGQkmxrcmEj30QuRqssxbMNKGeUJt/R?= =?us-ascii?Q?AJbjwDANBZl8zBex+NRTlwy0meCcKuTREO5thEOWpDAAQgCTttajbF7S8tBM?= =?us-ascii?Q?TF9uxNp4YiGTz9JoZgrxyN69wKeVm2v2v/dGTa9Y7Mc6OVVq4NGI0xcGpL8L?= =?us-ascii?Q?EKC4ZdlsivsK6Ocu89lLsNIACOScVz85i6qblffu39sSN6nOvtVuRhoSG7ks?= =?us-ascii?Q?hW4hH6IEPG6SkaX1MeoYgC2R/oBwM3r0CGjJXyuqln14TEQGVHLUl83KImC/?= =?us-ascii?Q?nI1WTAtWALk20wHM7h1Tehk+OTbYvM8G8re98U52pHtg6+ghQw+WECZ9sOdW?= =?us-ascii?Q?m1oRSLSxzZKddgNWBuxeahTkPy2jCKoJKQ/pPz3PKxaStCBxSxHeUmQWt4Vd?= =?us-ascii?Q?0LP/Tyrkf8t+LDSX9IlkpYqW2jqOCMvA0cI4Dn0N1a8UyllhrzirZTgmk3Tc?= =?us-ascii?Q?VQNM1mKqeIKio48nHHnliwwgp0940aJG77EhEdT6D2aL8vTO8p86yQEhXRF9?= =?us-ascii?Q?aobDhb9DGa5GzlLX67wy1+12JTUvVN47wgYk8m15x97KzJNKbWB/kAfsJREn?= =?us-ascii?Q?3oQP270R3c=3D?= X-Microsoft-Antispam-Message-Info: bHALgGiWfH1hMiWYXfzmBWe/N5BzwQhJ+35MuvDaL253716g8LRnlWr/4tbKlGpjgJjFBWhFf+BTlAL/uUuW4kU0wJ7nGCGUG/NP5W5nWM2ktveUFpclpkzFPUHqZGZn442GAfPe2BHSImZ2zc9MTW5WScmz1D8soeyd1VgVpY9f8+6zMDdttYqJM2bVnXda X-Microsoft-Exchange-Diagnostics: 1; SN6PR07MB4304; 6:N/SxK3BKc8vz+Y//TnsNs1g74Y/bsUbwPr/EKc2ofosCM+B9kJYqOGGHPUp+08/AGgMPZLnUnwtQ+j+mLp9sbDXsuJRRZi7CPZwUX6eCuRjL2Az2PlxM374dj0Pxra9zgvsM1J0nzFAK/xm+KBoC8XntfHE3JoetvG/YSn79Yxq8evy2vBDFML5hjuD2x05tKDBQ6dEBtmhknfpOI11DrdlAhNXlY1vV+aZLp7wjqMthSW4E4egtVYF1LlVp8fYHMEMlsoBqNO2CZMK3YY5mQIu/esrRqOi5xDlzZa7nJzXPSmyQIoj9o2Un+zE2wbb/dVe5H44hBoLt6trKOsfj7L4QQ1tIfpU3L71J0Dq2B6E=; 5:POqG5T6YioLv/XeP2eCNm+cqBZwoSbRJr+7YwTWXgAOJewpQfxyRkJ1DF0GsrCV76zrqixXPOUJt5HfUsEbAoPTPOlkjrUgEDdRZ7RaOvzbWwKcNkwdSDRhFwvlZ+qsHFa2lyRKTxY3mJDAesNk7jus96ko6qzMabWqpFDGqogE=; 24:k7qrxr1JS6uvA3K2a9uSy/W+Khh5GOsOKNgJfgpVYJpuyPvKVecqp+aDmmkx0eXAG18tdi+mo14HkFS3A46cVb6a9u847im7w4b9USDBJlk=; 7:cYYNcYMMJ23NJuyrNmRBiceRY7wuPKu1vRdHhPH3ZFtfTKIGtkFfmuex1PKKSIpz4L6egTdLOt5b+CKagZMwlUiLeKp2ramf4IW2usWpjB/OFKR6dsLcMuScUNZbHlB80yuLv53gk24+oIG5/VPNxxtLeokvnckz/hwWz/Rrj86AQJTRWz89r8feHtiEmBEZhIS7LvpchHKdWmMlyccOdo9/HBAbGjsJXofXR/Sb6/95R4CkBbZ0w5VzO9feOVDP SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Mar 2018 05:58:47.1016 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 76649fe6-b7ac-426a-c625-08d58e27a584 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: SN6PR07MB4304 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 162a523b985e..a8e81fc14c44 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); @@ -495,6 +486,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"); @@ -502,14 +494,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 */ @@ -552,22 +544,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); } @@ -587,7 +584,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), }; @@ -606,22 +603,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; @@ -636,7 +617,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; @@ -644,51 +625,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.