scsi: lpfc: Fix handling of trunk links state reporting
authorJames Smart <jsmart2021@gmail.com>
Tue, 12 Mar 2019 23:30:25 +0000 (16:30 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 19 Mar 2019 17:15:09 +0000 (13:15 -0400)
If all the trunk links drop and a single link resumes, the link_state is
not properly reported. When trunked, the driver receives two async
cqes. One acqe reports the trunk link states, which the driver records.
The other cqe reports the overall state of the trunk. In the failing case,
the trunk link state acqe preceeds the overall trunk link state acqe. The
trunk link state acqe, as it's an "up" transition, calls a code path which
ensures a down transition before moving to the up state.  The down
transition had a side effect of clearing the just-saved trunk link states.

Fix by not clearing the trunk link states if we've already transitioned
to a down state.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hbadisc.c

index 75e9d46d44d428508da99a968d82291519a1c7d8..32cfa5c44c08ee3cb52cd8e3968211cfc360a0f9 100644 (file)
@@ -885,15 +885,9 @@ lpfc_linkdown(struct lpfc_hba *phba)
        LPFC_MBOXQ_t          *mb;
        int i;
 
-       if (phba->link_state == LPFC_LINK_DOWN) {
-               if (phba->sli4_hba.conf_trunk) {
-                       phba->trunk_link.link0.state = 0;
-                       phba->trunk_link.link1.state = 0;
-                       phba->trunk_link.link2.state = 0;
-                       phba->trunk_link.link3.state = 0;
-               }
+       if (phba->link_state == LPFC_LINK_DOWN)
                return 0;
-       }
+
        /* Block all SCSI stack I/Os */
        lpfc_scsi_dev_block(phba);