diff options
author | Paul Mackerras <paulus@samba.org> | 2009-04-21 23:02:09 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2009-04-21 23:02:09 -0400 |
commit | 5bd3ef84d73c2ea7b4babbad060909753c4828d4 (patch) | |
tree | fdf2bafb48ae1ed03175f6c77a7548a181e69ee9 /include/scsi | |
parent | 0658c16056660886ea2f35c4f038be70a94b1532 (diff) | |
parent | 6d25b688ecc488753af3c9e6f6a9a575b863cf37 (diff) |
Merge branch 'merge' of git://git.secretlab.ca/git/linux-2.6 into merge
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/fc/fc_fip.h | 237 | ||||
-rw-r--r-- | include/scsi/fc_transport_fcoe.h | 54 | ||||
-rw-r--r-- | include/scsi/libfc.h | 45 | ||||
-rw-r--r-- | include/scsi/libfcoe.h | 227 | ||||
-rw-r--r-- | include/scsi/scsi_scan.h | 11 |
5 files changed, 406 insertions, 168 deletions
diff --git a/include/scsi/fc/fc_fip.h b/include/scsi/fc/fc_fip.h new file mode 100644 index 000000000000..0627a9ae6347 --- /dev/null +++ b/include/scsi/fc/fc_fip.h | |||
@@ -0,0 +1,237 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Cisco Systems, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you may redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; version 2 of the License. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
9 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
10 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
11 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
12 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
14 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
15 | * SOFTWARE. | ||
16 | */ | ||
17 | #ifndef _FC_FIP_H_ | ||
18 | #define _FC_FIP_H_ | ||
19 | |||
20 | /* | ||
21 | * This version is based on: | ||
22 | * http://www.t11.org/ftp/t11/pub/fc/bb-5/08-543v1.pdf | ||
23 | */ | ||
24 | |||
25 | /* | ||
26 | * The FIP ethertype eventually goes in net/if_ether.h. | ||
27 | */ | ||
28 | #ifndef ETH_P_FIP | ||
29 | #define ETH_P_FIP 0x8914 /* FIP Ethertype */ | ||
30 | #endif | ||
31 | |||
32 | #define FIP_DEF_PRI 128 /* default selection priority */ | ||
33 | #define FIP_DEF_FC_MAP 0x0efc00 /* default FCoE MAP (MAC OUI) value */ | ||
34 | #define FIP_DEF_FKA 8000 /* default FCF keep-alive/advert period (mS) */ | ||
35 | #define FIP_VN_KA_PERIOD 90000 /* required VN_port keep-alive period (mS) */ | ||
36 | #define FIP_FCF_FUZZ 100 /* random time added by FCF (mS) */ | ||
37 | |||
38 | /* | ||
39 | * Multicast MAC addresses. T11-adopted. | ||
40 | */ | ||
41 | #define FIP_ALL_FCOE_MACS ((u8[6]) { 1, 0x10, 0x18, 1, 0, 0 }) | ||
42 | #define FIP_ALL_ENODE_MACS ((u8[6]) { 1, 0x10, 0x18, 1, 0, 1 }) | ||
43 | #define FIP_ALL_FCF_MACS ((u8[6]) { 1, 0x10, 0x18, 1, 0, 2 }) | ||
44 | |||
45 | #define FIP_VER 1 /* version for fip_header */ | ||
46 | |||
47 | struct fip_header { | ||
48 | __u8 fip_ver; /* upper 4 bits are the version */ | ||
49 | __u8 fip_resv1; /* reserved */ | ||
50 | __be16 fip_op; /* operation code */ | ||
51 | __u8 fip_resv2; /* reserved */ | ||
52 | __u8 fip_subcode; /* lower 4 bits are sub-code */ | ||
53 | __be16 fip_dl_len; /* length of descriptors in words */ | ||
54 | __be16 fip_flags; /* header flags */ | ||
55 | } __attribute__((packed)); | ||
56 | |||
57 | #define FIP_VER_SHIFT 4 | ||
58 | #define FIP_VER_ENCAPS(v) ((v) << FIP_VER_SHIFT) | ||
59 | #define FIP_VER_DECAPS(v) ((v) >> FIP_VER_SHIFT) | ||
60 | #define FIP_BPW 4 /* bytes per word for lengths */ | ||
61 | |||
62 | /* | ||
63 | * fip_op. | ||
64 | */ | ||
65 | enum fip_opcode { | ||
66 | FIP_OP_DISC = 1, /* discovery, advertisement, etc. */ | ||
67 | FIP_OP_LS = 2, /* Link Service request or reply */ | ||
68 | FIP_OP_CTRL = 3, /* Keep Alive / Link Reset */ | ||
69 | FIP_OP_VLAN = 4, /* VLAN discovery */ | ||
70 | FIP_OP_VENDOR_MIN = 0xfff8, /* min vendor-specific opcode */ | ||
71 | FIP_OP_VENDOR_MAX = 0xfffe, /* max vendor-specific opcode */ | ||
72 | }; | ||
73 | |||
74 | /* | ||
75 | * Subcodes for FIP_OP_DISC. | ||
76 | */ | ||
77 | enum fip_disc_subcode { | ||
78 | FIP_SC_SOL = 1, /* solicitation */ | ||
79 | FIP_SC_ADV = 2, /* advertisement */ | ||
80 | }; | ||
81 | |||
82 | /* | ||
83 | * Subcodes for FIP_OP_LS. | ||
84 | */ | ||
85 | enum fip_trans_subcode { | ||
86 | FIP_SC_REQ = 1, /* request */ | ||
87 | FIP_SC_REP = 2, /* reply */ | ||
88 | }; | ||
89 | |||
90 | /* | ||
91 | * Subcodes for FIP_OP_RESET. | ||
92 | */ | ||
93 | enum fip_reset_subcode { | ||
94 | FIP_SC_KEEP_ALIVE = 1, /* keep-alive from VN_Port */ | ||
95 | FIP_SC_CLR_VLINK = 2, /* clear virtual link from VF_Port */ | ||
96 | }; | ||
97 | |||
98 | /* | ||
99 | * Subcodes for FIP_OP_VLAN. | ||
100 | */ | ||
101 | enum fip_vlan_subcode { | ||
102 | FIP_SC_VL_REQ = 1, /* request */ | ||
103 | FIP_SC_VL_REP = 2, /* reply */ | ||
104 | }; | ||
105 | |||
106 | /* | ||
107 | * flags in header fip_flags. | ||
108 | */ | ||
109 | enum fip_flag { | ||
110 | FIP_FL_FPMA = 0x8000, /* supports FPMA fabric-provided MACs */ | ||
111 | FIP_FL_SPMA = 0x4000, /* supports SPMA server-provided MACs */ | ||
112 | FIP_FL_AVAIL = 0x0004, /* available for FLOGI/ELP */ | ||
113 | FIP_FL_SOL = 0x0002, /* this is a solicited message */ | ||
114 | FIP_FL_FPORT = 0x0001, /* sent from an F port */ | ||
115 | }; | ||
116 | |||
117 | /* | ||
118 | * Common descriptor header format. | ||
119 | */ | ||
120 | struct fip_desc { | ||
121 | __u8 fip_dtype; /* type - see below */ | ||
122 | __u8 fip_dlen; /* length - in 32-bit words */ | ||
123 | }; | ||
124 | |||
125 | enum fip_desc_type { | ||
126 | FIP_DT_PRI = 1, /* priority for forwarder selection */ | ||
127 | FIP_DT_MAC = 2, /* MAC address */ | ||
128 | FIP_DT_MAP_OUI = 3, /* FC-MAP OUI */ | ||
129 | FIP_DT_NAME = 4, /* switch name or node name */ | ||
130 | FIP_DT_FAB = 5, /* fabric descriptor */ | ||
131 | FIP_DT_FCOE_SIZE = 6, /* max FCoE frame size */ | ||
132 | FIP_DT_FLOGI = 7, /* FLOGI request or response */ | ||
133 | FIP_DT_FDISC = 8, /* FDISC request or response */ | ||
134 | FIP_DT_LOGO = 9, /* LOGO request or response */ | ||
135 | FIP_DT_ELP = 10, /* ELP request or response */ | ||
136 | FIP_DT_VN_ID = 11, /* VN_Node Identifier */ | ||
137 | FIP_DT_FKA = 12, /* advertisement keep-alive period */ | ||
138 | FIP_DT_VENDOR = 13, /* vendor ID */ | ||
139 | FIP_DT_VLAN = 14, /* vlan number */ | ||
140 | FIP_DT_LIMIT, /* max defined desc_type + 1 */ | ||
141 | FIP_DT_VENDOR_BASE = 128, /* first vendor-specific desc_type */ | ||
142 | }; | ||
143 | |||
144 | /* | ||
145 | * FIP_DT_PRI - priority descriptor. | ||
146 | */ | ||
147 | struct fip_pri_desc { | ||
148 | struct fip_desc fd_desc; | ||
149 | __u8 fd_resvd; | ||
150 | __u8 fd_pri; /* FCF priority: higher is better */ | ||
151 | } __attribute__((packed)); | ||
152 | |||
153 | /* | ||
154 | * FIP_DT_MAC - MAC address descriptor. | ||
155 | */ | ||
156 | struct fip_mac_desc { | ||
157 | struct fip_desc fd_desc; | ||
158 | __u8 fd_mac[ETH_ALEN]; | ||
159 | } __attribute__((packed)); | ||
160 | |||
161 | /* | ||
162 | * FIP_DT_MAP - descriptor. | ||
163 | */ | ||
164 | struct fip_map_desc { | ||
165 | struct fip_desc fd_desc; | ||
166 | __u8 fd_resvd[3]; | ||
167 | __u8 fd_map[3]; | ||
168 | } __attribute__((packed)); | ||
169 | |||
170 | /* | ||
171 | * FIP_DT_NAME descriptor. | ||
172 | */ | ||
173 | struct fip_wwn_desc { | ||
174 | struct fip_desc fd_desc; | ||
175 | __u8 fd_resvd[2]; | ||
176 | __be64 fd_wwn; /* 64-bit WWN, unaligned */ | ||
177 | } __attribute__((packed)); | ||
178 | |||
179 | /* | ||
180 | * FIP_DT_FAB descriptor. | ||
181 | */ | ||
182 | struct fip_fab_desc { | ||
183 | struct fip_desc fd_desc; | ||
184 | __be16 fd_vfid; /* virtual fabric ID */ | ||
185 | __u8 fd_resvd; | ||
186 | __u8 fd_map[3]; /* FC-MAP value */ | ||
187 | __be64 fd_wwn; /* fabric name, unaligned */ | ||
188 | } __attribute__((packed)); | ||
189 | |||
190 | /* | ||
191 | * FIP_DT_FCOE_SIZE descriptor. | ||
192 | */ | ||
193 | struct fip_size_desc { | ||
194 | struct fip_desc fd_desc; | ||
195 | __be16 fd_size; | ||
196 | } __attribute__((packed)); | ||
197 | |||
198 | /* | ||
199 | * Descriptor that encapsulates an ELS or ILS frame. | ||
200 | * The encapsulated frame immediately follows this header, without | ||
201 | * SOF, EOF, or CRC. | ||
202 | */ | ||
203 | struct fip_encaps { | ||
204 | struct fip_desc fd_desc; | ||
205 | __u8 fd_resvd[2]; | ||
206 | } __attribute__((packed)); | ||
207 | |||
208 | /* | ||
209 | * FIP_DT_VN_ID - VN_Node Identifier descriptor. | ||
210 | */ | ||
211 | struct fip_vn_desc { | ||
212 | struct fip_desc fd_desc; | ||
213 | __u8 fd_mac[ETH_ALEN]; | ||
214 | __u8 fd_resvd; | ||
215 | __u8 fd_fc_id[3]; | ||
216 | __be64 fd_wwpn; /* port name, unaligned */ | ||
217 | } __attribute__((packed)); | ||
218 | |||
219 | /* | ||
220 | * FIP_DT_FKA - Advertisement keep-alive period. | ||
221 | */ | ||
222 | struct fip_fka_desc { | ||
223 | struct fip_desc fd_desc; | ||
224 | __u8 fd_resvd[2]; | ||
225 | __be32 fd_fka_period; /* adv./keep-alive period in mS */ | ||
226 | } __attribute__((packed)); | ||
227 | |||
228 | /* | ||
229 | * FIP_DT_VENDOR descriptor. | ||
230 | */ | ||
231 | struct fip_vendor_desc { | ||
232 | struct fip_desc fd_desc; | ||
233 | __u8 fd_resvd[2]; | ||
234 | __u8 fd_vendor_id[8]; | ||
235 | } __attribute__((packed)); | ||
236 | |||
237 | #endif /* _FC_FIP_H_ */ | ||
diff --git a/include/scsi/fc_transport_fcoe.h b/include/scsi/fc_transport_fcoe.h deleted file mode 100644 index 8dca2af14ffc..000000000000 --- a/include/scsi/fc_transport_fcoe.h +++ /dev/null | |||
@@ -1,54 +0,0 @@ | |||
1 | #ifndef FC_TRANSPORT_FCOE_H | ||
2 | #define FC_TRANSPORT_FCOE_H | ||
3 | |||
4 | #include <linux/device.h> | ||
5 | #include <linux/netdevice.h> | ||
6 | #include <scsi/scsi_host.h> | ||
7 | #include <scsi/libfc.h> | ||
8 | |||
9 | /** | ||
10 | * struct fcoe_transport - FCoE transport struct for generic transport | ||
11 | * for Ethernet devices as well as pure HBAs | ||
12 | * | ||
13 | * @name: name for thsi transport | ||
14 | * @bus: physical bus type (pci_bus_type) | ||
15 | * @driver: physical bus driver for network device | ||
16 | * @create: entry create function | ||
17 | * @destroy: exit destroy function | ||
18 | * @list: list of transports | ||
19 | */ | ||
20 | struct fcoe_transport { | ||
21 | char *name; | ||
22 | unsigned short vendor; | ||
23 | unsigned short device; | ||
24 | struct bus_type *bus; | ||
25 | struct device_driver *driver; | ||
26 | int (*create)(struct net_device *device); | ||
27 | int (*destroy)(struct net_device *device); | ||
28 | bool (*match)(struct net_device *device); | ||
29 | struct list_head list; | ||
30 | struct list_head devlist; | ||
31 | struct mutex devlock; | ||
32 | }; | ||
33 | |||
34 | /** | ||
35 | * MODULE_ALIAS_FCOE_PCI | ||
36 | * | ||
37 | * some care must be taken with this, vendor and device MUST be a hex value | ||
38 | * preceded with 0x and with letters in lower case (0x12ab, not 0x12AB or 12AB) | ||
39 | */ | ||
40 | #define MODULE_ALIAS_FCOE_PCI(vendor, device) \ | ||
41 | MODULE_ALIAS("fcoe-pci-" __stringify(vendor) "-" __stringify(device)) | ||
42 | |||
43 | /* exported funcs */ | ||
44 | int fcoe_transport_attach(struct net_device *netdev); | ||
45 | int fcoe_transport_release(struct net_device *netdev); | ||
46 | int fcoe_transport_register(struct fcoe_transport *t); | ||
47 | int fcoe_transport_unregister(struct fcoe_transport *t); | ||
48 | int fcoe_load_transport_driver(struct net_device *netdev); | ||
49 | int __init fcoe_transport_init(void); | ||
50 | int __exit fcoe_transport_exit(void); | ||
51 | |||
52 | /* fcow_sw is the default transport */ | ||
53 | extern struct fcoe_transport fcoe_sw_transport; | ||
54 | #endif /* FC_TRANSPORT_FCOE_H */ | ||
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index a70eafaad084..0303a6a098cc 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/timer.h> | 23 | #include <linux/timer.h> |
24 | #include <linux/if.h> | 24 | #include <linux/if.h> |
25 | #include <linux/percpu.h> | ||
25 | 26 | ||
26 | #include <scsi/scsi_transport.h> | 27 | #include <scsi/scsi_transport.h> |
27 | #include <scsi/scsi_transport_fc.h> | 28 | #include <scsi/scsi_transport_fc.h> |
@@ -661,7 +662,8 @@ struct fc_lport { | |||
661 | unsigned long boot_time; | 662 | unsigned long boot_time; |
662 | 663 | ||
663 | struct fc_host_statistics host_stats; | 664 | struct fc_host_statistics host_stats; |
664 | struct fcoe_dev_stats *dev_stats[NR_CPUS]; | 665 | struct fcoe_dev_stats *dev_stats; |
666 | |||
665 | u64 wwpn; | 667 | u64 wwpn; |
666 | u64 wwnn; | 668 | u64 wwnn; |
667 | u8 retry_count; | 669 | u8 retry_count; |
@@ -694,11 +696,6 @@ struct fc_lport { | |||
694 | /* | 696 | /* |
695 | * FC_LPORT HELPER FUNCTIONS | 697 | * FC_LPORT HELPER FUNCTIONS |
696 | *****************************/ | 698 | *****************************/ |
697 | static inline void *lport_priv(const struct fc_lport *lp) | ||
698 | { | ||
699 | return (void *)(lp + 1); | ||
700 | } | ||
701 | |||
702 | static inline int fc_lport_test_ready(struct fc_lport *lp) | 699 | static inline int fc_lport_test_ready(struct fc_lport *lp) |
703 | { | 700 | { |
704 | return lp->state == LPORT_ST_READY; | 701 | return lp->state == LPORT_ST_READY; |
@@ -722,6 +719,42 @@ static inline void fc_lport_state_enter(struct fc_lport *lp, | |||
722 | lp->state = state; | 719 | lp->state = state; |
723 | } | 720 | } |
724 | 721 | ||
722 | static inline int fc_lport_init_stats(struct fc_lport *lp) | ||
723 | { | ||
724 | /* allocate per cpu stats block */ | ||
725 | lp->dev_stats = alloc_percpu(struct fcoe_dev_stats); | ||
726 | if (!lp->dev_stats) | ||
727 | return -ENOMEM; | ||
728 | return 0; | ||
729 | } | ||
730 | |||
731 | static inline void fc_lport_free_stats(struct fc_lport *lp) | ||
732 | { | ||
733 | free_percpu(lp->dev_stats); | ||
734 | } | ||
735 | |||
736 | static inline struct fcoe_dev_stats *fc_lport_get_stats(struct fc_lport *lp) | ||
737 | { | ||
738 | return per_cpu_ptr(lp->dev_stats, smp_processor_id()); | ||
739 | } | ||
740 | |||
741 | static inline void *lport_priv(const struct fc_lport *lp) | ||
742 | { | ||
743 | return (void *)(lp + 1); | ||
744 | } | ||
745 | |||
746 | /** | ||
747 | * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport | ||
748 | * @sht: ptr to the scsi host templ | ||
749 | * @priv_size: size of private data after fc_lport | ||
750 | * | ||
751 | * Returns: ptr to Scsi_Host | ||
752 | */ | ||
753 | static inline struct Scsi_Host * | ||
754 | libfc_host_alloc(struct scsi_host_template *sht, int priv_size) | ||
755 | { | ||
756 | return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size); | ||
757 | } | ||
725 | 758 | ||
726 | /* | 759 | /* |
727 | * LOCAL PORT LAYER | 760 | * LOCAL PORT LAYER |
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index c41f7d0c6efc..666cc131732e 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved. | 2 | * Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved. |
3 | * Copyright (c) 2007-2008 Intel Corporation. All rights reserved. | ||
3 | * | 4 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 6 | * under the terms and conditions of the GNU General Public License, |
@@ -20,134 +21,144 @@ | |||
20 | #ifndef _LIBFCOE_H | 21 | #ifndef _LIBFCOE_H |
21 | #define _LIBFCOE_H | 22 | #define _LIBFCOE_H |
22 | 23 | ||
24 | #include <linux/etherdevice.h> | ||
25 | #include <linux/if_ether.h> | ||
23 | #include <linux/netdevice.h> | 26 | #include <linux/netdevice.h> |
24 | #include <linux/skbuff.h> | 27 | #include <linux/skbuff.h> |
28 | #include <linux/workqueue.h> | ||
25 | #include <scsi/fc/fc_fcoe.h> | 29 | #include <scsi/fc/fc_fcoe.h> |
26 | #include <scsi/libfc.h> | 30 | #include <scsi/libfc.h> |
27 | 31 | ||
28 | /* | 32 | /* |
29 | * this percpu struct for fcoe | 33 | * FIP tunable parameters. |
30 | */ | 34 | */ |
31 | struct fcoe_percpu_s { | 35 | #define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */ |
32 | int cpu; | 36 | #define FCOE_CTRL_SOL_TOV 2000 /* min. solicitation interval (mS) */ |
33 | struct task_struct *thread; | 37 | #define FCOE_CTLR_FCF_LIMIT 20 /* max. number of FCF entries */ |
34 | struct sk_buff_head fcoe_rx_list; | 38 | |
35 | struct page *crc_eof_page; | 39 | /** |
36 | int crc_eof_offset; | 40 | * enum fip_state - internal state of FCoE controller. |
41 | * @FIP_ST_DISABLED: controller has been disabled or not yet enabled. | ||
42 | * @FIP_ST_LINK_WAIT: the physical link is down or unusable. | ||
43 | * @FIP_ST_AUTO: determining whether to use FIP or non-FIP mode. | ||
44 | * @FIP_ST_NON_FIP: non-FIP mode selected. | ||
45 | * @FIP_ST_ENABLED: FIP mode selected. | ||
46 | */ | ||
47 | enum fip_state { | ||
48 | FIP_ST_DISABLED, | ||
49 | FIP_ST_LINK_WAIT, | ||
50 | FIP_ST_AUTO, | ||
51 | FIP_ST_NON_FIP, | ||
52 | FIP_ST_ENABLED, | ||
37 | }; | 53 | }; |
38 | 54 | ||
39 | /* | 55 | /** |
40 | * the fcoe sw transport private data | 56 | * struct fcoe_ctlr - FCoE Controller and FIP state. |
57 | * @state: internal FIP state for network link and FIP or non-FIP mode. | ||
58 | * @lp: &fc_lport: libfc local port. | ||
59 | * @sel_fcf: currently selected FCF, or NULL. | ||
60 | * @fcfs: list of discovered FCFs. | ||
61 | * @fcf_count: number of discovered FCF entries. | ||
62 | * @sol_time: time when a multicast solicitation was last sent. | ||
63 | * @sel_time: time after which to select an FCF. | ||
64 | * @port_ka_time: time of next port keep-alive. | ||
65 | * @ctlr_ka_time: time of next controller keep-alive. | ||
66 | * @timer: timer struct used for all delayed events. | ||
67 | * @link_work: &work_struct for doing FCF selection. | ||
68 | * @recv_work: &work_struct for receiving FIP frames. | ||
69 | * @fip_recv_list: list of received FIP frames. | ||
70 | * @user_mfs: configured maximum FC frame size, including FC header. | ||
71 | * @flogi_oxid: exchange ID of most recent fabric login. | ||
72 | * @flogi_count: number of FLOGI attempts in AUTO mode. | ||
73 | * @link: current link status for libfc. | ||
74 | * @last_link: last link state reported to libfc. | ||
75 | * @map_dest: use the FC_MAP mode for destination MAC addresses. | ||
76 | * @dest_addr: MAC address of the selected FC forwarder. | ||
77 | * @ctl_src_addr: the native MAC address of our local port. | ||
78 | * @data_src_addr: the assigned MAC address for the local port after FLOGI. | ||
79 | * @send: LLD-supplied function to handle sending of FIP Ethernet frames. | ||
80 | * @update_mac: LLD-supplied function to handle changes to MAC addresses. | ||
81 | * @lock: lock protecting this structure. | ||
82 | * | ||
83 | * This structure is used by all FCoE drivers. It contains information | ||
84 | * needed by all FCoE low-level drivers (LLDs) as well as internal state | ||
85 | * for FIP, and fields shared with the LLDS. | ||
41 | */ | 86 | */ |
42 | struct fcoe_softc { | 87 | struct fcoe_ctlr { |
43 | struct list_head list; | 88 | enum fip_state state; |
44 | struct fc_lport *lp; | 89 | struct fc_lport *lp; |
45 | struct net_device *real_dev; | 90 | struct fcoe_fcf *sel_fcf; |
46 | struct net_device *phys_dev; /* device with ethtool_ops */ | 91 | struct list_head fcfs; |
47 | struct packet_type fcoe_packet_type; | 92 | u16 fcf_count; |
48 | struct sk_buff_head fcoe_pending_queue; | 93 | unsigned long sol_time; |
49 | u8 fcoe_pending_queue_active; | 94 | unsigned long sel_time; |
50 | 95 | unsigned long port_ka_time; | |
96 | unsigned long ctlr_ka_time; | ||
97 | struct timer_list timer; | ||
98 | struct work_struct link_work; | ||
99 | struct work_struct recv_work; | ||
100 | struct sk_buff_head fip_recv_list; | ||
101 | u16 user_mfs; | ||
102 | u16 flogi_oxid; | ||
103 | u8 flogi_count; | ||
104 | u8 link; | ||
105 | u8 last_link; | ||
106 | u8 map_dest; | ||
51 | u8 dest_addr[ETH_ALEN]; | 107 | u8 dest_addr[ETH_ALEN]; |
52 | u8 ctl_src_addr[ETH_ALEN]; | 108 | u8 ctl_src_addr[ETH_ALEN]; |
53 | u8 data_src_addr[ETH_ALEN]; | 109 | u8 data_src_addr[ETH_ALEN]; |
54 | /* | ||
55 | * fcoe protocol address learning related stuff | ||
56 | */ | ||
57 | u16 flogi_oxid; | ||
58 | u8 flogi_progress; | ||
59 | u8 address_mode; | ||
60 | }; | ||
61 | |||
62 | static inline struct net_device *fcoe_netdev( | ||
63 | const struct fc_lport *lp) | ||
64 | { | ||
65 | return ((struct fcoe_softc *)lport_priv(lp))->real_dev; | ||
66 | } | ||
67 | |||
68 | static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) | ||
69 | { | ||
70 | return (struct fcoe_hdr *)skb_network_header(skb); | ||
71 | } | ||
72 | |||
73 | static inline int skb_fcoe_offset(const struct sk_buff *skb) | ||
74 | { | ||
75 | return skb_network_offset(skb); | ||
76 | } | ||
77 | |||
78 | static inline struct fc_frame_header *skb_fc_header(const struct sk_buff *skb) | ||
79 | { | ||
80 | return (struct fc_frame_header *)skb_transport_header(skb); | ||
81 | } | ||
82 | |||
83 | static inline int skb_fc_offset(const struct sk_buff *skb) | ||
84 | { | ||
85 | return skb_transport_offset(skb); | ||
86 | } | ||
87 | 110 | ||
88 | static inline void skb_reset_fc_header(struct sk_buff *skb) | 111 | void (*send)(struct fcoe_ctlr *, struct sk_buff *); |
89 | { | 112 | void (*update_mac)(struct fcoe_ctlr *, u8 *old, u8 *new); |
90 | skb_reset_network_header(skb); | 113 | spinlock_t lock; |
91 | skb_set_transport_header(skb, skb_network_offset(skb) + | 114 | }; |
92 | sizeof(struct fcoe_hdr)); | ||
93 | } | ||
94 | |||
95 | static inline bool skb_fc_is_data(const struct sk_buff *skb) | ||
96 | { | ||
97 | return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_SOL_DATA; | ||
98 | } | ||
99 | |||
100 | static inline bool skb_fc_is_cmd(const struct sk_buff *skb) | ||
101 | { | ||
102 | return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_UNSOL_CMD; | ||
103 | } | ||
104 | 115 | ||
105 | static inline bool skb_fc_has_exthdr(const struct sk_buff *skb) | 116 | /* |
106 | { | 117 | * struct fcoe_fcf - Fibre-Channel Forwarder. |
107 | return (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_VFTH) || | 118 | * @list: list linkage. |
108 | (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_IFRH) || | 119 | * @time: system time (jiffies) when an advertisement was last received. |
109 | (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_ENCH); | 120 | * @switch_name: WWN of switch from advertisement. |
110 | } | 121 | * @fabric_name: WWN of fabric from advertisement. |
122 | * @fc_map: FC_MAP value from advertisement. | ||
123 | * @fcf_mac: Ethernet address of the FCF. | ||
124 | * @vfid: virtual fabric ID. | ||
125 | * @pri: seletion priority, smaller values are better. | ||
126 | * @flags: flags received from advertisement. | ||
127 | * @fka_period: keep-alive period, in jiffies. | ||
128 | * | ||
129 | * A Fibre-Channel Forwarder (FCF) is the entity on the Ethernet that | ||
130 | * passes FCoE frames on to an FC fabric. This structure represents | ||
131 | * one FCF from which advertisements have been received. | ||
132 | * | ||
133 | * When looking up an FCF, @switch_name, @fabric_name, @fc_map, @vfid, and | ||
134 | * @fcf_mac together form the lookup key. | ||
135 | */ | ||
136 | struct fcoe_fcf { | ||
137 | struct list_head list; | ||
138 | unsigned long time; | ||
111 | 139 | ||
112 | static inline bool skb_fc_is_roff(const struct sk_buff *skb) | 140 | u64 switch_name; |
113 | { | 141 | u64 fabric_name; |
114 | return skb_fc_header(skb)->fh_f_ctl[2] & FC_FC_REL_OFF; | 142 | u32 fc_map; |
115 | } | 143 | u16 vfid; |
144 | u8 fcf_mac[ETH_ALEN]; | ||
116 | 145 | ||
117 | static inline u16 skb_fc_oxid(const struct sk_buff *skb) | 146 | u8 pri; |
118 | { | 147 | u16 flags; |
119 | return be16_to_cpu(skb_fc_header(skb)->fh_ox_id); | 148 | u32 fka_period; |
120 | } | 149 | }; |
121 | 150 | ||
122 | static inline u16 skb_fc_rxid(const struct sk_buff *skb) | 151 | /* FIP API functions */ |
123 | { | 152 | void fcoe_ctlr_init(struct fcoe_ctlr *); |
124 | return be16_to_cpu(skb_fc_header(skb)->fh_rx_id); | 153 | void fcoe_ctlr_destroy(struct fcoe_ctlr *); |
125 | } | 154 | void fcoe_ctlr_link_up(struct fcoe_ctlr *); |
155 | int fcoe_ctlr_link_down(struct fcoe_ctlr *); | ||
156 | int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct sk_buff *); | ||
157 | void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *); | ||
158 | int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_frame *fp, u8 *sa); | ||
126 | 159 | ||
127 | /* libfcoe funcs */ | 160 | /* libfcoe funcs */ |
128 | int fcoe_reset(struct Scsi_Host *shost); | 161 | u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int); |
129 | u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], | ||
130 | unsigned int scheme, unsigned int port); | ||
131 | |||
132 | u32 fcoe_fc_crc(struct fc_frame *fp); | ||
133 | int fcoe_xmit(struct fc_lport *, struct fc_frame *); | ||
134 | int fcoe_rcv(struct sk_buff *, struct net_device *, | ||
135 | struct packet_type *, struct net_device *); | ||
136 | |||
137 | int fcoe_percpu_receive_thread(void *arg); | ||
138 | void fcoe_clean_pending_queue(struct fc_lport *lp); | ||
139 | void fcoe_percpu_clean(struct fc_lport *lp); | ||
140 | void fcoe_watchdog(ulong vp); | ||
141 | int fcoe_link_ok(struct fc_lport *lp); | ||
142 | |||
143 | struct fc_lport *fcoe_hostlist_lookup(const struct net_device *); | ||
144 | int fcoe_hostlist_add(const struct fc_lport *); | ||
145 | int fcoe_hostlist_remove(const struct fc_lport *); | ||
146 | |||
147 | struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *, int); | ||
148 | int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *); | 162 | int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *); |
149 | 163 | ||
150 | /* fcoe sw hba */ | ||
151 | int __init fcoe_sw_init(void); | ||
152 | int __exit fcoe_sw_exit(void); | ||
153 | #endif /* _LIBFCOE_H */ | 164 | #endif /* _LIBFCOE_H */ |
diff --git a/include/scsi/scsi_scan.h b/include/scsi/scsi_scan.h new file mode 100644 index 000000000000..78898889243d --- /dev/null +++ b/include/scsi/scsi_scan.h | |||
@@ -0,0 +1,11 @@ | |||
1 | #ifndef _SCSI_SCSI_SCAN_H | ||
2 | #define _SCSI_SCSI_SCAN_H | ||
3 | |||
4 | #ifdef CONFIG_SCSI | ||
5 | /* drivers/scsi/scsi_scan.c */ | ||
6 | extern int scsi_complete_async_scans(void); | ||
7 | #else | ||
8 | static inline int scsi_complete_async_scans(void) { return 0; } | ||
9 | #endif | ||
10 | |||
11 | #endif /* _SCSI_SCSI_SCAN_H */ | ||