Commit a1efe163 authored by James Smart's avatar James Smart Committed by James Bottomley

lpfc: Fix ABORTs WQ selection in terminate_rport_io

Signed-off-by: default avatarDick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: default avatarJames Smart <james.smart@avagotech.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent 7aafb6e7
...@@ -8792,30 +8792,40 @@ lpfc_sli_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp) ...@@ -8792,30 +8792,40 @@ lpfc_sli_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
return 0; 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 int
lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number, lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number,
struct lpfc_iocbq *piocb) struct lpfc_iocbq *piocb)
{ {
uint32_t idx;
if (phba->sli_rev == LPFC_SLI_REV4) { if (phba->sli_rev == LPFC_SLI_REV4) {
if (piocb->iocb_flag & (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) { 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) || if (!(phba->cfg_fof) ||
(!(piocb->iocb_flag & LPFC_IO_FOF))) { (!(piocb->iocb_flag & LPFC_IO_FOF))) {
if (unlikely(!phba->sli4_hba.fcp_wq)) if (unlikely(!phba->sli4_hba.fcp_wq))
return LPFC_HBA_ERROR; return LPFC_HBA_ERROR;
idx = lpfc_sli4_scmd_to_wqidx_distr(phba); /*
piocb->fcp_wqidx = idx; * for abort iocb fcp_wqidx should already
ring_number = MAX_SLI3_CONFIGURED_RINGS + idx; * 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 { } else {
if (unlikely(!phba->sli4_hba.oas_wq)) if (unlikely(!phba->sli4_hba.oas_wq))
return LPFC_HBA_ERROR; return LPFC_HBA_ERROR;
idx = 0; piocb->fcp_wqidx = 0;
piocb->fcp_wqidx = idx;
ring_number = LPFC_FCP_OAS_RING; ring_number = LPFC_FCP_OAS_RING;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment