|
@@ -8137,36 +8137,6 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
|
|
|
return sglq->sli4_xritag;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * lpfc_sli4_scmd_to_wqidx_distr - scsi command to SLI4 WQ index distribution
|
|
|
- * @phba: Pointer to HBA context object.
|
|
|
- *
|
|
|
- * This routine performs a roundrobin SCSI command to SLI4 FCP WQ index
|
|
|
- * distribution. This is called by __lpfc_sli_issue_iocb_s4() with the hbalock
|
|
|
- * held.
|
|
|
- *
|
|
|
- * Return: index into SLI4 fast-path FCP queue index.
|
|
|
- **/
|
|
|
-static inline int
|
|
|
-lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba)
|
|
|
-{
|
|
|
- struct lpfc_vector_map_info *cpup;
|
|
|
- int chann, cpu;
|
|
|
-
|
|
|
- if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_CPU
|
|
|
- && phba->cfg_fcp_io_channel > 1) {
|
|
|
- cpu = smp_processor_id();
|
|
|
- if (cpu < phba->sli4_hba.num_present_cpu) {
|
|
|
- cpup = phba->sli4_hba.cpu_map;
|
|
|
- cpup += cpu;
|
|
|
- return cpup->channel_id;
|
|
|
- }
|
|
|
- }
|
|
|
- chann = atomic_add_return(1, &phba->fcp_qidx);
|
|
|
- chann = (chann % phba->cfg_fcp_io_channel);
|
|
|
- return chann;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* lpfc_sli_iocb2wqe - Convert the IOCB to a work queue entry.
|
|
|
* @phba: Pointer to HBA context object.
|
|
@@ -8807,27 +8777,29 @@ int
|
|
|
lpfc_sli_calc_ring(struct lpfc_hba *phba, uint32_t ring_number,
|
|
|
struct lpfc_iocbq *piocb)
|
|
|
{
|
|
|
- if (phba->sli_rev == LPFC_SLI_REV4) {
|
|
|
- if (piocb->iocb_flag & (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {
|
|
|
- if (!(phba->cfg_fof) ||
|
|
|
- (!(piocb->iocb_flag & LPFC_IO_FOF))) {
|
|
|
- if (unlikely(!phba->sli4_hba.fcp_wq))
|
|
|
- return LPFC_HBA_ERROR;
|
|
|
- /*
|
|
|
- * 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;
|
|
|
- piocb->fcp_wqidx = 0;
|
|
|
- ring_number = LPFC_FCP_OAS_RING;
|
|
|
- }
|
|
|
+ if (phba->sli_rev < LPFC_SLI_REV4)
|
|
|
+ return ring_number;
|
|
|
+
|
|
|
+ if (piocb->iocb_flag & (LPFC_IO_FCP | LPFC_USE_FCPWQIDX)) {
|
|
|
+ if (!(phba->cfg_fof) ||
|
|
|
+ (!(piocb->iocb_flag & LPFC_IO_FOF))) {
|
|
|
+ if (unlikely(!phba->sli4_hba.fcp_wq))
|
|
|
+ return LPFC_HBA_ERROR;
|
|
|
+ /*
|
|
|
+ * 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,
|
|
|
+ piocb->context1);
|
|
|
+ ring_number = MAX_SLI3_CONFIGURED_RINGS +
|
|
|
+ piocb->fcp_wqidx;
|
|
|
+ } else {
|
|
|
+ if (unlikely(!phba->sli4_hba.oas_wq))
|
|
|
+ return LPFC_HBA_ERROR;
|
|
|
+ piocb->fcp_wqidx = 0;
|
|
|
+ ring_number = LPFC_FCP_OAS_RING;
|
|
|
}
|
|
|
}
|
|
|
return ring_number;
|