scsi: lpfc: Fix WQ|CQ|EQ resource check
authorJustin Tee <justin.tee@broadcom.com>
Wed, 16 Nov 2022 01:19:16 +0000 (17:19 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 17 Nov 2022 18:18:42 +0000 (18:18 +0000)
Adapter configurations with limited EQ resources may fail to initialize.

Firmware resources are queried in lpfc_sli4_read_config().  The driver
parameters cfg_irq_chann and cfg_hdw_queue are adjusted from defaults if
constrained by firmware resources.

The minimum resource check includes a special allocation for queues such as
ELS, MBOX, NVME LS. However the additional reservation was also incorrectly
applied to EQ resources.

Reordered WQ|CQ|EQ resource checks to apply the special allocation
adjustment to WQ and CQ resources only.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20221116011921.105995-2-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_init.c

index b49c395..a6e32ec 100644 (file)
@@ -10092,17 +10092,15 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
                qmin = phba->sli4_hba.max_cfg_param.max_wq;
                if (phba->sli4_hba.max_cfg_param.max_cq < qmin)
                        qmin = phba->sli4_hba.max_cfg_param.max_cq;
-               if (phba->sli4_hba.max_cfg_param.max_eq < qmin)
-                       qmin = phba->sli4_hba.max_cfg_param.max_eq;
                /*
-                * Whats left after this can go toward NVME / FCP.
-                * The minus 4 accounts for ELS, NVME LS, MBOX
-                * plus one extra. When configured for
-                * NVMET, FCP io channel WQs are not created.
+                * Reserve 4 (ELS, NVME LS, MBOX, plus one extra) and
+                * the remainder can be used for NVME / FCP.
                 */
                qmin -= 4;
+               if (phba->sli4_hba.max_cfg_param.max_eq < qmin)
+                       qmin = phba->sli4_hba.max_cfg_param.max_eq;
 
-               /* Check to see if there is enough for NVME */
+               /* Check to see if there is enough for default cfg */
                if ((phba->cfg_irq_chann > qmin) ||
                    (phba->cfg_hdw_queue > qmin)) {
                        lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,