|
@@ -3617,6 +3617,91 @@ lpfc_sriov_nr_virtfn_init(struct lpfc_hba *phba, int val)
|
|
|
static DEVICE_ATTR(lpfc_sriov_nr_virtfn, S_IRUGO | S_IWUSR,
|
|
|
lpfc_sriov_nr_virtfn_show, lpfc_sriov_nr_virtfn_store);
|
|
|
|
|
|
+/**
|
|
|
+ * lpfc_fcp_imax_store
|
|
|
+ *
|
|
|
+ * @dev: class device that is converted into a Scsi_host.
|
|
|
+ * @attr: device attribute, not used.
|
|
|
+ * @buf: string with the number of fast-path FCP interrupts per second.
|
|
|
+ * @count: unused variable.
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * If val is in a valid range [636,651042], then set the adapter's
|
|
|
+ * maximum number of fast-path FCP interrupts per second.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * length of the buf on success if val is in range the intended mode
|
|
|
+ * is supported.
|
|
|
+ * -EINVAL if val out of range or intended mode is not supported.
|
|
|
+ **/
|
|
|
+static ssize_t
|
|
|
+lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct Scsi_Host *shost = class_to_shost(dev);
|
|
|
+ struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
|
|
|
+ struct lpfc_hba *phba = vport->phba;
|
|
|
+ int val = 0, i;
|
|
|
+
|
|
|
+ /* Sanity check on user data */
|
|
|
+ if (!isdigit(buf[0]))
|
|
|
+ return -EINVAL;
|
|
|
+ if (sscanf(buf, "%i", &val) != 1)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* Value range is [636,651042] */
|
|
|
+ if (val < LPFC_MIM_IMAX || val > LPFC_DMULT_CONST)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ phba->cfg_fcp_imax = (uint32_t)val;
|
|
|
+ for (i = 0; i < phba->cfg_fcp_eq_count; i += LPFC_MAX_EQ_DELAY)
|
|
|
+ lpfc_modify_fcp_eq_delay(phba, i);
|
|
|
+
|
|
|
+ return strlen(buf);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+# lpfc_fcp_imax: The maximum number of fast-path FCP interrupts per second
|
|
|
+#
|
|
|
+# Value range is [636,651042]. Default value is 10000.
|
|
|
+*/
|
|
|
+static int lpfc_fcp_imax = LPFC_FP_DEF_IMAX;
|
|
|
+module_param(lpfc_fcp_imax, int, S_IRUGO|S_IWUSR);
|
|
|
+MODULE_PARM_DESC(lpfc_fcp_imax,
|
|
|
+ "Set the maximum number of fast-path FCP interrupts per second");
|
|
|
+lpfc_param_show(fcp_imax)
|
|
|
+
|
|
|
+/**
|
|
|
+ * lpfc_fcp_imax_init - Set the initial sr-iov virtual function enable
|
|
|
+ * @phba: lpfc_hba pointer.
|
|
|
+ * @val: link speed value.
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * If val is in a valid range [636,651042], then initialize the adapter's
|
|
|
+ * maximum number of fast-path FCP interrupts per second.
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * zero if val saved.
|
|
|
+ * -EINVAL val out of range
|
|
|
+ **/
|
|
|
+static int
|
|
|
+lpfc_fcp_imax_init(struct lpfc_hba *phba, int val)
|
|
|
+{
|
|
|
+ if (val >= LPFC_MIM_IMAX && val <= LPFC_DMULT_CONST) {
|
|
|
+ phba->cfg_fcp_imax = val;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
|
|
+ "3016 fcp_imax: %d out of range, using default\n", val);
|
|
|
+ phba->cfg_fcp_imax = LPFC_FP_DEF_IMAX;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static DEVICE_ATTR(lpfc_fcp_imax, S_IRUGO | S_IWUSR,
|
|
|
+ lpfc_fcp_imax_show, lpfc_fcp_imax_store);
|
|
|
+
|
|
|
/*
|
|
|
# lpfc_fcp_class: Determines FC class to use for the FCP protocol.
|
|
|
# Value range is [2,3]. Default value is 3.
|
|
@@ -3757,14 +3842,6 @@ LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
|
|
|
LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or "
|
|
|
"MSI-X (2), if possible");
|
|
|
|
|
|
-/*
|
|
|
-# lpfc_fcp_imax: Set the maximum number of fast-path FCP interrupts per second
|
|
|
-#
|
|
|
-# Value range is [636,651042]. Default value is 10000.
|
|
|
-*/
|
|
|
-LPFC_ATTR_R(fcp_imax, LPFC_FP_DEF_IMAX, LPFC_MIM_IMAX, LPFC_DMULT_CONST,
|
|
|
- "Set the maximum number of fast-path FCP interrupts per second");
|
|
|
-
|
|
|
/*
|
|
|
# lpfc_fcp_wq_count: Set the number of fast-path FCP work queues
|
|
|
#
|