lpfc: Fix ABORTs WQ selection in terminate_rport_io
authorJames Smart <james.smart@avagotech.com>
Thu, 21 May 2015 17:55:20 +0000 (13:55 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 5 Jun 2015 22:34:53 +0000 (15:34 -0700)
Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/lpfc/lpfc_sli.c

index 56f73682d4bd571f792faba2859e8266df30c834..41d337060f0a0a1781f895969960b0a93f0cdb49 100644 (file)
@@ -8792,30 +8792,40 @@ lpfc_sli_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
        return 0;
 }
 
+/**
+ * lpfc_sli_calc_ring - Calculates which ring to use
+ * @phba: Pointer to HBA context object.
+ * @ring_number: Initial ring
+ * @piocb: Pointer to command iocb.
+ *
+ * For SLI4, FCP IO can deferred to one fo many WQs, based on
+ * fcp_wqidx, thus we need to calculate the corresponding ring.
+ * Since ABORTS must go on the same WQ of the command they are
+ * aborting, we use command's fcp_wqidx.
+ */
 int
 lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number,
                    struct lpfc_iocbq *piocb)
 {
-       uint32_t idx;
-
        if (phba->sli_rev == LPFC_SLI_REV4) {
                if (piocb->iocb_flag &  (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {
-                       /*
-                        * fcp_wqidx should already be setup based on what
-                        * completion queue we want to use.
-                        */
                        if (!(phba->cfg_fof) ||
                            (!(piocb->iocb_flag & LPFC_IO_FOF))) {
                                if (unlikely(!phba->sli4_hba.fcp_wq))
                                        return LPFC_HBA_ERROR;
-                               idx = lpfc_sli4_scmd_to_wqidx_distr(phba);
-                               piocb->fcp_wqidx = idx;
-                               ring_number = MAX_SLI3_CONFIGURED_RINGS + idx;
+                               /*
+                                * for abort iocb fcp_wqidx should already
+                                * be setup based on what work queue we used.
+                                */
+                               if (!(piocb->iocb_flag & LPFC_USE_FCPWQIDX))
+                                       piocb->fcp_wqidx =
+                                           lpfc_sli4_scmd_to_wqidx_distr(phba);
+                               ring_number = MAX_SLI3_CONFIGURED_RINGS +
+                                               piocb->fcp_wqidx;
                        } else {
                                if (unlikely(!phba->sli4_hba.oas_wq))
                                        return LPFC_HBA_ERROR;
-                               idx = 0;
-                               piocb->fcp_wqidx = idx;
+                               piocb->fcp_wqidx = 0;
                                ring_number =  LPFC_FCP_OAS_RING;
                        }
                }