scsi: lpfc: Increase CQ and WQ sizes for SCSI
authorJames Smart <jsmart2021@gmail.com>
Tue, 30 Jan 2018 23:58:46 +0000 (15:58 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 12 Feb 2018 16:43:22 +0000 (11:43 -0500)
Increased CQ and WQ sizes for SCSI FCP, matching those used for NVMe
development.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_sli4.h

index 61fb46d..d042f91 100644 (file)
@@ -760,6 +760,7 @@ struct lpfc_hba {
        uint8_t  mds_diags_support;
        uint32_t initial_imax;
        uint8_t  bbcredit_support;
+       uint8_t  enab_exp_wqcq_pages;
 
        /* HBA Config Parameters */
        uint32_t cfg_ack0;
index 73c2f69..ef46912 100644 (file)
@@ -3212,6 +3212,9 @@ struct lpfc_sli4_parameters {
 #define cfg_cqv_SHIFT                          14
 #define cfg_cqv_MASK                           0x00000003
 #define cfg_cqv_WORD                           word4
+#define cfg_cqpsize_SHIFT                      16
+#define cfg_cqpsize_MASK                       0x000000ff
+#define cfg_cqpsize_WORD                       word4
        uint32_t word5;
        uint32_t word6;
 #define cfg_mqv_SHIFT                          14
index f539c55..40ffa01 100644 (file)
@@ -8011,9 +8011,10 @@ static int
 lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
 {
        struct lpfc_queue *qdesc;
+       uint32_t wqesize;
 
        /* Create Fast Path FCP CQs */
-       if (phba->fcp_embed_io)
+       if (phba->enab_exp_wqcq_pages)
                /* Increase the CQ size when WQEs contain an embedded cdb */
                qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE,
                                              phba->sli4_hba.cq_esize,
@@ -8031,15 +8032,18 @@ lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
        phba->sli4_hba.fcp_cq[wqidx] = qdesc;
 
        /* Create Fast Path FCP WQs */
-       if (phba->fcp_embed_io)
+       if (phba->enab_exp_wqcq_pages) {
                /* Increase the WQ size when WQEs contain an embedded cdb */
+               wqesize = (phba->fcp_embed_io) ?
+                       LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize;
                qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE,
-                                             LPFC_WQE128_SIZE,
+                                             wqesize,
                                              LPFC_WQE_EXP_COUNT);
-       else
+       else
                qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
                                              phba->sli4_hba.wq_esize,
                                              phba->sli4_hba.wq_ecount);
+
        if (!qdesc) {
                lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                "0503 Failed allocate fast-path FCP WQ (%d)\n",
@@ -10476,15 +10480,21 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
                sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE;
 
        /*
-        * Issue IOs with CDB embedded in WQE to minimized the number
-        * of DMAs the firmware has to do. Setting this to 1 also forces
-        * the driver to use 128 bytes WQEs for FCP IOs.
+        * Check whether the adapter supports an embedded copy of the
+        * FCP CMD IU within the WQE for FCP_Ixxx commands. In order
+        * to use this option, 128-byte WQEs must be used.
         */
        if (bf_get(cfg_ext_embed_cb, mbx_sli4_parameters))
                phba->fcp_embed_io = 1;
        else
                phba->fcp_embed_io = 0;
 
+       if ((bf_get(cfg_cqpsize, mbx_sli4_parameters) & LPFC_CQ_16K_PAGE_SZ) &&
+           (bf_get(cfg_wqpsize, mbx_sli4_parameters) & LPFC_WQ_16K_PAGE_SZ) &&
+           (sli4_params->wqsize & LPFC_WQ_SZ128_SUPPORT))
+               phba->enab_exp_wqcq_pages = 1;
+       else
+               phba->enab_exp_wqcq_pages = 0;
        /*
         * Check if the SLI port supports MDS Diagnostics
         */
@@ -12227,6 +12237,7 @@ int
 lpfc_fof_queue_create(struct lpfc_hba *phba)
 {
        struct lpfc_queue *qdesc;
+       uint32_t wqesize;
 
        /* Create FOF EQ */
        qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
@@ -12240,7 +12251,7 @@ lpfc_fof_queue_create(struct lpfc_hba *phba)
        if (phba->cfg_fof) {
 
                /* Create OAS CQ */
-               if (phba->fcp_embed_io)
+               if (phba->enab_exp_wqcq_pages)
                        qdesc = lpfc_sli4_queue_alloc(phba,
                                                      LPFC_EXPANDED_PAGE_SIZE,
                                                      phba->sli4_hba.cq_esize,
@@ -12256,16 +12267,19 @@ lpfc_fof_queue_create(struct lpfc_hba *phba)
                phba->sli4_hba.oas_cq = qdesc;
 
                /* Create OAS WQ */
-               if (phba->fcp_embed_io)
+               if (phba->enab_exp_wqcq_pages) {
+                       wqesize = (phba->fcp_embed_io) ?
+                               LPFC_WQE128_SIZE : phba->sli4_hba.wq_esize;
                        qdesc = lpfc_sli4_queue_alloc(phba,
                                                      LPFC_EXPANDED_PAGE_SIZE,
-                                                     LPFC_WQE128_SIZE,
+                                                     wqesize,
                                                      LPFC_WQE_EXP_COUNT);
-               else
+               else
                        qdesc = lpfc_sli4_queue_alloc(phba,
                                                      LPFC_DEFAULT_PAGE_SIZE,
                                                      phba->sli4_hba.wq_esize,
                                                      phba->sli4_hba.wq_ecount);
+
                if (!qdesc)
                        goto out_error;
 
index 149f21f..d08d9b4 100644 (file)
@@ -14910,7 +14910,8 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
        bf_set(lpfc_mbox_hdr_version, &shdr->request,
               phba->sli4_hba.pc_sli4_params.wqv);
 
-       if (phba->sli4_hba.pc_sli4_params.wqsize & LPFC_WQ_SZ128_SUPPORT)
+       if ((phba->sli4_hba.pc_sli4_params.wqsize & LPFC_WQ_SZ128_SUPPORT) ||
+           (wq->page_size > SLI4_PAGE_SIZE))
                wq_create_version = LPFC_Q_CREATE_VERSION_1;
        else
                wq_create_version = LPFC_Q_CREATE_VERSION_0;
index 81fb58e..a9af998 100644 (file)
@@ -485,6 +485,11 @@ struct lpfc_pc_sli4_params {
        uint8_t wqpcnt;
 };
 
+#define LPFC_CQ_4K_PAGE_SZ     0x1
+#define LPFC_CQ_16K_PAGE_SZ    0x4
+#define LPFC_WQ_4K_PAGE_SZ     0x1
+#define LPFC_WQ_16K_PAGE_SZ    0x4
+
 struct lpfc_iov {
        uint32_t pf_number;
        uint32_t vf_number;