linux/include/scsi/fcoe_sysfs.h
Robert Love 6a891b071b libfcoe, fcoe, bnx2fc: Add new fcoe control interface
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.love@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
2012-12-14 10:38:54 -08:00

133 lines
3.8 KiB
C

/*
* Copyright (c) 2011-2012 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Maintained at www.Open-FCoE.org
*/
#ifndef FCOE_SYSFS
#define FCOE_SYSFS
#include <linux/if_ether.h>
#include <linux/device.h>
#include <scsi/fc/fc_fcoe.h>
struct fcoe_ctlr_device;
struct fcoe_fcf_device;
struct fcoe_sysfs_function_template {
void (*get_fcoe_ctlr_link_fail)(struct fcoe_ctlr_device *);
void (*get_fcoe_ctlr_vlink_fail)(struct fcoe_ctlr_device *);
void (*get_fcoe_ctlr_miss_fka)(struct fcoe_ctlr_device *);
void (*get_fcoe_ctlr_symb_err)(struct fcoe_ctlr_device *);
void (*get_fcoe_ctlr_err_block)(struct fcoe_ctlr_device *);
void (*get_fcoe_ctlr_fcs_error)(struct fcoe_ctlr_device *);
void (*set_fcoe_ctlr_mode)(struct fcoe_ctlr_device *);
int (*set_fcoe_ctlr_enabled)(struct fcoe_ctlr_device *);
void (*get_fcoe_fcf_selected)(struct fcoe_fcf_device *);
void (*get_fcoe_fcf_vlan_id)(struct fcoe_fcf_device *);
};
#define dev_to_ctlr(d) \
container_of((d), struct fcoe_ctlr_device, dev)
enum fip_conn_type {
FIP_CONN_TYPE_UNKNOWN,
FIP_CONN_TYPE_FABRIC,
FIP_CONN_TYPE_VN2VN,
};
enum ctlr_enabled_state {
FCOE_CTLR_ENABLED,
FCOE_CTLR_DISABLED,
FCOE_CTLR_UNUSED,
};
struct fcoe_ctlr_device {
u32 id;
struct device dev;
struct fcoe_sysfs_function_template *f;
struct list_head fcfs;
char work_q_name[20];
struct workqueue_struct *work_q;
char devloss_work_q_name[20];
struct workqueue_struct *devloss_work_q;
struct mutex lock;
int fcf_dev_loss_tmo;
enum fip_conn_type mode;
enum ctlr_enabled_state enabled;
/* expected in host order for displaying */
struct fcoe_fc_els_lesb lesb;
};
static inline void *fcoe_ctlr_device_priv(const struct fcoe_ctlr_device *ctlr)
{
return (void *)(ctlr + 1);
}
/* fcf states */
enum fcf_state {
FCOE_FCF_STATE_UNKNOWN,
FCOE_FCF_STATE_DISCONNECTED,
FCOE_FCF_STATE_CONNECTED,
FCOE_FCF_STATE_DELETED,
};
struct fcoe_fcf_device {
u32 id;
struct device dev;
struct list_head peers;
struct work_struct delete_work;
struct delayed_work dev_loss_work;
u32 dev_loss_tmo;
void *priv;
enum fcf_state state;
u64 fabric_name;
u64 switch_name;
u32 fc_map;
u16 vfid;
u8 mac[ETH_ALEN];
u8 priority;
u32 fka_period;
u8 selected;
u16 vlan_id;
};
#define dev_to_fcf(d) \
container_of((d), struct fcoe_fcf_device, dev)
/* parentage should never be missing */
#define fcoe_fcf_dev_to_ctlr_dev(x) \
dev_to_ctlr((x)->dev.parent)
#define fcoe_fcf_device_priv(x) \
((x)->priv)
struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent,
struct fcoe_sysfs_function_template *f,
int priv_size);
void fcoe_ctlr_device_delete(struct fcoe_ctlr_device *);
struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *,
struct fcoe_fcf_device *);
void fcoe_fcf_device_delete(struct fcoe_fcf_device *);
int __init fcoe_sysfs_setup(void);
void __exit fcoe_sysfs_teardown(void);
#endif /* FCOE_SYSFS */