scsi: lpfc: Fix port stuck in bypassed state after LIP in PT2PT topology
authorJames Smart <jsmart2021@gmail.com>
Fri, 3 Jun 2022 17:43:26 +0000 (10:43 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Jun 2022 12:21:57 +0000 (14:21 +0200)
[ Upstream commit 336d63615466b4c06b9401c987813fd19bdde39b ]

After issuing a LIP, a specific target vendor does not ACC the FLOGI that
lpfc sends.  However, it does send its own FLOGI that lpfc ACCs.  The
target then establishes the port IDs by sending a PLOGI.  lpfc PLOGI_ACCs
and starts the RPI registration for DID 0x000001.  The target then sends a
LOGO to the fabric DID.  lpfc is currently treating the LOGO from the
fabric DID as a link down and cleans up all the ndlps.  The ndlp for DID
0x000001 is put back into NPR and discovery stops, leaving the port in
stuck in bypassed mode.

Change lpfc behavior such that if a LOGO is received for the fabric DID in
PT2PT topology skip the lpfc_linkdown_port() routine and just move the
fabric DID back to NPR.

Link: https://lore.kernel.org/r/20220603174329.63777-7-jsmart2021@gmail.com
Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_nportdisc.c

index fdf5e777bf113e9920a25f2108f8aaba70e07576..2bd35a7424c2582d0c5037e3b1cddd77ed1e0700 100644 (file)
@@ -810,7 +810,8 @@ lpfc_rcv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
                lpfc_nvmet_invalidate_host(phba, ndlp);
 
        if (ndlp->nlp_DID == Fabric_DID) {
-               if (vport->port_state <= LPFC_FDISC)
+               if (vport->port_state <= LPFC_FDISC ||
+                   vport->fc_flag & FC_PT2PT)
                        goto out;
                lpfc_linkdown_port(vport);
                spin_lock_irq(shost->host_lock);