On Fri, Oct 05, 2012 at 09:54:32AM -0700, Robert Love wrote:
> This patch does a few things.
>
> 1) Makes /sys/bus/fcoe/ctlr_{create,destroy} interfaces.
> These interfaces take an <ifname> and will either
> create an FCoE Controller or destroy an FCoE
> Controller depending on which file is written to.
>
> The new FCoE Controller will start in a DISABLED
> state and will not do discovery or login until it
> is ENABLED. This pause will allow us to configure
> the FCoE Controller before enabling it.
>
> 2) Makes the 'mode' attribute of a fcoe_ctlr_device
> writale. This allows the user to configure the mode
> in which the FCoE Controller will start in when it
> is ENABLED.
>
> Possible modes are 'Fabric', or 'VN2VN'.
>
> The default mode for a fcoe_ctlr{,_device} is 'Fabric'.
> Drivers must implement the set_fcoe_ctlr_mode routine
> to support this feature.
>
> libfcoe offers an exported routine to set a FCoE
> Controller's mode. The mode can only be changed
> when the FCoE Controller is DISABLED.
>
> This patch also removes the get_fcoe_ctlr_mode pointer
> in the fcoe_sysfs function template, the code in
> fcoe_ctlr.c to get the mode and the assignment of
> the fcoe_sysfs function pointer to the fcoe_ctlr.c
> implementation (in fcoe and bnx2fc). fcoe_sysfs can
> return that value for the mode without consulting the
> LLD.
>
> 3) Make a 'enabled' attribute of a fcoe_ctlr_device. On a
> read, fcoe_sysfs will return the attribute's value. On
> a write, fcoe_sysfs will call the LLD (if there is a
> callback) to notifiy that the enalbed state has changed.
>
> This patch maintains the old FCoE control interfaces as
> module parameters, but it adds comments pointing out that
> the old interfaces are deprecated.
>
> Signed-off-by: Robert Love <[email protected]>
> ---
> Documentation/ABI/testing/sysfs-bus-fcoe | 42 +++++++
> drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 1
> drivers/scsi/fcoe/fcoe.c | 1
> drivers/scsi/fcoe/fcoe_sysfs.c | 186
> +++++++++++++++++++++++++++---
> drivers/scsi/fcoe/fcoe_transport.c | 104 +++++++++++++++++
> include/scsi/fcoe_sysfs.h | 11 ++
> include/scsi/libfcoe.h | 16 ++-
> 7 files changed, 338 insertions(+), 23 deletions(-)
>
> diff --git a/Documentation/ABI/testing/sysfs-bus-fcoe
> b/Documentation/ABI/testing/sysfs-bus-fcoe
> index 469d09c..a57bf37 100644
> --- a/Documentation/ABI/testing/sysfs-bus-fcoe
> +++ b/Documentation/ABI/testing/sysfs-bus-fcoe
> @@ -1,14 +1,54 @@
> +What: /sys/bus/fcoe/
> +Date: August 2012
> +KernelVersion: TBD
> +Contact: Robert Love <[email protected]>, [email protected]
> +Description: The FCoE bus. Attributes in this directory are control
> interfaces.
> +Attributes:
> +
> + ctlr_create: 'FCoE Controller' instance creation interface. Writing an
> + <ifname> to this file will allocate and populate sysfs
> with a
> + fcoe_ctlr_device (ctlr_X). The user can then configure any
> + per-port settings and finally write to the
> fcoe_ctlr_device's
> + 'start' attribute to begin the kernel's discovery and login
> + process.
> +
> + ctlr_destroy: 'FCoE Controller' instance removal interface. Writing a
> + fcoe_ctlr_device's sysfs name to this file will log the
> + fcoe_ctlr_device out of the fabric or otherwise connected
> + FCoE devices. It will also free all kernel memory
> allocated
> + for this fcoe_ctlr_device and any structures associated
> + with it, this includes the scsi_host.
> +
> What: /sys/bus/fcoe/ctlr_X
> Date: March 2012
> KernelVersion: TBD
> Contact: Robert Love <[email protected]>, [email protected]
> -Description: 'FCoE Controller' instances on the fcoe bus
> +Description: 'FCoE Controller' instances on the fcoe bus.
> +
> + The FCoE Controller now has a three stage creation process.
> + 1) Write interface name to ctlr_create 2) Configure the FCoE
> + Controller (ctlr_X) 3) Enable the FCoE Controller to begin
> + discovery and login. The FCoE Controller is destroyed by
> + writing it's name, i.e. ctlr_X to the ctlr_delete file.
> +
> Attributes:
>
> fcf_dev_loss_tmo: Device loss timeout peroid (see below). Changing
> this value will change the dev_loss_tmo for all
> FCFs discovered by this controller.
>
> + mode: Display or change the FCoE Controller's mode. Possible
> + modes are 'Fabric' and 'VN2VN'. If a FCoE Controller
> + is started in 'Fabric' mode then FIP FCF discovery is
> + initiated and ultimately a fabric login is attempted.
> + If a FCoE Controller is started in 'VN2VN' mode then
> + FIP VN2VN discovery and login is performed. A FCoE
> + Controller only supports one mode at a time.
> +
> + enabled: Whether an FCoE controller is enabled or disabled.
> + 0 if disabled, 1 if enabled. Writing either 0 or 1
> + to this file will enable or disable the FCoE
> controller.
> +
> lesb_link_fail: Link Error Status Block (LESB) link failure count.
>
> lesb_vlink_fail: Link Error Status Block (LESB) virtual link
> diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> index ae1cb76..97d9a58 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> @@ -2555,7 +2555,6 @@ module_init(bnx2fc_mod_init);
> module_exit(bnx2fc_mod_exit);
>
> static struct fcoe_sysfs_function_template bnx2fc_fcoe_sysfs_templ = {
> - .get_fcoe_ctlr_mode = fcoe_ctlr_get_fip_mode,
> .get_fcoe_ctlr_link_fail = bnx2fc_ctlr_get_lesb,
> .get_fcoe_ctlr_vlink_fail = bnx2fc_ctlr_get_lesb,
> .get_fcoe_ctlr_miss_fka = bnx2fc_ctlr_get_lesb,
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index 078d262..99e9d02 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -155,7 +155,6 @@ static void fcoe_ctlr_get_lesb(struct fcoe_ctlr_device *);
> static void fcoe_fcf_get_vlan_id(struct fcoe_fcf_device *);
>
> static struct fcoe_sysfs_function_template fcoe_sysfs_templ = {
> - .get_fcoe_ctlr_mode = fcoe_ctlr_get_fip_mode,
> .get_fcoe_ctlr_link_fail = fcoe_ctlr_get_lesb,
> .get_fcoe_ctlr_vlink_fail = fcoe_ctlr_get_lesb,
> .get_fcoe_ctlr_miss_fka = fcoe_ctlr_get_lesb,
> diff --git a/drivers/scsi/fcoe/fcoe_sysfs.c b/drivers/scsi/fcoe/fcoe_sysfs.c
> index 8b7b9d7..de3aba4 100644
> --- a/drivers/scsi/fcoe/fcoe_sysfs.c
> +++ b/drivers/scsi/fcoe/fcoe_sysfs.c
> @@ -21,8 +21,10 @@
> #include <linux/types.h>
> #include <linux/kernel.h>
> #include <linux/etherdevice.h>
> +#include <linux/ctype.h>
>
> #include <scsi/fcoe_sysfs.h>
> +#include <scsi/libfcoe.h>
>
> /*
> * OK to include local libfcoe.h for debug_logging, but cannot include
> @@ -47,6 +49,47 @@ MODULE_PARM_DESC(fcf_dev_loss_tmo,
> " insulate the loss of a fcf. Once this value is"
> " exceeded, the fcf is removed.");
>
> +#define FCOE_MAX_MODENAME_LEN 20
> +struct fcoe_ctlr_mode_table {
> + char *modename;
> + enum fip_conn_type mode;
> +};
> +
> +const struct fcoe_ctlr_mode_table ctlr_mode_tbl[] = {
> + { "Fabric", FIP_CONN_TYPE_FABRIC},
> + { "VN2VN", FIP_CONN_TYPE_VN2VN},
> + { NULL, -1},
> +};
> +
> +static enum fip_conn_type fcoe_parse_mode(const char *buf,
> + const struct fcoe_ctlr_mode_table *tbl)
> +{
> + int modeint = -1, i, rv;
> + char modestr[FCOE_MAX_MODENAME_LEN + 1] = { 0, };
> + const char *p;
> +
> + for (p = buf; *p; p++)
> + if (!(isdigit(*p) || isspace(*p)))
> + break;
> +
> + if (*p)
> + rv = sscanf(buf, "%20s", modestr);
> + else
> + rv = sscanf(buf, "%d", &modeint);
> +
> + if (!rv)
> + return FIP_CONN_TYPE_UNKNOWN;
> +
> + for (i = 0; tbl[i].modename; i++) {
> + if (modeint == tbl[i].mode)
> + return tbl[i].mode;
> + if (strcasecmp(modestr, tbl[i].modename) == 0)
> + return tbl[i].mode;
> + }
> +
Is it really worth providing the option to parse mode based on integer value
here? Ostensibly the fip_conn_type ennumeration will track the above
ctlr_mode_tbl in a 1:1 fashion anyway, and from what I can see theres no user
exported mapping of modenamte to fip_conn_type enum value, so allowing a
numerical parse here is just opening you up to a subtle ABI dependency.
Neil
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html