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 <robert.w.l...@intel.com>
> ---
>  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 <robert.w.l...@intel.com>, de...@open-fcoe.org
> +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 <robert.w.l...@intel.com>, de...@open-fcoe.org
> -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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to