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]
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:
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
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
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.
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
81 #define FCOE_EXT_LOG(log_ident, ...) \
83 if (fcoe_use_ext_log) { \
84 fcoe_trace(log_ident, __VA_ARGS__); \
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
{
98 uint32_t ss_ioctl_flags
;
99 kmutex_t ss_ioctl_mutex
;
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 */
110 #define SS_FLAG_TERMINATE_WATCHDOG 0x0020
111 #define SS_FLAG_WATCHDOG_RUNNING 0x0040
112 #define SS_FLAG_DOG_WAITING 0x0080
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
;
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,
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 */
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 */
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 */
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
;
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)
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
*);
250 #endif /* _FCOE_H_ */