From patchwork Mon Dec 4 22:45:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 10091709 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 37F06600C5 for ; Mon, 4 Dec 2017 22:46:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2893B29387 for ; Mon, 4 Dec 2017 22:46:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1DB8F29447; Mon, 4 Dec 2017 22:46:00 +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 4CA1229444 for ; Mon, 4 Dec 2017 22:45:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752433AbdLDWp6 (ORCPT ); Mon, 4 Dec 2017 17:45:58 -0500 Received: from mail-sn1nam02on0051.outbound.protection.outlook.com ([104.47.36.51]:44697 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752155AbdLDWpm (ORCPT ); Mon, 4 Dec 2017 17:45:42 -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=ngOXV9Ix76mM0GVBlKy1GlHqTRlPro7vzpcMQQ63h8E=; b=TJVoqJkH+BxeQnd3wIPUSUeOSqoDQcrmz+MP1B3wOe2eOxE/eoi38Bwhh8sbfkcJprrawHPOEvTzSNwERaOCgj9vt9I/zh0yHwjPFduXVqelxeZ2gYh7UoTaZtEUnLlt2Ht79DrakxiFCiE3PbLfX/8vsKxFiyauHEzkMofl70M= Received: from SN1PR0701CA0084.namprd07.prod.outlook.com (10.163.126.52) by BLUPR0701MB1937.namprd07.prod.outlook.com (10.163.121.155) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.282.5; Mon, 4 Dec 2017 22:45:41 +0000 Received: from BL2FFO11FD008.protection.gbl (2a01:111:f400:7c09::127) by SN1PR0701CA0084.outlook.office365.com (2a01:111:e400:52fd::52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.282.5 via Frontend Transport; Mon, 4 Dec 2017 22:45:40 +0000 Authentication-Results: spf=none (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: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BL2FFO11FD008.mail.protection.outlook.com (10.173.161.4) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.20.239.4 via Frontend Transport; Mon, 4 Dec 2017 22:45:40 +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, 4 Dec 2017 14:45:20 -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 vB4MjKil003485; Mon, 4 Dec 2017 14:45:20 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id vB4MjK6N003484; Mon, 4 Dec 2017 14:45:20 -0800 From: Himanshu Madhani To: , CC: , Subject: [PATCH v3 10/22] qla2xxx: Relogin to target port on a cable swap Date: Mon, 4 Dec 2017 14:45:05 -0800 Message-ID: <20171204224517.3409-11-himanshu.madhani@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20171204224517.3409-1-himanshu.madhani@cavium.com> References: <20171204224517.3409-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)(6009001)(346002)(376002)(2980300002)(428002)(189002)(199003)(50226002)(76176011)(54906003)(110136005)(1076002)(8936002)(51416003)(356003)(8676002)(305945005)(5660300001)(72206003)(2950100002)(6666003)(16586007)(42186006)(316002)(81156014)(81166006)(86362001)(36756003)(101416001)(50466002)(33646002)(80596001)(69596002)(48376002)(4326008)(87636003)(478600001)(106466001)(105586002)(189998001)(2906002)(47776003); DIR:OUT; SFP:1101; SCL:1; SRVR:BLUPR0701MB1937; 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; BL2FFO11FD008; 1:TbSfaFJyc5GgCY/U5QQwZ1ORWGf9Ilh2fP5zQMyANAaL28FiIqwMWhGKHlPRp+7UFViicvsiwaUySk2NNIpTRUjkyBczg5Iq81HcX7jxo83NJof2czIl0yOUyy7slRku X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1fb3438f-78c2-417b-7515-08d53b68bede X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603286); SRVR:BLUPR0701MB1937; X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1937; 3:gTGk8lWusa0CJ+CYbNRAmp3aI6s9TeAUW6IgfkBvganNmE4asKioB1px0OouEN4cBgrbiQShbX62eyB4V5T0TRdLmWzxIkFZqNaJmHqHBnYvuEfyaJzALLjR+9ZLQDSsMi3HPke11jxqaFDnrcU15dK6o8nIpT/eTPklRWZhRuJGvrBKipARS4InbSslwjCmuDJECog3qR3BtU8TWhNrCBnklrZ25FMG+FauibHYdBg6ef/EzofTbZ/I1tdIXpTfb2gB4EfDck4YrErjBa/vUTOGJHNo+zXWqMH2h25RVEllOeFwmHeWwmP9Vxz63I8zDGcEeHCQiQWwMuu6Iepq0GEMcNttcYFZFqvdKK+lgrs=; 25:ouzTjI61u8ECU9deDTt+c+Dg3mDWhvESGI7TdhDmAWy/Fwse50FNYAMpB+YKLEJsUCXi5RcIfgbZ9oohjq8jMlczIUYtKD0mDA8oxDW1B/NpHPlfP2+61eTxqSfYV8M5sf6RFn9BUzVVtoaCs6ND2HMmQc/AbWoVJU6AVQi6pY6N/ki6bhTTI+Aktf6fSdV2al25krat+B1olmhvY5NdtyeDHtU9n/KaAQH1WnW275omZ2UP1RIULa6x6Oge6hcpp7GPQNTBDj1PFObdwbA8ucuHXhod5wlkvKOMbhpbbFG5/NuLfMkNXNrC/BMEbjjk4s21SrhsvKJ3QGkzhBc0Mw== X-MS-TrafficTypeDiagnostic: BLUPR0701MB1937: X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1937; 31:YZ0YZWqaqV62rnriSNtpZeuDypYxACB2GMiFLQOzvYcJ3y8rcRYU8nQT0FOA1c07g72vwXhQs253aRK75AQOtsx09vSaSwLcdRv4FUYhS8/vrOGE6R8DjXvjT4tvIt/kwldV43EesMD16z5Qe67VrZkfff1MA2gCfajpWXeGNnXksHpPyelrgKgECzu6pePgG9DeYyh0/KnjC0peZ0i9NpuFZRFuyTzVvwLqAdxA/zk=; 20:SvPZQC0fv5dzOj7maEGQTz7dh33XPyZn9Ja6axftxt+emgCiEaAC1VhIzvGKqJiog8HJARixUFzmrZ9dFbk0jpqt6fONUQNB+QlB00jgMu5SwA+BIGAAb4ravp4+i8tYYZd4IPU0O2rJAjKPp+Fm3jLyDKH7V1IH9N/7IqASe2y/xQav34HdKnwEVvd6sjA3MXWkJ0z8bZeY1Cb8q3m/IjJCYpi2oUHUd5AxdZ+ndZMiu8roG1cp4YLdoQ+Lz5DV/VHcLQvLUtTWTaKMfF4BCqKznLf3Kpirr3LiyTQO+5aQFPsjy2OG/Rn0N0eOLHI9THxUh7zrOadAJjoiyBZvR17+8CklQxawQWRL/PxWOJTzZC14cxNfSZanuAfts+m93npcc+FdTCGIUwpJD6MceXnATizkrSm8QD+i3NyqZ69phe4ZKZD+01ccvCNN2Oaloe8VB2XG9YWEoOOAKOOT+VSX/AMGS31gq9ZaCVDgvAoMNlwuxmV/WpHedKjQ9Bko X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(10201501046)(3231022)(6041248)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123558100)(20161123562025)(20161123564025)(6072148)(201708071742011); SRVR:BLUPR0701MB1937; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:BLUPR0701MB1937; X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1937; 4:l8SudiV29VEyynNUMtj2boC6+vI0rZPYoylPhmzNiBZKAWSioQjOSzDTnSDLqzeYRvxUnxot9wzjHam5NflKXSJRp/VtEEhOUa42sQR32DLcDuIkST1yRLqAwPeKNehG67/78W98X+oOR0vaHNLO9449W/LmcX8OZSjtV8BRaGpEqECHJvkcLwTjlqVFE62hAtfRypXpc4qkeUrVYM4MCpgF9XC+phIkfr7xXGwdB+o9NWtPS/+ellPEjAp/Z8bbUL1z3b4INIo4msNcm6gDXd0r+YRTcPVekBgY1MfGvWvwJq8WagbOA1qD9YWRFgdR X-Forefront-PRVS: 051158ECBB X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BLUPR0701MB1937; 23:DOKySdxFGeZJKoA82Z/QbCNJbgD5YPJmRrEvuVa?= =?us-ascii?Q?NKFUQNJhEbLdhP7B7/FdHlq2pt0ig/Eyokof+c+JJlxasGH841RNeRkyTXc+?= =?us-ascii?Q?MAdMBpTpDAprbLlqGiDygZR5DYSEy1qwrx/V5H8m1Uat38DoRoooqADBvjDl?= =?us-ascii?Q?Lp1Nb39K2uWFuRU/lHEOY1C7aa0YWHHf36W3RAU6XPdb3SWf7rHljnaPE9po?= =?us-ascii?Q?3QQEpBsIgHdcV6k0pPwKrWHRCdn8HZZ/xXOlR7ctwL6Z4V2s3k78HM/QSH/Z?= =?us-ascii?Q?BYHvpF8D5bIThS1yR+ti60Q1cK9i9aujaigI/CbBy89CSgR9r0BRQ9EO+Muk?= =?us-ascii?Q?n6vBWut/d6iBPHYpN2Gd6js231aueKvFiv7UClaaiPXZ8T+fZ8Kz3OiZU+aG?= =?us-ascii?Q?zg+lj58SAKL6BQvhwqPXgBwr1dRxzDplOsCDo1WEQyZXvhpR8aRbsEC0s7Fi?= =?us-ascii?Q?8a6z0g9PvvJNhKL7qos+GyIi7ciCC3Ju6wtV+z/IUY6Euq4bxvybVpZihBmY?= =?us-ascii?Q?v0neEHoUNuWJ4w5GDfEloUcqE9wuM/bk6Z9WQNaT3UsiFvJ6h+rvdBr4dLUo?= =?us-ascii?Q?J4emRTv6Vmd9+heEhoI3ovtk9qNiHkTdM1R8JEPo+bXT6G+ivrB4xGP9dYIl?= =?us-ascii?Q?QMM3AqpM453rwsPSt7p9N5E+c57ZN1nRrh40ktYxrjgNBhuLw0lRPj7zCdXK?= =?us-ascii?Q?5StSWxLlAYcQ+Tx+T8yd655WrrkIP7gvlTdhJ1R/gJhoZTpHgLD8gUipZFbt?= =?us-ascii?Q?2U5kDwuSr9My+p/hVeSD7SaRlslPGRZHwqjNNjEp+QnkB1yWFs7UwvnjjA43?= =?us-ascii?Q?tQDfY/qqcu/ZbZFmsikRlSPTpx9Vm/7TuWLWcFRHo7V1zwuuaPbRFM2gBSyg?= =?us-ascii?Q?JC275agcdsPDyflPXMa2sHFlb0V5Na1TlA4BewKuEiPSjwmzDOWgALMYYKnO?= =?us-ascii?Q?H1afatkJRIaAqLqr5oguWISfVR9NuMUKhBJSvt9ugT+mSzlgxwrFbaHHaJYj?= =?us-ascii?Q?JN0A=3D?= X-Microsoft-Exchange-Diagnostics: 1; BLUPR0701MB1937; 6:I1DXqKG/G457dN48Aw2kUwwTaiOkl/CPvXIq0aFZynntC9PozIzLZxn15oiXamc7kJvf/DRzBgvkGktDJSlhJrLUIFRgWvHS/AbdbRjvMR2T0zUfmufJpavl0KHPLS2+Ckz5Q56y9HXx7PHsfaPO9UTZa50DkaqZFpJgajlVSg+YbQsq2/JFmQD8bYTNxNQ+iLtvAVS3v4mIOIiM2423jdfpicfa7uiGPdQLYWAguxNXVT3+I/iV+sfAcEqJesUWvwfYcKm32m9fs2V8bQpHyNA6REJ/y8mCeG2Feu/2bUWAI3GeDvrxriEYDmIO76lZ+t6dZW49XcR5cSmtkYk5rmag5WOnAEqt+BrBzF4JIA8=; 5:kZQ187p4eKchJrCNW8xBeVD+FTGTsKtUoQlioAA3hsHriQ7UgyiAFTjgJNYDMY276ERKKzLQfGhgMUsZsHLwr6TFYPlhR3zeHGm6OEqy+5D1s/Zuo+azBDiEyZq9ru+MMR4E47xX4RiBs7Ca41TXJZKywgDqX3TInlEYxeQ1xqw=; 24:YN6FeHfO1AB7K+UchZGI68ymaPIv47ssFxoSVqw+zbw8FBGvYHnlzB6doiXUgJjIkz/bhqQOJCrhMEJBUoCSKJJOvRejKnEJNT2u6SiCWqE=; 7:HJQZasYgyY8vOa+IepOAowog0vIzlB6hywaRfb/3z0JSSS+E/Gl+qvoA8V3ZDwQXs6LLXdyKFnWyYb20dZ9cc/mB+fgZitCg5PxhcDuI5ZOTzGZVdkDQX//sDqM5aFyFQP771MIdUn0+nOxXgdfAUhvctpfegL9CoLWSNagRQ4I3OV3GuENtjQI/pkudV70p5AG61Ab+UztNlDxCSPdBytgsNwat9lc2sJRAG2/1uAEc9ymoWw5ksrUD7CvQxgOG SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Dec 2017 22:45:40.3468 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1fb3438f-78c2-417b-7515-08d53b68bede 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: BLUPR0701MB1937 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 If user swaps one target port for another target port for same switch port, the new target port is not being recognized by the driver. Current code assumes that old Target port has recovered from link down. The fix will ask switch what is the WWPN of a specific NportID (GPNID) rather than assuming it's the same Target port which has came back. Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery") Cc: # 4.10+ Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani Reviewed-by: Hannes Reinecke --- drivers/scsi/qla2xxx/qla_gs.c | 166 +++++++++++++++++++++++++++++--------- drivers/scsi/qla2xxx/qla_init.c | 6 +- drivers/scsi/qla2xxx/qla_os.c | 35 +++++++- drivers/scsi/qla2xxx/qla_target.c | 35 ++++++-- 4 files changed, 195 insertions(+), 47 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 59ecc4eda6cd..7d715e58901f 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c @@ -3171,43 +3171,136 @@ void qla24xx_async_gpnid_done(scsi_qla_host_t *vha, srb_t *sp) void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea) { - fc_port_t *fcport; - unsigned long flags; + fc_port_t *fcport, *conflict, *t; - spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); - fcport = qla2x00_find_fcport_by_wwpn(vha, ea->port_name, 1); - spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d port_id: %06x\n", + __func__, __LINE__, ea->id.b24); - if (fcport) { - /* cable moved. just plugged in */ - fcport->rscn_gen++; - fcport->d_id = ea->id; - fcport->scan_state = QLA_FCPORT_FOUND; - fcport->flags |= FCF_FABRIC_DEVICE; - - switch (fcport->disc_state) { - case DSC_DELETED: - ql_dbg(ql_dbg_disc, vha, 0x210d, - "%s %d %8phC login\n", __func__, __LINE__, - fcport->port_name); - qla24xx_fcport_handle_login(vha, fcport); - break; - case DSC_DELETE_PEND: - break; - default: - ql_dbg(ql_dbg_disc, vha, 0x2064, - "%s %d %8phC post del sess\n", - __func__, __LINE__, fcport->port_name); - qlt_schedule_sess_for_deletion_lock(fcport); - break; + if (ea->rc) { + /* cable is disconnected */ + list_for_each_entry_safe(fcport, t, &vha->vp_fcports, list) { + if (fcport->d_id.b24 == ea->id.b24) { + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC DS %d\n", + __func__, __LINE__, + fcport->port_name, + fcport->disc_state); + fcport->scan_state = QLA_FCPORT_SCAN; + switch (fcport->disc_state) { + case DSC_DELETED: + case DSC_DELETE_PEND: + break; + default: + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC post del sess\n", + __func__, __LINE__, + fcport->port_name); + qlt_schedule_sess_for_deletion_lock + (fcport); + break; + } + } } } else { - /* create new fcport */ - ql_dbg(ql_dbg_disc, vha, 0x2065, - "%s %d %8phC post new sess\n", - __func__, __LINE__, ea->port_name); + /* cable is connected */ + fcport = qla2x00_find_fcport_by_wwpn(vha, ea->port_name, 1); + if (fcport) { + list_for_each_entry_safe(conflict, t, &vha->vp_fcports, + list) { + if ((conflict->d_id.b24 == ea->id.b24) && + (fcport != conflict)) { + /* 2 fcports with conflict Nport ID or + * an existing fcport is having nport ID + * conflict with new fcport. + */ + + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC DS %d\n", + __func__, __LINE__, + conflict->port_name, + conflict->disc_state); + conflict->scan_state = QLA_FCPORT_SCAN; + switch (conflict->disc_state) { + case DSC_DELETED: + case DSC_DELETE_PEND: + break; + default: + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC post del sess\n", + __func__, __LINE__, + conflict->port_name); + qlt_schedule_sess_for_deletion_lock + (conflict); + break; + } + } + } - qla24xx_post_newsess_work(vha, &ea->id, ea->port_name, NULL); + fcport->rscn_gen++; + fcport->scan_state = QLA_FCPORT_FOUND; + fcport->flags |= FCF_FABRIC_DEVICE; + switch (fcport->disc_state) { + case DSC_LOGIN_COMPLETE: + /* recheck session is still intact. */ + ql_dbg(ql_dbg_disc, vha, 0x210d, + "%s %d %8phC revalidate session with ADISC\n", + __func__, __LINE__, fcport->port_name); + qla24xx_post_gpdb_work(vha, fcport, + PDO_FORCE_ADISC); + break; + case DSC_DELETED: + ql_dbg(ql_dbg_disc, vha, 0x210d, + "%s %d %8phC login\n", __func__, __LINE__, + fcport->port_name); + fcport->d_id = ea->id; + qla24xx_fcport_handle_login(vha, fcport); + break; + case DSC_DELETE_PEND: + fcport->d_id = ea->id; + break; + default: + fcport->d_id = ea->id; + break; + } + } else { + list_for_each_entry_safe(conflict, t, &vha->vp_fcports, + list) { + if (conflict->d_id.b24 == ea->id.b24) { + /* 2 fcports with conflict Nport ID or + * an existing fcport is having nport ID + * conflict with new fcport. + */ + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC DS %d\n", + __func__, __LINE__, + conflict->port_name, + conflict->disc_state); + + conflict->scan_state = QLA_FCPORT_SCAN; + switch (conflict->disc_state) { + case DSC_DELETED: + case DSC_DELETE_PEND: + break; + default: + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %d %8phC post del sess\n", + __func__, __LINE__, + conflict->port_name); + qlt_schedule_sess_for_deletion_lock + (conflict); + break; + } + } + } + + /* create new fcport */ + ql_dbg(ql_dbg_disc, vha, 0x2065, + "%s %d %8phC post new sess\n", + __func__, __LINE__, ea->port_name); + qla24xx_post_newsess_work(vha, &ea->id, + ea->port_name, NULL); + } } } @@ -3248,12 +3341,13 @@ static void qla2x00_async_gpnid_sp_done(void *s, int res) spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); if (res) { - if (res == QLA_FUNCTION_TIMEOUT) + if (res == QLA_FUNCTION_TIMEOUT) { qla24xx_post_gpnid_work(sp->vha, &ea.id); - sp->free(sp); - return; + sp->free(sp); + return; + } } else if (sp->gen1) { - /* There was anoter RSNC for this Nport ID */ + /* There was another RSCN for this Nport ID */ qla24xx_post_gpnid_work(sp->vha, &ea.id); sp->free(sp); return; diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 2f246996d3e2..7dd19785f820 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -925,6 +925,9 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea) * must have triggered the session to be re-validate. * session is still valid. */ + ql_dbg(ql_dbg_disc, vha, 0x20d6, + "%s %d %8phC session revalidate success\n", + __func__, __LINE__, fcport->port_name); fcport->disc_state = DSC_LOGIN_COMPLETE; } spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); @@ -1049,9 +1052,8 @@ void qla24xx_handle_rscn_event(fc_port_t *fcport, struct event_arg *ea) switch (fcport->disc_state) { case DSC_DELETED: case DSC_LOGIN_COMPLETE: - qla24xx_post_gidpn_work(fcport->vha, fcport); + qla24xx_post_gpnid_work(fcport->vha, &ea->id); break; - default: break; } diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index e71d99ba57f9..820d1c185beb 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -4760,10 +4760,39 @@ void qla24xx_create_new_sess(struct scsi_qla_host *vha, struct qla_work_evt *e) spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); if (fcport) { - if (pla) + if (pla) { qlt_plogi_ack_unref(vha, pla); - else - qla24xx_async_gffid(vha, fcport); + } else { + spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags); + tfcp = qla2x00_find_fcport_by_nportid(vha, + &e->u.new_sess.id, 1); + if (tfcp && (tfcp != fcport)) { + /* + * We have a conflict fcport with same NportID. + */ + ql_dbg(ql_dbg_disc, vha, 0xffff, + "%s %8phC found conflict b4 add. DS %d LS %d\n", + __func__, tfcp->port_name, tfcp->disc_state, + tfcp->fw_login_state); + + switch (tfcp->disc_state) { + case DSC_DELETED: + break; + case DSC_DELETE_PEND: + fcport->login_pause = 1; + tfcp->conflict = fcport; + break; + default: + fcport->login_pause = 1; + tfcp->conflict = fcport; + qlt_schedule_sess_for_deletion_lock + (tfcp); + break; + } + } + spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); + qla24xx_async_gnl(vha, fcport); + } } if (free_fcport) { diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 1bec8aebb7b6..283ff316e4b2 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -890,6 +890,17 @@ qlt_plogi_ack_link(struct scsi_qla_host *vha, struct qlt_plogi_ack_t *pla, iocb->u.isp24.port_id[1], iocb->u.isp24.port_id[0], pla->ref_count, pla, link); + if (link == QLT_PLOGI_LINK_CONFLICT) { + switch (sess->disc_state) { + case DSC_DELETED: + case DSC_DELETE_PEND: + pla->ref_count--; + return; + default: + break; + } + } + if (sess->plogi_link[link]) qlt_plogi_ack_unref(vha, sess->plogi_link[link]); @@ -4737,6 +4748,10 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha, sess->d_id = port_id; sess->login_gen++; + ql_dbg(ql_dbg_disc, vha, 0x20f9, + "%s %d %8phC DS %d\n", + __func__, __LINE__, sess->port_name, sess->disc_state); + switch (sess->disc_state) { case DSC_DELETED: qlt_plogi_ack_unref(vha, pla); @@ -4786,12 +4801,20 @@ static int qlt_24xx_handle_els(struct scsi_qla_host *vha, } if (conflict_sess) { - ql_dbg(ql_dbg_tgt_mgt, vha, 0xf09b, - "PRLI with conflicting sess %p port %8phC\n", - conflict_sess, conflict_sess->port_name); - qlt_send_term_imm_notif(vha, iocb, 1); - res = 0; - break; + switch (conflict_sess->disc_state) { + case DSC_DELETED: + case DSC_DELETE_PEND: + break; + default: + ql_dbg(ql_dbg_tgt_mgt, vha, 0xf09b, + "PRLI with conflicting sess %p port %8phC\n", + conflict_sess, conflict_sess->port_name); + conflict_sess->fw_login_state = + DSC_LS_PORT_UNAVAIL; + qlt_send_term_imm_notif(vha, iocb, 1); + res = 0; + break; + } } if (sess != NULL) {