scsi: lpfc: Validate adapter support for SRIU option
authorJames Smart <jsmart2021@gmail.com>
Tue, 30 Jan 2018 23:58:58 +0000 (15:58 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 12 Feb 2018 16:43:24 +0000 (11:43 -0500)
When using the special option to suppress the response iu, ensure the
adapter fully supports the feature by checking feature flags from the
adapter and validating the support when formatting the WQE.

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

index 7c3afc3d3121ec942e0239018358ccab52ab68f1..52fe28ae50faf80d865b4d4b7494e1a1a7213ec7 100644 (file)
@@ -3293,6 +3293,9 @@ struct lpfc_sli4_parameters {
 #define cfg_eqdr_SHIFT                         8
 #define cfg_eqdr_MASK                          0x00000001
 #define cfg_eqdr_WORD                          word19
+#define cfg_nosr_SHIFT                         9
+#define cfg_nosr_MASK                          0x00000001
+#define cfg_nosr_WORD                          word19
 #define LPFC_NODELAY_MAX_IO            32
 };
 
index aa7872a7b493206e635b9c7533a000cc28618c1a..f2d2faef8710b22fc07ed9e9daba786c60cc6284 100644 (file)
@@ -10473,8 +10473,19 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
                phba->cfg_enable_fc4_type = LPFC_ENABLE_FCP;
        }
 
-       if (bf_get(cfg_xib, mbx_sli4_parameters) && phba->cfg_suppress_rsp)
+       /*
+        * To support Suppress Response feature we must satisfy 3 conditions.
+        * lpfc_suppress_rsp module parameter must be set (default).
+        * In SLI4-Parameters Descriptor:
+        * Extended Inline Buffers (XIB) must be supported.
+        * Suppress Response IU Not Supported (SRIUNS) must NOT be supported
+        * (double negative).
+        */
+       if (phba->cfg_suppress_rsp && bf_get(cfg_xib, mbx_sli4_parameters) &&
+           !(bf_get(cfg_nosr, mbx_sli4_parameters)))
                phba->sli.sli_flag |= LPFC_SLI_SUPPRESS_RSP;
+       else
+               phba->cfg_suppress_rsp = 0;
 
        if (bf_get(cfg_eqdr, mbx_sli4_parameters))
                phba->sli.sli_flag |= LPFC_SLI_USE_EQDR;
index 0539585d32d4e1fc5546a42fe3abd0d19c87336a..6dd8535918f6a8365da4e8c1a7833877196f95d0 100644 (file)
@@ -2290,9 +2290,10 @@ lpfc_nvmet_prep_fcp_wqe(struct lpfc_hba *phba,
                if (rsp->op == NVMET_FCOP_READDATA_RSP) {
                        atomic_inc(&tgtp->xmt_fcp_read_rsp);
                        bf_set(wqe_ar, &wqe->fcp_tsend.wqe_com, 1);
-                       if ((ndlp->nlp_flag & NLP_SUPPRESS_RSP) &&
-                           (rsp->rsplen == 12)) {
-                               bf_set(wqe_sup, &wqe->fcp_tsend.wqe_com, 1);
+                       if (rsp->rsplen == LPFC_NVMET_SUCCESS_LEN) {
+                               if (ndlp->nlp_flag & NLP_SUPPRESS_RSP)
+                                       bf_set(wqe_sup,
+                                              &wqe->fcp_tsend.wqe_com, 1);
                                bf_set(wqe_wqes, &wqe->fcp_tsend.wqe_com, 0);
                                bf_set(wqe_irsp, &wqe->fcp_tsend.wqe_com, 0);
                                bf_set(wqe_irsplen, &wqe->fcp_tsend.wqe_com, 0);