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 7c3afc3..52fe28a 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 aa7872a..f2d2fae 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 0539585..6dd8535 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);