Merge branch 'for-4.14-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
[sfrench/cifs-2.6.git] / drivers / scsi / lpfc / lpfc_attr.c
index 7ee1a94c0b33eefd57a6889df66649477ad4713b..c17677f494afe7f9baf741732511c62d4ea0bde7 100644 (file)
@@ -247,13 +247,10 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
                                atomic_read(&tgtp->xmt_abort_rsp),
                                atomic_read(&tgtp->xmt_abort_rsp_error));
 
-               spin_lock(&phba->sli4_hba.nvmet_ctx_get_lock);
-               spin_lock(&phba->sli4_hba.nvmet_ctx_put_lock);
-               tot = phba->sli4_hba.nvmet_xri_cnt -
-                       (phba->sli4_hba.nvmet_ctx_get_cnt +
-                       phba->sli4_hba.nvmet_ctx_put_cnt);
-               spin_unlock(&phba->sli4_hba.nvmet_ctx_put_lock);
-               spin_unlock(&phba->sli4_hba.nvmet_ctx_get_lock);
+               /* Calculate outstanding IOs */
+               tot = atomic_read(&tgtp->rcv_fcp_cmd_drop);
+               tot += atomic_read(&tgtp->xmt_fcp_release);
+               tot = atomic_read(&tgtp->rcv_fcp_cmd_in) - tot;
 
                len += snprintf(buf + len, PAGE_SIZE - len,
                                "IO_CTX: %08x  WAIT: cur %08x tot %08x\n"
@@ -1893,6 +1890,36 @@ static inline bool lpfc_rangecheck(uint val, uint min, uint max)
        return val >= min && val <= max;
 }
 
+/**
+ * lpfc_enable_bbcr_set: Sets an attribute value.
+ * @phba: pointer the the adapter structure.
+ * @val: integer attribute value.
+ *
+ * Description:
+ * Validates the min and max values then sets the
+ * adapter config field if in the valid range. prints error message
+ * and does not set the parameter if invalid.
+ *
+ * Returns:
+ * zero on success
+ * -EINVAL if val is invalid
+ */
+static ssize_t
+lpfc_enable_bbcr_set(struct lpfc_hba *phba, uint val)
+{
+       if (lpfc_rangecheck(val, 0, 1) && phba->sli_rev == LPFC_SLI_REV4) {
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                               "3068 %s_enable_bbcr changed from %d to %d\n",
+                               LPFC_DRIVER_NAME, phba->cfg_enable_bbcr, val);
+               phba->cfg_enable_bbcr = val;
+               return 0;
+       }
+       lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                       "0451 %s_enable_bbcr cannot set to %d, range is 0, 1\n",
+                       LPFC_DRIVER_NAME, val);
+       return -EINVAL;
+}
+
 /**
  * lpfc_param_show - Return a cfg attribute value in decimal
  *
@@ -5116,6 +5143,14 @@ LPFC_ATTR_R(sg_seg_cnt, LPFC_DEFAULT_SG_SEG_CNT, LPFC_DEFAULT_SG_SEG_CNT,
  */
 LPFC_ATTR_R(enable_mds_diags, 0, 0, 1, "Enable MDS Diagnostics");
 
+/*
+ * lpfc_enable_bbcr: Enable BB Credit Recovery
+ *       0  = BB Credit Recovery disabled
+ *       1  = BB Credit Recovery enabled (default)
+ * Value range is [0,1]. Default value is 1.
+ */
+LPFC_BBCR_ATTR_RW(enable_bbcr, 1, 0, 1, "Enable BBC Recovery");
+
 struct device_attribute *lpfc_hba_attrs[] = {
        &dev_attr_nvme_info,
        &dev_attr_bg_info,
@@ -5223,6 +5258,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
        &dev_attr_protocol,
        &dev_attr_lpfc_xlane_supported,
        &dev_attr_lpfc_enable_mds_diags,
+       &dev_attr_lpfc_enable_bbcr,
        NULL,
 };
 
@@ -6234,11 +6270,13 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
        lpfc_nvmet_fb_size_init(phba, lpfc_nvmet_fb_size);
        lpfc_fcp_io_channel_init(phba, lpfc_fcp_io_channel);
        lpfc_nvme_io_channel_init(phba, lpfc_nvme_io_channel);
+       lpfc_enable_bbcr_init(phba, lpfc_enable_bbcr);
 
        if (phba->sli_rev != LPFC_SLI_REV4) {
                /* NVME only supported on SLI4 */
                phba->nvmet_support = 0;
                phba->cfg_enable_fc4_type = LPFC_ENABLE_FCP;
+               phba->cfg_enable_bbcr = 0;
        } else {
                /* We MUST have FCP support */
                if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP))