|
@@ -101,6 +101,8 @@ static int fcoe_cpu_callback(struct notifier_block *, unsigned long, void *);
|
|
|
|
|
|
static int fcoe_create(const char *, struct kernel_param *);
|
|
|
static int fcoe_destroy(const char *, struct kernel_param *);
|
|
|
+static int fcoe_enable(const char *, struct kernel_param *);
|
|
|
+static int fcoe_disable(const char *, struct kernel_param *);
|
|
|
|
|
|
static struct fc_seq *fcoe_elsct_send(struct fc_lport *,
|
|
|
u32 did, struct fc_frame *,
|
|
@@ -115,10 +117,16 @@ static void fcoe_get_lesb(struct fc_lport *, struct fc_els_lesb *);
|
|
|
|
|
|
module_param_call(create, fcoe_create, NULL, NULL, S_IWUSR);
|
|
|
__MODULE_PARM_TYPE(create, "string");
|
|
|
-MODULE_PARM_DESC(create, "Create fcoe fcoe using net device passed in.");
|
|
|
+MODULE_PARM_DESC(create, " Creates fcoe instance on a ethernet interface");
|
|
|
module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR);
|
|
|
__MODULE_PARM_TYPE(destroy, "string");
|
|
|
-MODULE_PARM_DESC(destroy, "Destroy fcoe fcoe");
|
|
|
+MODULE_PARM_DESC(destroy, " Destroys fcoe instance on a ethernet interface");
|
|
|
+module_param_call(enable, fcoe_enable, NULL, NULL, S_IWUSR);
|
|
|
+__MODULE_PARM_TYPE(enable, "string");
|
|
|
+MODULE_PARM_DESC(enable, " Enables fcoe on a ethernet interface.");
|
|
|
+module_param_call(disable, fcoe_disable, NULL, NULL, S_IWUSR);
|
|
|
+__MODULE_PARM_TYPE(disable, "string");
|
|
|
+MODULE_PARM_DESC(disable, " Disables fcoe on a ethernet interface.");
|
|
|
|
|
|
/* notification function for packets from net device */
|
|
|
static struct notifier_block fcoe_notifier = {
|
|
@@ -1858,6 +1866,104 @@ static struct net_device *fcoe_if_to_netdev(const char *buffer)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * fcoe_disable() - Disables a FCoE interface
|
|
|
+ * @buffer: The name of the Ethernet interface to be disabled
|
|
|
+ * @kp: The associated kernel parameter
|
|
|
+ *
|
|
|
+ * Called from sysfs.
|
|
|
+ *
|
|
|
+ * Returns: 0 for success
|
|
|
+ */
|
|
|
+static int fcoe_disable(const char *buffer, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ struct fcoe_interface *fcoe;
|
|
|
+ struct net_device *netdev;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ mutex_lock(&fcoe_config_mutex);
|
|
|
+#ifdef CONFIG_FCOE_MODULE
|
|
|
+ /*
|
|
|
+ * Make sure the module has been initialized, and is not about to be
|
|
|
+ * removed. Module paramter sysfs files are writable before the
|
|
|
+ * module_init function is called and after module_exit.
|
|
|
+ */
|
|
|
+ if (THIS_MODULE->state != MODULE_STATE_LIVE) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto out_nodev;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ netdev = fcoe_if_to_netdev(buffer);
|
|
|
+ if (!netdev) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto out_nodev;
|
|
|
+ }
|
|
|
+
|
|
|
+ rtnl_lock();
|
|
|
+ fcoe = fcoe_hostlist_lookup_port(netdev);
|
|
|
+ rtnl_unlock();
|
|
|
+
|
|
|
+ if (fcoe)
|
|
|
+ fc_fabric_logoff(fcoe->ctlr.lp);
|
|
|
+ else
|
|
|
+ rc = -ENODEV;
|
|
|
+
|
|
|
+ dev_put(netdev);
|
|
|
+out_nodev:
|
|
|
+ mutex_unlock(&fcoe_config_mutex);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * fcoe_enable() - Enables a FCoE interface
|
|
|
+ * @buffer: The name of the Ethernet interface to be enabled
|
|
|
+ * @kp: The associated kernel parameter
|
|
|
+ *
|
|
|
+ * Called from sysfs.
|
|
|
+ *
|
|
|
+ * Returns: 0 for success
|
|
|
+ */
|
|
|
+static int fcoe_enable(const char *buffer, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ struct fcoe_interface *fcoe;
|
|
|
+ struct net_device *netdev;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ mutex_lock(&fcoe_config_mutex);
|
|
|
+#ifdef CONFIG_FCOE_MODULE
|
|
|
+ /*
|
|
|
+ * Make sure the module has been initialized, and is not about to be
|
|
|
+ * removed. Module paramter sysfs files are writable before the
|
|
|
+ * module_init function is called and after module_exit.
|
|
|
+ */
|
|
|
+ if (THIS_MODULE->state != MODULE_STATE_LIVE) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto out_nodev;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ netdev = fcoe_if_to_netdev(buffer);
|
|
|
+ if (!netdev) {
|
|
|
+ rc = -ENODEV;
|
|
|
+ goto out_nodev;
|
|
|
+ }
|
|
|
+
|
|
|
+ rtnl_lock();
|
|
|
+ fcoe = fcoe_hostlist_lookup_port(netdev);
|
|
|
+ rtnl_unlock();
|
|
|
+
|
|
|
+ if (fcoe)
|
|
|
+ rc = fc_fabric_login(fcoe->ctlr.lp);
|
|
|
+ else
|
|
|
+ rc = -ENODEV;
|
|
|
+
|
|
|
+ dev_put(netdev);
|
|
|
+out_nodev:
|
|
|
+ mutex_unlock(&fcoe_config_mutex);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* fcoe_destroy() - Destroy a FCoE interface
|
|
|
* @buffer: The name of the Ethernet interface to be destroyed
|