Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a74e884 authored by Robert Love's avatar Robert Love Committed by James Bottomley
Browse files

[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: default avatarRobert Love <robert.w.love@intel.com>
Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent fd8f8902
Loading
Loading
Loading
Loading
+77 −0
Original line number Diff line number Diff line
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 −1
Original line number Diff line number Diff line
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 −0

File added.

Preview size limit exceeded, changes collapsed.

+11 −2
Original line number Diff line number Diff line
@@ -815,9 +815,17 @@ static int fcoe_transport_enable(const char *buffer, struct kernel_param *kp)
 */
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 −0
Original line number Diff line number Diff line
/*
 * 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 */
Loading