|
@@ -423,6 +423,75 @@ static FCOE_DEVICE_ATTR(ctlr, fip_vlan_responder, S_IRUGO | S_IWUSR,
|
|
|
show_ctlr_fip_resp,
|
|
|
store_ctlr_fip_resp);
|
|
|
|
|
|
+static ssize_t
|
|
|
+fcoe_ctlr_var_store(u32 *var, const char *buf, size_t count)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ unsigned long v;
|
|
|
+
|
|
|
+ err = kstrtoul(buf, 10, &v);
|
|
|
+ if (err || v > UINT_MAX)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ *var = v;
|
|
|
+
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t store_ctlr_r_a_tov(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct fcoe_ctlr_device *ctlr_dev = dev_to_ctlr(dev);
|
|
|
+ struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
|
|
|
+
|
|
|
+ if (ctlr_dev->enabled == FCOE_CTLR_ENABLED)
|
|
|
+ return -EBUSY;
|
|
|
+ if (ctlr_dev->enabled == FCOE_CTLR_DISABLED)
|
|
|
+ return fcoe_ctlr_var_store(&ctlr->lp->r_a_tov, buf, count);
|
|
|
+ return -ENOTSUPP;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t show_ctlr_r_a_tov(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct fcoe_ctlr_device *ctlr_dev = dev_to_ctlr(dev);
|
|
|
+ struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
|
|
|
+
|
|
|
+ return sprintf(buf, "%d\n", ctlr->lp->r_a_tov);
|
|
|
+}
|
|
|
+
|
|
|
+static FCOE_DEVICE_ATTR(ctlr, r_a_tov, S_IRUGO | S_IWUSR,
|
|
|
+ show_ctlr_r_a_tov, store_ctlr_r_a_tov);
|
|
|
+
|
|
|
+static ssize_t store_ctlr_e_d_tov(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ const char *buf, size_t count)
|
|
|
+{
|
|
|
+ struct fcoe_ctlr_device *ctlr_dev = dev_to_ctlr(dev);
|
|
|
+ struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
|
|
|
+
|
|
|
+ if (ctlr_dev->enabled == FCOE_CTLR_ENABLED)
|
|
|
+ return -EBUSY;
|
|
|
+ if (ctlr_dev->enabled == FCOE_CTLR_DISABLED)
|
|
|
+ return fcoe_ctlr_var_store(&ctlr->lp->e_d_tov, buf, count);
|
|
|
+ return -ENOTSUPP;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t show_ctlr_e_d_tov(struct device *dev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct fcoe_ctlr_device *ctlr_dev = dev_to_ctlr(dev);
|
|
|
+ struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
|
|
|
+
|
|
|
+ return sprintf(buf, "%d\n", ctlr->lp->e_d_tov);
|
|
|
+}
|
|
|
+
|
|
|
+static FCOE_DEVICE_ATTR(ctlr, e_d_tov, S_IRUGO | S_IWUSR,
|
|
|
+ show_ctlr_e_d_tov, store_ctlr_e_d_tov);
|
|
|
+
|
|
|
static ssize_t
|
|
|
store_private_fcoe_ctlr_fcf_dev_loss_tmo(struct device *dev,
|
|
|
struct device_attribute *attr,
|
|
@@ -507,6 +576,8 @@ static struct attribute_group fcoe_ctlr_lesb_attr_group = {
|
|
|
static struct attribute *fcoe_ctlr_attrs[] = {
|
|
|
&device_attr_fcoe_ctlr_fip_vlan_responder.attr,
|
|
|
&device_attr_fcoe_ctlr_fcf_dev_loss_tmo.attr,
|
|
|
+ &device_attr_fcoe_ctlr_r_a_tov.attr,
|
|
|
+ &device_attr_fcoe_ctlr_e_d_tov.attr,
|
|
|
&device_attr_fcoe_ctlr_enabled.attr,
|
|
|
&device_attr_fcoe_ctlr_mode.attr,
|
|
|
NULL,
|