Merge remote-tracking branch 'origin/master'
[unleashed/lotheac.git] / usr / src / uts / common / io / fcoe / fcoe.h
blobfd79ff97e789eb4ab3c58f3c07d0f78a8ab891ed
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
27 * The following notice accompanied the original version of this file:
29 * BSD LICENSE
31 * Copyright(c) 2007 Intel Corporation. All rights reserved.
32 * All rights reserved.
34 * Redistribution and use in source and binary forms, with or without
35 * modification, are permitted provided that the following conditions
36 * are met:
38 * * Redistributions of source code must retain the above copyright
39 * notice, this list of conditions and the following disclaimer.
40 * * Redistributions in binary form must reproduce the above copyright
41 * notice, this list of conditions and the following disclaimer in
42 * the documentation and/or other materials provided with the
43 * distribution.
44 * * Neither the name of Intel Corporation nor the names of its
45 * contributors may be used to endorse or promote products derived
46 * from this software without specific prior written permission.
48 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
51 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
52 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
53 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
54 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
58 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
60 #ifndef _FCOE_H_
61 #define _FCOE_H_
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
67 #ifdef _KERNEL
69 extern int fcoe_use_ext_log;
70 extern struct fcoe_soft_state *fcoe_global_ss;
73 * Caution: 1) LOG will be available in debug/non-debug mode
74 * 2) Anything which can potentially flood the log should be under
75 * extended logging, and use FCOE_EXT_LOG.
76 * 3) Don't use FCOE_EXT_LOG in performance-critical code path, such
77 * as normal SCSI I/O code path. It could hurt system performance.
78 * 4) Use kmdb to change foce_use_ext_log in the fly to adjust
79 * tracing
81 #define FCOE_EXT_LOG(log_ident, ...) \
82 do { \
83 if (fcoe_use_ext_log) { \
84 fcoe_trace(log_ident, __VA_ARGS__); \
85 } \
86 } while (0)
88 #define FCOE_LOG(log_ident, ...) \
89 fcoe_trace(log_ident, __VA_ARGS__)
92 * There will be only one fcoe instance
94 typedef struct fcoe_soft_state {
95 dev_info_t *ss_dip;
96 uint32_t ss_flags;
97 list_t ss_mac_list;
98 uint32_t ss_ioctl_flags;
99 kmutex_t ss_ioctl_mutex;
102 * watchdog stuff
104 ddi_taskq_t *ss_watchdog_taskq;
105 kcondvar_t ss_watch_cv;
106 kmutex_t ss_watch_mutex;
107 list_t ss_pfrm_list; /* Pending frame */
108 } fcoe_soft_state_t;
110 #define SS_FLAG_TERMINATE_WATCHDOG 0x0020
111 #define SS_FLAG_WATCHDOG_RUNNING 0x0040
112 #define SS_FLAG_DOG_WAITING 0x0080
115 * Driver name
117 #define FCOEI_DRIVER_NAME "fcoei"
118 #define FCOET_DRIVER_NAME "fcoet"
121 * One for each ethernet port
123 typedef struct fcoe_mac
125 list_node_t fm_ss_node;
126 datalink_id_t fm_linkid;
127 uint32_t fm_flags;
129 fcoe_soft_state_t *fm_ss;
130 fcoe_port_t fm_eport;
131 fcoe_client_t fm_client;
132 dev_info_t *fm_client_dev;
134 mac_handle_t fm_handle;
135 mac_client_handle_t fm_cli_handle;
136 mac_promisc_handle_t fm_promisc_handle;
137 mac_notify_handle_t fm_notify_handle;
138 mac_unicast_handle_t fm_unicst_handle;
139 uint8_t fm_primary_addr[ETHERADDRL];
140 uint8_t fm_current_addr[ETHERADDRL];
141 uint32_t fm_running:1,
142 fm_force_promisc:1,
143 fm_rsvd:18,
144 fm_state:4,
145 fm_link_state:8;
146 uint32_t fm_frm_cnt;
147 kcondvar_t fm_tx_cv;
148 kmutex_t fm_mutex;
149 } fcoe_mac_t;
151 #define FCOE_MAC_STATE_OFFLINE 0x0
152 #define FCOE_MAC_STATE_ONLINE 0x1
154 #define FCOE_MAC_LINK_STATE_DOWN 0x00
155 #define FCOE_MAC_LINK_STATE_UP 0x01
157 #define FCOE_MAC_FLAG_ENABLED 0x01
158 #define FCOE_MAC_FLAG_BOUND 0x02
159 #define FCOE_MAC_FLAG_USER_DEL 0x04
161 typedef struct fcoe_frame_header {
162 uint8_t ffh_ver[1]; /* version field - upper 4 bits */
163 uint8_t ffh_resvd[12];
164 uint8_t ffh_sof[1]; /* start of frame per RFC 3643 */
165 } fcoe_frame_header_t;
167 typedef struct fcoe_frame_tailer {
168 uint8_t fft_crc[4]; /* FC packet CRC */
169 uint8_t fft_eof[1];
170 uint8_t fft_resvd[3];
171 } fcoe_frame_tailer_t;
174 * RAW frame structure
175 * It is used to describe the content of every mblk
177 typedef struct fcoe_i_frame {
178 list_node_t fmi_pending_node;
180 fcoe_frame_t *fmi_frame; /* to common struct */
181 fcoe_mac_t *fmi_mac; /* to/from where */
184 * FRAME structure
186 struct ether_header *fmi_efh; /* 14 bytes eth header */
187 fcoe_frame_header_t *fmi_ffh; /* 14 bytes FCOE hader */
188 uint8_t *fmi_fc_frame;
189 fcoe_frame_tailer_t *fmi_fft; /* 8 bytes FCOE tailer */
190 } fcoe_i_frame_t;
192 typedef struct fcoe_worker {
193 list_t worker_frm_list;
194 kmutex_t worker_lock;
195 kcondvar_t worker_cv;
196 uint32_t worker_flags;
197 uint32_t worker_ntasks;
198 } fcoe_worker_t;
200 #define FCOE_WORKER_TERMINATE 0x01
201 #define FCOE_WORKER_STARTED 0x02
202 #define FCOE_WORKER_ACTIVE 0x04
205 * IOCTL supporting stuff
207 #define FCOE_IOCTL_FLAG_MASK 0xFF
208 #define FCOE_IOCTL_FLAG_IDLE 0x00
209 #define FCOE_IOCTL_FLAG_OPEN 0x01
210 #define FCOE_IOCTL_FLAG_EXCL 0x02
211 #define FCOE_IOCTL_FLAG_EXCL_BUSY 0x04
214 * define common-used macros to simplify coding
216 #define FCOE_FIP_TYPE 0x8914
217 #define FCOE_802_1Q_TAG 0x8100
219 #define PADDING_HEADER_SIZE (sizeof (struct ether_header) + \
220 sizeof (fcoe_frame_header_t))
221 #define PADDING_SIZE (PADDING_HEADER_SIZE + sizeof (fcoe_frame_tailer_t))
223 #define EPORT2MAC(x_eport) ((fcoe_mac_t *)(x_eport)->eport_fcoe_private)
225 #define FRM2MAC(x_frm) (EPORT2MAC((x_frm)->frm_eport))
226 #define FRM2FMI(x_frm) ((fcoe_i_frame_t *)(x_frm)->frm_fcoe_private)
227 #define FRM2MBLK(x_frm) ((mblk_t *)(x_frm)->frm_netb)
229 #define FCOE_VER 0
230 #define FCOE_DECAPS_VER(x_ffh) ((x_ffh)->ffh_ver[0] >> 4)
231 #define FCOE_ENCAPS_VER(x_ffh, x_v) \
233 (x_ffh)->ffh_ver[0] = ((x_v) << 4); \
237 * fcoe driver common functions
239 extern fcoe_mac_t *fcoe_lookup_mac_by_id(datalink_id_t);
240 extern void fcoe_destroy_mac(fcoe_mac_t *);
241 extern mblk_t *fcoe_get_mblk(fcoe_mac_t *, uint32_t);
242 extern void fcoe_post_frame(fcoe_frame_t *);
244 #endif /* _KERNEL */
246 #ifdef __cplusplus
248 #endif
250 #endif /* _FCOE_H_ */