From patchwork Mon Mar 12 18:16:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 10276937 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 75B34602BD for ; Mon, 12 Mar 2018 18:17:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5EC7628A52 for ; Mon, 12 Mar 2018 18:17:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5337D28E71; Mon, 12 Mar 2018 18:17:07 +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 43F3928A52 for ; Mon, 12 Mar 2018 18:17:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932740AbeCLSRF (ORCPT ); Mon, 12 Mar 2018 14:17:05 -0400 Received: from mail-bl2nam02on0040.outbound.protection.outlook.com ([104.47.38.40]:18112 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932696AbeCLSRC (ORCPT ); Mon, 12 Mar 2018 14:17:02 -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=DwLclPPSESPGOltaIWEqCgHcIfHvsH3nzIBX4CXk33I=; b=XZi+1xt0V9rXlkSV5SAy+oCJ9SQIa2p/IdO5BJ0URkSe1cGwoHy2iHrF7b5L9fSxWgz/FSDlRTOoDjT2f/rHSYgEe7OVVfw3wKg1j5jeJqJbgoFdE6H8qgV0+NBtZI0h1KI62rbvFG7JszDtK2IIX+ON5DPvuSkkjLwhmixLPzw= Received: from DM5PR07CA0114.namprd07.prod.outlook.com (52.132.138.43) by BY2PR0701MB2087.namprd07.prod.outlook.com (10.163.156.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.567.14; Mon, 12 Mar 2018 18:17:00 +0000 Received: from BL2FFO11OLC012.protection.gbl (2a01:111:f400:7c09::138) by DM5PR07CA0114.outlook.office365.com (2603:10b6:4:ae::43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.567.14 via Frontend Transport; Mon, 12 Mar 2018 18:17:00 +0000 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 BL2FFO11OLC012.mail.protection.outlook.com (10.173.160.159) 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; Mon, 12 Mar 2018 18:16:59 +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, 12 Mar 2018 11:16:51 -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 w2CIGqZs020751; Mon, 12 Mar 2018 11:16:52 -0700 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id w2CIGpcQ020750; Mon, 12 Mar 2018 11:16:51 -0700 From: Himanshu Madhani To: , , , , CC: , Subject: [PATCH 03/13] qla2xxx: Add changes for devloss timeout in driver Date: Mon, 12 Mar 2018 11:16:40 -0700 Message-ID: <20180312181650.20704-4-himanshu.madhani@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20180312181650.20704-1-himanshu.madhani@cavium.com> References: <20180312181650.20704-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)(346002)(39380400002)(39860400002)(376002)(396003)(2980300002)(1109001)(1110001)(339900001)(189003)(199004)(86362001)(2201001)(575784001)(1076002)(69596002)(87636003)(8676002)(51416003)(336012)(478600001)(50226002)(48376002)(50466002)(110136005)(4326008)(6346003)(80596001)(54906003)(356003)(72206003)(2906002)(6666003)(305945005)(26005)(2950100002)(59450400001)(47776003)(5660300001)(186003)(316002)(36756003)(8936002)(106466001)(16586007)(76176011)(81156014)(105606002)(81166006)(42186006); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR0701MB2087; 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; BL2FFO11OLC012; 1:ZPJtIFVa8oUpNEIN7soH2aGByJXDUxXuuZDR3Qbvw6NbgUihYA+pyXiiDW+ERfm2qh8ugYHUAiCjZgVCtbzv+p9tPwqwJlbh4VlMlohEGQ7HViseq3hYM8D+iiz2nz/H X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ed1e2ce1-4e2d-4e01-08f4-08d588457265 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060); SRVR:BY2PR0701MB2087; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0701MB2087; 3:bMdmoVW+PeEufEQWG7/1YDl9/qF1MMrFpQ+yU4uektVPARg0O4JnQZ5RLnQW6NQKg9O118PECg6MP95kZS87rSalp+hZvuqdp7mayIE0YkzUGVy27YQTltdBQlnQXmToxzyY7a+DLFMK+gUhuGcOCqLXseEO04iRJuqYdcBBQZ99XYBbvyF7esIfFjJo833pCGV/nwQhKajiOOcH0cHofGCPs+y/l1Lpb44cmmajZrkByA3I1hTRpkd4HPTyaYuWYUGgU1tFqe6W5V249HABWb82UMg7QU9kPU470M+IncMtl8U50RJf2xg+xo1Zh0Pq0TmJklHcS2Jn+yXtqzesCqmo1TimYTJR2BSRocxSWVU=; 25:yZw4vxh4Yo/Yxf1vuLix2M24Myq/F4hNsOB5Xz4+b0WxSdm3fNZoMgnzRTKN9GIjJEx3VSk8Q8GKGdkgOVCnDiiidRKwktmyr49RdVjKGnfZBm73Ae2TbdDEH5S8qLqk9mho2DAgtrY6OvawAaqseQzfp3RIT4Xdl+8d+mm4Y8zplFoCC2DxR79G98FyBlHgngSvkVMxBQhA7GLB/aytMPY3om74hggWD8JPPq0DHGWteZFQ2mf0axheNToT1aczVRmf8NiyVH/6Zl1Fht9dGxhuEkNlce5aJUauJ1MzOXR84E8+pRc+BdUhL7awsEYA+8W3haDC3u+ewsISIOh9Gw== X-MS-TrafficTypeDiagnostic: BY2PR0701MB2087: X-Microsoft-Exchange-Diagnostics: 1; BY2PR0701MB2087; 31:uY1Wlr+e3ucLV6LMixNjFwi1oHne7BUxT1wV2Fgvl8VcS6XqwyQe9OEZuWZIX3UZDIFsnQYNY3oyPTcEs50X70tbwITdCjv18PBdNXkjH1I/FkOmVfpv/Sknc3YMBJbDcAgKHifhEJ7qndkNEuxvzfCbo5s/KP+iORkpYwH61N03myQPaUc+4e3U+pe5qOpE49zS3sV7Nuo6toJvAKpfdUxAvSAd32SM2LiUu7iZQ9c=; 20:cHVk6jS9uVwuRJJq6zB/YrE5NtdSNe9gwnV3vFl0mUSwc9m25n3fQzpMEiAY6mdmBWmc2SLLYWlUiztH9yaFSpGtva6BdwhbUpjKvhC6OtuEL2uGfEeUMDsW5C8ECsa2ZXujL14kpIh5O5kM8QMwKb2VRhH4BCPwsvXcdrwivY0sp8e1uWI0ALH5/NDMqUOXth6mQ9ATuooO4rbTh60l00LZDqXWAW36Zh/o7iHYqnbIlPxUaAXfuZU1UxN4LGmOMBEbhKw2gkcc376q0fb2iwPCv/wdFaiImDeRek1pbDvyFpY0O6FK/Xq1NXogIiI6AR9InJ64xASkaNxLuH9nyvv7lzgaHUqhXjlK8aEhJsaSPtwQgamrWBT6eTZxZwsGbaT1J6AcVC3K/7s6dZm48EsZVrtkTDT+bWNHfb7yez1U9T0rnQrxKPq8GROwshVbvmDy/NE74K+fOiqRMV2xG6Z5V6QGvFLZUVnXCG1APTp+bXIdAIlykUdaPo2UN8a/ 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)(3231220)(944501244)(52105095)(10201501046)(6041310)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(20161123564045)(6072148)(201708071742011); SRVR:BY2PR0701MB2087; BCL:0; PCL:0; RULEID:; SRVR:BY2PR0701MB2087; X-Microsoft-Exchange-Diagnostics: 1; BY2PR0701MB2087; 4:Vzsb4ltpuZTxcbsm8IkRtabaEqtwDqzouafKOl/PjqOab1mnWwnnrzxVdbxWIqWcLypZe840Rod6OQQHAg7Vs+1QdeXvAZffTi15KTDXGUyHBaSZqq9zArZVlE8gZNwGO7t5ZZRDrCLavh/ozg7TmwwDKEBwrSSWX4zkxzV229/lFXPg5FHwxQf6iYDaH2M/dxtlUXFKPh9+0I7nRjqSwqUeYFaaqZflCylVf/1gBRrWTvlGyJvsXxDUnWoWoeOKFmIFfIq1fkRGVE+dwFtjAg== X-Forefront-PRVS: 06098A2863 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR0701MB2087; 23:SnT5PVmjfBRkCE9tXgJZmuFgNCcB+QhvPvKC7uL?= =?us-ascii?Q?X8Lx7bY0ciqpjhnmsjeJbVIk3+19SD8w23Dg/A/Izyj1Zu/WQBLXSXvcHzi6?= =?us-ascii?Q?6O2Ejeyc0jg1x6OsE1xv+sz5HYyE5kaiw/rtu/DKdrL6lnGGz1Wnyxhu7Aml?= =?us-ascii?Q?lM55hHBB/Jyczioh/F1k+vlvBYfYPQm0E05MnWjahlasWQDu+C4ZCQ+dIknG?= =?us-ascii?Q?ViVUdW7kWsmsT6rATWoaJPy/KdlMKt5elx5MuLx2x+UjEAi1q+nO/0xlHCYr?= =?us-ascii?Q?1f3m0vOlUSA77fjnnstEWDXb/ipfMLwqgiuXn4HIk4B0E/zgMac8P1g1Svcs?= =?us-ascii?Q?N/I9UEcVNIo8SIeA0vQdvolVKxcdS+Z/WkVan2pqP/Gv2OH4x9cQtsMG/tr8?= =?us-ascii?Q?KO2NDR1IfY2JEkl90XnTCxMd4r+KEL79Miz6hax/p/B8VjNCYoVAF1TKLvOb?= =?us-ascii?Q?fACXJEtc/pT5HBS2xAyAhlROHqyyhdc7JoISAci4lvCMsdkg/F/vJ3s0Tw9x?= =?us-ascii?Q?zSP4E3DYMAuR7pjPSgXfeNmXVL9Tnv1xcBKzXCrrZ1v0AaFRalxm+eIswcVf?= =?us-ascii?Q?ysEUfWaJkC5Hq5NhMnsyv4pCCJH8+MzI/4LVX0m6tJ8cGEimmxnkJAvhfsWV?= =?us-ascii?Q?OJvo3POpA/SJXwLK2ZSEeEOXpRKzCxJ6rwjrirF3HGQHH3I+k9uKcthbsvSR?= =?us-ascii?Q?p5zxGO6KG1NrbesbRUwssrxU7dt4D88YfDuuETZnHaih4ngnxrPhUb2ndXha?= =?us-ascii?Q?b1ga6XyEVX1weG0gt8T8qL5twz88/j+xV1rWpC1yYE8Y+UJsfn1M4hbp2ngM?= =?us-ascii?Q?RVTiQNNfanEXJh/5VXcHNz/X/fp/RvTrIiAwNn7krzJY5H3ymtcJWgVwq1Dn?= =?us-ascii?Q?hOHWs+OCHqqtFR4Vu3dsdcSL2hwLBuwi4o9fvbr6obxoHjHKAXnMdxSqJ+jX?= =?us-ascii?Q?EaDTG7tRDEWhUzzg20I15tYPyyxOdUjQObYoEVkru1+7mTiPNLl6lyTdjCxr?= =?us-ascii?Q?9X8OE4Fnh/EtrE1rWkVnvzDAlH07aafCqgF/RZ0719RuavT4e5CnR1pFcP9n?= =?us-ascii?Q?mQE0NChbvlFxb5GucYZlep/PDYbLAg2PF0TGb8uyk4Ib14sYyEQGU/cyioh7?= =?us-ascii?Q?ZDJZvSwY66Ohn2QFs05ukuv58WEpkwCoSDUWLM1FmxpFOv0oyLpjqKA=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Antispam-Message-Info: YreWvCiMxhu3gRso7GsxBzku28eiN7g2R/ULcc/SFIH+p/p/yaIx+ZaIemGo5QGoz6+umtdHCSdctknE84keBnRb/4ng4dCmaYUrDOou8A/ujj1uvpIeRnG8K66BiSIkpJ2FI1vWxEVl9r8fyZKbDchJt7LYIHYa2qNt2i7ZqLuc3OVnpWNPIyduVDHKJLDf X-Microsoft-Exchange-Diagnostics: 1; BY2PR0701MB2087; 6:1CAsD1sQCinbq5xDwb+Ors+eJYB0oCwZmGdk98L81WXTQbfKDw/TTqbcbJUvkqxifKTXigiJOGVeaeYf3Y9Dka29t9g5VqYs9OFsn+OBTKyA2EKxb0ubU5gdifxrA9pJRrNTVFyOu/1Cc71L3CV36S7V8vSGCArt3vRAkthsi6foxz/zV4ZxCXRzqYJF8OeZZB2PGMQYxFwnq5pEliSIq5Fwg9XdbsvkhzrrCZlDP/csJ06QWbroeWtwKSO7CK8Bhr2yVWU4xk14vdjhn+nXCVrPh828sDskVp0CSgTC4LJ6AkAYEnx/C62YM0eEoGlgPDLlcn2eFGwv/oKyeMZnBY9gtaGtnk12SH5eqxGSAtQ=; 5:Ni2wFti2NunwIodrQHZvPlTyMaADIXMcsxpob3xhaC8HAJjOnMuxMR67QJC3oZ7OdtE+dVdx85GIzBzBHZ8+cJId0eAZh85fOSDJAQjbBXlizM/G8ndX5VLihIzPgYBmjInoXSDXZpAGSqmKSi/ZT1xnrOLOcI0MxyUSD4tvl54=; 24:DWe1olQ6APFjtGWoy1NjlW7Wzjx13OXSUFR0N8mU/IF/+PCIpmvrhIIn+7uir8uP0rs/Z7KP8B6CqJeQSLIa2iiUOcpjNdueC/u22IXx97I=; 7:wmYia5Ny/FN7NmSSfhLQrVriJrNZyL3bIwfcmQokSDZqYrkmAkHTMyOHhR4y6O+bHgu+mhXTX3CRpofMnxb+Np3S/bCuI2pL4B0uwhLxUHBBqMiuY2IhiwCcdRQI7BrQ80Yfq6BlpQTYVvo1ep1pUTbBj8QdJ9Pwa6hvwsXsV+O7z5LGH1eU7QPMj2jzw51geNRgJmvLsaMdVjx3S/XWNwx1K1ODUMGlmoLFdIWSaqIHkGg3vHN28VNt74NGNYMp SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Mar 2018 18:16:59.1926 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ed1e2ce1-4e2d-4e01-08f4-08d588457265 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: BY2PR0701MB2087 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 --- 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 c9689f97c307..737492048d8a 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2356,6 +2356,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 6caccc52376a..dec3e2cdaffa 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -5520,6 +5520,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 79f538448364..011261a9d585 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -1911,7 +1911,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: @@ -1923,7 +1923,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 245005f1e93e..40f1f0ab67cc 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.