You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
[SCSI] libfcoe: Add fcoe_sysfs
This patch adds a 'fcoe bus' infrastructure to the kernel that is driven by changes to libfcoe which allow LLDs to present FIP (FCoE Initialization Protocol) discovered entities and their attributes to user space via sysfs. This patch adds the following APIs- fcoe_ctlr_device_add fcoe_ctlr_device_delete fcoe_fcf_device_add fcoe_fcf_device_delete They allow the LLD to expose the FCoE ENode Controller and any discovered FCFs (Fibre Channel Forwarders, e.g. FCoE switches) to the user. Each of these new devices has their own bus_type so that they are grouped together for easy lookup from a user space application. Each new class has an attribute_group to expose attributes for any created instances. The attributes are- fcoe_ctlr_device * fcf_dev_loss_tmo * lesb_link_fail * lesb_vlink_fail * lesb_miss_fka * lesb_symb_err * lesb_err_block * lesb_fcs_error fcoe_fcf_device * fabric_name * switch_name * priority * selected * fc_map * vfid * mac * fka_peroid * fabric_state * dev_loss_tmo A device loss infrastructre similar to the FC Transport's is also added by this patch. It is nice to have so that a link flapping adapter doesn't continually advance the count used to identify the discovered FCF. FCFs will exist in a "Disconnected" state until either the timer expires or the FCF is rediscovered and becomes "Connected." This patch generates a few checkpatch.pl WARNINGS that I'm not sure what to do about. They're macros modeled around the FC Transport attribute building macros, which have the same 'feature' where the caller can ommit a cast in the argument list and no cast occurs in the code. I'm not sure how to keep the code condensed while keeping the macros. Any advice would be appreciated. Signed-off-by: Robert Love <robert.w.love@intel.com> Tested-by: Ross Brattain <ross.b.brattain@intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
fd8f89027d
commit
9a74e884ee
77
Documentation/ABI/testing/sysfs-bus-fcoe
Normal file
77
Documentation/ABI/testing/sysfs-bus-fcoe
Normal file
@@ -0,0 +1,77 @@
|
||||
What: /sys/bus/fcoe/ctlr_X
|
||||
Date: March 2012
|
||||
KernelVersion: TBD
|
||||
Contact: Robert Love <robert.w.love@intel.com>, devel@open-fcoe.org
|
||||
Description: 'FCoE Controller' instances on the fcoe bus
|
||||
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.
|
||||
|
||||
lesb_link_fail: Link Error Status Block (LESB) link failure count.
|
||||
|
||||
lesb_vlink_fail: Link Error Status Block (LESB) virtual link
|
||||
failure count.
|
||||
|
||||
lesb_miss_fka: Link Error Status Block (LESB) missed FCoE
|
||||
Initialization Protocol (FIP) Keep-Alives (FKA).
|
||||
|
||||
lesb_symb_err: Link Error Status Block (LESB) symbolic error count.
|
||||
|
||||
lesb_err_block: Link Error Status Block (LESB) block error count.
|
||||
|
||||
lesb_fcs_error: Link Error Status Block (LESB) Fibre Channel
|
||||
Serivces error count.
|
||||
|
||||
Notes: ctlr_X (global increment starting at 0)
|
||||
|
||||
What: /sys/bus/fcoe/fcf_X
|
||||
Date: March 2012
|
||||
KernelVersion: TBD
|
||||
Contact: Robert Love <robert.w.love@intel.com>, devel@open-fcoe.org
|
||||
Description: 'FCoE FCF' instances on the fcoe bus. A FCF is a Fibre Channel
|
||||
Forwarder, which is a FCoE switch that can accept FCoE
|
||||
(Ethernet) packets, unpack them, and forward the embedded
|
||||
Fibre Channel frames into a FC fabric. It can also take
|
||||
outbound FC frames and pack them in Ethernet packets to
|
||||
be sent to their destination on the Ethernet segment.
|
||||
Attributes:
|
||||
|
||||
fabric_name: Identifies the fabric that the FCF services.
|
||||
|
||||
switch_name: Identifies the FCF.
|
||||
|
||||
priority: The switch's priority amongst other FCFs on the same
|
||||
fabric.
|
||||
|
||||
selected: 1 indicates that the switch has been selected for use;
|
||||
0 indicates that the swich will not be used.
|
||||
|
||||
fc_map: The Fibre Channel MAP
|
||||
|
||||
vfid: The Virtual Fabric ID
|
||||
|
||||
mac: The FCF's MAC address
|
||||
|
||||
fka_peroid: The FIP Keep-Alive peroid
|
||||
|
||||
fabric_state: The internal kernel state
|
||||
"Unknown" - Initialization value
|
||||
"Disconnected" - No link to the FCF/fabric
|
||||
"Connected" - Host is connected to the FCF
|
||||
"Deleted" - FCF is being removed from the system
|
||||
|
||||
dev_loss_tmo: The device loss timeout peroid for this FCF.
|
||||
|
||||
Notes: A device loss infrastructre similar to the FC Transport's
|
||||
is present in fcoe_sysfs. It is nice to have so that a
|
||||
link flapping adapter doesn't continually advance the count
|
||||
used to identify the discovered FCF. FCFs will exist in a
|
||||
"Disconnected" state until either the timer expires and the
|
||||
FCF becomes "Deleted" or the FCF is rediscovered and becomes
|
||||
"Connected."
|
||||
|
||||
|
||||
Users: The first user of this interface will be the fcoeadm application,
|
||||
which is commonly packaged in the fcoe-utils package.
|
||||
@@ -1,4 +1,4 @@
|
||||
obj-$(CONFIG_FCOE) += fcoe.o
|
||||
obj-$(CONFIG_LIBFCOE) += libfcoe.o
|
||||
|
||||
libfcoe-objs := fcoe_ctlr.o fcoe_transport.o
|
||||
libfcoe-objs := fcoe_ctlr.o fcoe_transport.o fcoe_sysfs.o
|
||||
|
||||
832
drivers/scsi/fcoe/fcoe_sysfs.c
Normal file
832
drivers/scsi/fcoe/fcoe_sysfs.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -815,9 +815,17 @@ out_nodev:
|
||||
*/
|
||||
static int __init libfcoe_init(void)
|
||||
{
|
||||
fcoe_transport_init();
|
||||
int rc = 0;
|
||||
|
||||
return 0;
|
||||
rc = fcoe_transport_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = fcoe_sysfs_setup();
|
||||
if (rc)
|
||||
fcoe_transport_exit();
|
||||
|
||||
return rc;
|
||||
}
|
||||
module_init(libfcoe_init);
|
||||
|
||||
@@ -826,6 +834,7 @@ module_init(libfcoe_init);
|
||||
*/
|
||||
static void __exit libfcoe_exit(void)
|
||||
{
|
||||
fcoe_sysfs_teardown();
|
||||
fcoe_transport_exit();
|
||||
}
|
||||
module_exit(libfcoe_exit);
|
||||
|
||||
124
include/scsi/fcoe_sysfs.h
Normal file
124
include/scsi/fcoe_sysfs.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* 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 (*get_fcoe_ctlr_mode)(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,
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
/* 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 */
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/random.h>
|
||||
#include <scsi/fc/fc_fcoe.h>
|
||||
#include <scsi/libfc.h>
|
||||
#include <scsi/fcoe_sysfs.h>
|
||||
|
||||
#define FCOE_MAX_CMD_LEN 16 /* Supported CDB length */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user