Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

lpfc: Fix ABORTs WQ selection in terminate_rport_io

parent 7aafb6e7
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -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;
			}
		}