diff options
author | James Smart <james.smart@avagotech.com> | 2015-05-21 19:55:20 +0200 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-06-06 00:34:53 +0200 |
commit | a1efe163102fed8a3b5990a67cadb1193e630820 (patch) | |
tree | 4d32bb20472792cd8e04de219fb2074f4e361b93 /drivers/scsi | |
parent | lpfc: Correct reference counting of rport (diff) | |
download | linux-a1efe163102fed8a3b5990a67cadb1193e630820.tar.xz linux-a1efe163102fed8a3b5990a67cadb1193e630820.zip |
lpfc: Fix ABORTs WQ selection in terminate_rport_io
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>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 56f73682d4bd..41d337060f0a 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -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; } } |