aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
authorChris Leech <christopher.leech@intel.com>2009-11-03 14:46:29 -0500
committerJames Bottomley <James.Bottomley@suse.de>2009-12-04 13:00:58 -0500
commit11b561886643d4e23d0fd58c205d830a448dd0a2 (patch)
tree3d28650e6727589dd672ea3985d2aa2643a99549 /include/scsi
parentdb36c06cc6802d03bcba08982377f7c03a3cda7f (diff)
[SCSI] libfcoe, fcoe: libfcoe NPIV support
The FIP code in libfcoe needed several changes to support NPIV 1) dst_src_addr needs to be managed per-n_port-ID for FPMA fabrics with NPIV enabled. Managing the MAC address is now handled in fcoe, with some slight changes to update_mac() and a new get_src_addr() function pointer. 2) The libfc elsct_send() hook is used to setup FCoE specific response handlers for FIP encapsulated ELS exchanges. This lets the FCoE specific handling know which VN_Port the exchange is for, and doesn't require tracking OX_IDs. It might be possible to roll back to the full FIP frame in these, but for now I've just stashed the contents of the MAC address descriptor in the skb context block for later use. Also, because fcoe_elsct_send() just passes control on to fc_elsct_send(), all transmits still come through the normal frame_send() path. 3) The NPIV changes added a mutex hold in the keep alive sending, the lport mutex is protecting the vport list. We can't take a mutex from a timer, so move the FIP keep alive logic to the link work struct. Signed-off-by: Chris Leech <christopher.leech@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/fc_frame.h3
-rw-r--r--include/scsi/libfc.h10
-rw-r--r--include/scsi/libfcoe.h15
3 files changed, 23 insertions, 5 deletions
diff --git a/include/scsi/fc_frame.h b/include/scsi/fc_frame.h
index 148126dcf9e9..ab2f8d41761b 100644
--- a/include/scsi/fc_frame.h
+++ b/include/scsi/fc_frame.h
@@ -28,6 +28,8 @@
28#include <scsi/fc/fc_fcp.h> 28#include <scsi/fc/fc_fcp.h>
29#include <scsi/fc/fc_encaps.h> 29#include <scsi/fc/fc_encaps.h>
30 30
31#include <linux/if_ether.h>
32
31/* 33/*
32 * The fc_frame interface is used to pass frame data between functions. 34 * The fc_frame interface is used to pass frame data between functions.
33 * The frame includes the data buffer, length, and SOF / EOF delimiter types. 35 * The frame includes the data buffer, length, and SOF / EOF delimiter types.
@@ -67,6 +69,7 @@ struct fcoe_rcv_info {
67 enum fc_sof fr_sof; /* start of frame delimiter */ 69 enum fc_sof fr_sof; /* start of frame delimiter */
68 enum fc_eof fr_eof; /* end of frame delimiter */ 70 enum fc_eof fr_eof; /* end of frame delimiter */
69 u8 fr_flags; /* flags - see below */ 71 u8 fr_flags; /* flags - see below */
72 u8 granted_mac[ETH_ALEN]; /* FCoE MAC address */
70}; 73};
71 74
72 75
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index dfeb1ee4f03f..dad66ce8673d 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -900,6 +900,16 @@ void fc_fcp_destroy(struct fc_lport *);
900 * Initializes ELS/CT interface 900 * Initializes ELS/CT interface
901 */ 901 */
902int fc_elsct_init(struct fc_lport *lp); 902int fc_elsct_init(struct fc_lport *lp);
903struct fc_seq *fc_elsct_send(struct fc_lport *lport,
904 u32 did,
905 struct fc_frame *fp,
906 unsigned int op,
907 void (*resp)(struct fc_seq *,
908 struct fc_frame *fp,
909 void *arg),
910 void *arg, u32 timer_msec);
911void fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *);
912void fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *);
903 913
904 914
905/* 915/*
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
index b2410605b740..8ef5e209c216 100644
--- a/include/scsi/libfcoe.h
+++ b/include/scsi/libfcoe.h
@@ -74,11 +74,13 @@ enum fip_state {
74 * @last_link: last link state reported to libfc. 74 * @last_link: last link state reported to libfc.
75 * @map_dest: use the FC_MAP mode for destination MAC addresses. 75 * @map_dest: use the FC_MAP mode for destination MAC addresses.
76 * @spma: supports SPMA server-provided MACs mode 76 * @spma: supports SPMA server-provided MACs mode
77 * @send_ctlr_ka: need to send controller keep alive
78 * @send_port_ka: need to send port keep alives
77 * @dest_addr: MAC address of the selected FC forwarder. 79 * @dest_addr: MAC address of the selected FC forwarder.
78 * @ctl_src_addr: the native MAC address of our local port. 80 * @ctl_src_addr: the native MAC address of our local port.
79 * @data_src_addr: the assigned MAC address for the local port after FLOGI.
80 * @send: LLD-supplied function to handle sending of FIP Ethernet frames. 81 * @send: LLD-supplied function to handle sending of FIP Ethernet frames.
81 * @update_mac: LLD-supplied function to handle changes to MAC addresses. 82 * @update_mac: LLD-supplied function to handle changes to MAC addresses.
83 * @get_src_addr: LLD-supplied function to supply a source MAC address.
82 * @lock: lock protecting this structure. 84 * @lock: lock protecting this structure.
83 * 85 *
84 * This structure is used by all FCoE drivers. It contains information 86 * This structure is used by all FCoE drivers. It contains information
@@ -106,12 +108,14 @@ struct fcoe_ctlr {
106 u8 last_link; 108 u8 last_link;
107 u8 map_dest; 109 u8 map_dest;
108 u8 spma; 110 u8 spma;
111 u8 send_ctlr_ka;
112 u8 send_port_ka;
109 u8 dest_addr[ETH_ALEN]; 113 u8 dest_addr[ETH_ALEN];
110 u8 ctl_src_addr[ETH_ALEN]; 114 u8 ctl_src_addr[ETH_ALEN];
111 u8 data_src_addr[ETH_ALEN];
112 115
113 void (*send)(struct fcoe_ctlr *, struct sk_buff *); 116 void (*send)(struct fcoe_ctlr *, struct sk_buff *);
114 void (*update_mac)(struct fcoe_ctlr *, u8 *old, u8 *new); 117 void (*update_mac)(struct fc_lport *, u8 *addr);
118 u8 * (*get_src_addr)(struct fc_lport *);
115 spinlock_t lock; 119 spinlock_t lock;
116}; 120};
117 121
@@ -155,9 +159,10 @@ void fcoe_ctlr_init(struct fcoe_ctlr *);
155void fcoe_ctlr_destroy(struct fcoe_ctlr *); 159void fcoe_ctlr_destroy(struct fcoe_ctlr *);
156void fcoe_ctlr_link_up(struct fcoe_ctlr *); 160void fcoe_ctlr_link_up(struct fcoe_ctlr *);
157int fcoe_ctlr_link_down(struct fcoe_ctlr *); 161int fcoe_ctlr_link_down(struct fcoe_ctlr *);
158int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct sk_buff *); 162int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct fc_lport *, struct sk_buff *);
159void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *); 163void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *);
160int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_frame *fp, u8 *sa); 164int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *lport,
165 struct fc_frame *fp, u8 *sa);
161 166
162/* libfcoe funcs */ 167/* libfcoe funcs */
163u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int); 168u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);