]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: lpfc: Fix ELS abort on SLI-3 adapters
authorJames Smart <jsmart2021@gmail.com>
Wed, 1 Aug 2018 00:23:18 +0000 (17:23 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 2 Aug 2018 19:45:18 +0000 (15:45 -0400)
For ABORT_XRI_CN command, firmware identifies XRI to abort by IOTAG and RPI
combination. For ELS aborts, driver specifies IOTAG correctly but RPI is
not specified.

Fix by setting RPI in WQE.

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

index 1f0a7d7dbc54fedff87759df82ea04c7e7448fa9..843e765db86d89d582c5acf6ca89178f720e7715 100644 (file)
@@ -1062,6 +1062,9 @@ lpfc_rcv_logo_plogi_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 {
        struct lpfc_iocbq *cmdiocb = (struct lpfc_iocbq *) arg;
 
+       /* Retrieve RPI from LOGO IOCB. RPI is used for CMD_ABORT_XRI_CN */
+       if (vport->phba->sli_rev == LPFC_SLI_REV3)
+               ndlp->nlp_rpi = cmdiocb->iocb.ulpIoTag;
                                /* software abort outstanding PLOGI */
        lpfc_els_abort(vport->phba, ndlp);
 
index 72500dcb13a9028367577bc190358cb9c839e076..9830bdb6e072625cd75e46d8b4b99845e739305d 100644 (file)
@@ -10703,6 +10703,12 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 
                spin_lock_irq(&phba->hbalock);
                if (phba->sli_rev < LPFC_SLI_REV4) {
+                       if (irsp->ulpCommand == CMD_ABORT_XRI_CX &&
+                           irsp->ulpStatus == IOSTAT_LOCAL_REJECT &&
+                           irsp->un.ulpWord[4] == IOERR_ABORT_REQUESTED) {
+                               spin_unlock_irq(&phba->hbalock);
+                               goto release_iocb;
+                       }
                        if (abort_iotag != 0 &&
                                abort_iotag <= phba->sli.last_iotag)
                                abort_iocb =
@@ -10724,6 +10730,7 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 
                spin_unlock_irq(&phba->hbalock);
        }
+release_iocb:
        lpfc_sli_release_iocbq(phba, cmdiocb);
        return;
 }
@@ -10780,6 +10787,7 @@ lpfc_sli_abort_iotag_issue(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
        IOCB_t *iabt = NULL;
        int retval;
        unsigned long iflags;
+       struct lpfc_nodelist *ndlp;
 
        lockdep_assert_held(&phba->hbalock);
 
@@ -10810,9 +10818,13 @@ lpfc_sli_abort_iotag_issue(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
        if (phba->sli_rev == LPFC_SLI_REV4) {
                iabt->un.acxri.abortIoTag = cmdiocb->sli4_xritag;
                iabt->un.acxri.abortContextTag = cmdiocb->iotag;
-       }
-       else
+       } else {
                iabt->un.acxri.abortIoTag = icmd->ulpIoTag;
+               if (pring->ringno == LPFC_ELS_RING) {
+                       ndlp = (struct lpfc_nodelist *)(cmdiocb->context1);
+                       iabt->un.acxri.abortContextTag = ndlp->nlp_rpi;
+               }
+       }
        iabt->ulpLe = 1;
        iabt->ulpClass = icmd->ulpClass;