1*7ff83669SZhong Wang /*
2*7ff83669SZhong Wang  * CDDL HEADER START
3*7ff83669SZhong Wang  *
4*7ff83669SZhong Wang  * The contents of this file are subject to the terms of the
5*7ff83669SZhong Wang  * Common Development and Distribution License (the "License").
6*7ff83669SZhong Wang  * You may not use this file except in compliance with the License.
7*7ff83669SZhong Wang  *
8*7ff83669SZhong Wang  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7ff83669SZhong Wang  * or http://www.opensolaris.org/os/licensing.
10*7ff83669SZhong Wang  * See the License for the specific language governing permissions
11*7ff83669SZhong Wang  * and limitations under the License.
12*7ff83669SZhong Wang  *
13*7ff83669SZhong Wang  * When distributing Covered Code, include this CDDL HEADER in each
14*7ff83669SZhong Wang  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7ff83669SZhong Wang  * If applicable, add the following below this CDDL HEADER, with the
16*7ff83669SZhong Wang  * fields enclosed by brackets "[]" replaced with your own identifying
17*7ff83669SZhong Wang  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7ff83669SZhong Wang  *
19*7ff83669SZhong Wang  * CDDL HEADER END
20*7ff83669SZhong Wang  */
21*7ff83669SZhong Wang /*
22*7ff83669SZhong Wang  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*7ff83669SZhong Wang  * Use is subject to license terms.
24*7ff83669SZhong Wang  */
25*7ff83669SZhong Wang #ifndef	_FCOEI_H
26*7ff83669SZhong Wang #define	_FCOEI_H
27*7ff83669SZhong Wang 
28*7ff83669SZhong Wang #ifdef	__cplusplus
29*7ff83669SZhong Wang extern "C" {
30*7ff83669SZhong Wang #endif
31*7ff83669SZhong Wang 
32*7ff83669SZhong Wang #ifdef	_KERNEL
33*7ff83669SZhong Wang 
34*7ff83669SZhong Wang /*
35*7ff83669SZhong Wang  * FCOEI logging
36*7ff83669SZhong Wang  */
37*7ff83669SZhong Wang extern int fcoei_use_ext_log;
38*7ff83669SZhong Wang extern void *fcoei_state;
39*7ff83669SZhong Wang 
40*7ff83669SZhong Wang #define	FCOEI_EXT_LOG(log_ident, ...)				\
41*7ff83669SZhong Wang 	{							\
42*7ff83669SZhong Wang 		if (fcoei_use_ext_log) {			\
43*7ff83669SZhong Wang 			fcoe_trace(log_ident, __VA_ARGS__);	\
44*7ff83669SZhong Wang 		}						\
45*7ff83669SZhong Wang 	}
46*7ff83669SZhong Wang 
47*7ff83669SZhong Wang #define	FCOEI_LOG(log_ident, ...)		\
48*7ff83669SZhong Wang 	fcoe_trace(log_ident, __VA_ARGS__)
49*7ff83669SZhong Wang 
50*7ff83669SZhong Wang /*
51*7ff83669SZhong Wang  * IOCTL supporting stuff
52*7ff83669SZhong Wang  */
53*7ff83669SZhong Wang #define	FCOEI_IOCTL_FLAG_MASK		0xFF
54*7ff83669SZhong Wang #define	FCOEI_IOCTL_FLAG_IDLE		0x00
55*7ff83669SZhong Wang #define	FCOEI_IOCTL_FLAG_OPEN		0x01
56*7ff83669SZhong Wang #define	FCOEI_IOCTL_FLAG_EXCL		0x02
57*7ff83669SZhong Wang 
58*7ff83669SZhong Wang /*
59*7ff83669SZhong Wang  * define common constants
60*7ff83669SZhong Wang  */
61*7ff83669SZhong Wang #define	FCOEI_MAX_OPEN_XCHS	2048
62*7ff83669SZhong Wang #define	FCOEI_SOL_HASH_SIZE	2048
63*7ff83669SZhong Wang #define	FCOEI_UNSOL_HASH_SIZE	128
64*7ff83669SZhong Wang #define	FCOEI_VERSION		"20090729-1.00"
65*7ff83669SZhong Wang #define	FCOEI_NAME_VERSION	"SunFC FCoEI v" FCOEI_VERSION
66*7ff83669SZhong Wang 
67*7ff83669SZhong Wang /*
68*7ff83669SZhong Wang  * define RNID Management Info
69*7ff83669SZhong Wang  */
70*7ff83669SZhong Wang #define	FCOEI_RNID_HBA	0x7
71*7ff83669SZhong Wang #define	FCOEI_RNID_IPV4	0x1
72*7ff83669SZhong Wang #define	FCOEI_RNID_IPV6	0x2
73*7ff83669SZhong Wang 
74*7ff83669SZhong Wang typedef enum event_type {
75*7ff83669SZhong Wang 	AE_EVENT_NONE = 0,
76*7ff83669SZhong Wang 	AE_EVENT_EXCHANGE,
77*7ff83669SZhong Wang 	AE_EVENT_SOL_FRAME,
78*7ff83669SZhong Wang 	AE_EVENT_UNSOL_FRAME,
79*7ff83669SZhong Wang 	AE_EVENT_PORT,
80*7ff83669SZhong Wang 	AE_EVENT_ABORT,
81*7ff83669SZhong Wang 	AE_EVENT_RESET,
82*7ff83669SZhong Wang } event_type_e;
83*7ff83669SZhong Wang 
84*7ff83669SZhong Wang typedef struct fcoei_event {
85*7ff83669SZhong Wang 	list_node_t	 ae_node;
86*7ff83669SZhong Wang 	event_type_e	 ae_type;
87*7ff83669SZhong Wang 
88*7ff83669SZhong Wang 	/*
89*7ff83669SZhong Wang 	 * event specific
90*7ff83669SZhong Wang 	 */
91*7ff83669SZhong Wang 	uint64_t	 ae_specific;
92*7ff83669SZhong Wang 
93*7ff83669SZhong Wang 	/*
94*7ff83669SZhong Wang 	 * event related object
95*7ff83669SZhong Wang 	 */
96*7ff83669SZhong Wang 	void		*ae_obj;
97*7ff83669SZhong Wang } fcoei_event_t;
98*7ff83669SZhong Wang 
99*7ff83669SZhong Wang typedef struct fcoei_soft_state {
100*7ff83669SZhong Wang 	dev_info_t		*ss_dip;
101*7ff83669SZhong Wang 	uint32_t		 ss_flags;
102*7ff83669SZhong Wang 	uint32_t		 ss_fcp_data_payload_size;
103*7ff83669SZhong Wang 	list_t			 ss_comp_xch_list;
104*7ff83669SZhong Wang 
105*7ff83669SZhong Wang 	/*
106*7ff83669SZhong Wang 	 * common data structure (fc_local_port_t) between leadville and fcoei
107*7ff83669SZhong Wang 	 */
108*7ff83669SZhong Wang 	void			*ss_port;
109*7ff83669SZhong Wang 
110*7ff83669SZhong Wang 	/*
111*7ff83669SZhong Wang 	 * common data structure between fcoei and fcoe module
112*7ff83669SZhong Wang 	 */
113*7ff83669SZhong Wang 	fcoe_port_t		*ss_eport;
114*7ff83669SZhong Wang 
115*7ff83669SZhong Wang 	mod_hash_t		*ss_sol_oxid_hash;
116*7ff83669SZhong Wang 	mod_hash_t		*ss_unsol_rxid_hash;
117*7ff83669SZhong Wang 	uint16_t		 ss_next_sol_oxid;
118*7ff83669SZhong Wang 	uint16_t		 ss_next_unsol_rxid;
119*7ff83669SZhong Wang 
120*7ff83669SZhong Wang 	/*
121*7ff83669SZhong Wang 	 * We will use ss_taskq to dispatch watchdog and other tasks
122*7ff83669SZhong Wang 	 */
123*7ff83669SZhong Wang 	ddi_taskq_t		*ss_taskq;
124*7ff83669SZhong Wang 
125*7ff83669SZhong Wang 	kcondvar_t		 ss_watchdog_cv;
126*7ff83669SZhong Wang 	kmutex_t		 ss_watchdog_mutex;
127*7ff83669SZhong Wang 
128*7ff83669SZhong Wang 	/*
129*7ff83669SZhong Wang 	 * current port state, speed. see fctl.h
130*7ff83669SZhong Wang 	 */
131*7ff83669SZhong Wang 	uint16_t		 ss_link_state;
132*7ff83669SZhong Wang 	uint16_t		 ss_link_speed;
133*7ff83669SZhong Wang 
134*7ff83669SZhong Wang 	/*
135*7ff83669SZhong Wang 	 * # of unprocessed port/link change
136*7ff83669SZhong Wang 	 */
137*7ff83669SZhong Wang 	uint32_t		 ss_port_event_counter;
138*7ff83669SZhong Wang 	list_t			 ss_event_list;
139*7ff83669SZhong Wang 
140*7ff83669SZhong Wang 	/*
141*7ff83669SZhong Wang 	 * solicited and unsolicited exchanges timing checking
142*7ff83669SZhong Wang 	 */
143*7ff83669SZhong Wang 	uint32_t		 ss_sol_cnt1;
144*7ff83669SZhong Wang 	uint32_t		 ss_sol_cnt2;
145*7ff83669SZhong Wang 	uint32_t		*ss_sol_cnt;
146*7ff83669SZhong Wang 	uint32_t		 ss_unsol_cnt1;
147*7ff83669SZhong Wang 	uint32_t		 ss_unsol_cnt2;
148*7ff83669SZhong Wang 	uint32_t		*ss_unsol_cnt;
149*7ff83669SZhong Wang 
150*7ff83669SZhong Wang 	/*
151*7ff83669SZhong Wang 	 * ioctl related stuff
152*7ff83669SZhong Wang 	 */
153*7ff83669SZhong Wang 	uint32_t		 ss_ioctl_flags;
154*7ff83669SZhong Wang 	kmutex_t		 ss_ioctl_mutex;
155*7ff83669SZhong Wang 
156*7ff83669SZhong Wang 	/*
157*7ff83669SZhong Wang 	 * fp-defined routines that fcoei will call
158*7ff83669SZhong Wang 	 */
159*7ff83669SZhong Wang 	fc_fca_bind_info_t	 ss_bind_info;
160*7ff83669SZhong Wang 
161*7ff83669SZhong Wang 	/*
162*7ff83669SZhong Wang 	 * fcoei-defined plogi response that fp will use
163*7ff83669SZhong Wang 	 */
164*7ff83669SZhong Wang 	la_els_logi_t		 ss_els_logi;
165*7ff83669SZhong Wang 
166*7ff83669SZhong Wang 	/*
167*7ff83669SZhong Wang 	 * fcoei-defined routines that fp will call
168*7ff83669SZhong Wang 	 */
169*7ff83669SZhong Wang 	fc_fca_tran_t		 ss_fca_tran;
170*7ff83669SZhong Wang 
171*7ff83669SZhong Wang 	/*
172*7ff83669SZhong Wang 	 * Direct p2p information, and ss's fcid will be stored here
173*7ff83669SZhong Wang 	 */
174*7ff83669SZhong Wang 	fc_fca_p2p_info_t	ss_p2p_info;
175*7ff83669SZhong Wang 
176*7ff83669SZhong Wang 	/*
177*7ff83669SZhong Wang 	 * RNID Management Information
178*7ff83669SZhong Wang 	 */
179*7ff83669SZhong Wang 	fc_rnid_t			ss_rnid;
180*7ff83669SZhong Wang } fcoei_soft_state_t;
181*7ff83669SZhong Wang 
182*7ff83669SZhong Wang #define	SS_FLAG_LV_NONE			0x0000
183*7ff83669SZhong Wang #define	SS_FLAG_LV_BOUND		0x0001
184*7ff83669SZhong Wang #define	SS_FLAG_PORT_DISABLED		0x0002
185*7ff83669SZhong Wang #define	SS_FLAG_TERMINATE_WATCHDOG	0x0004
186*7ff83669SZhong Wang #define	SS_FLAG_WATCHDOG_RUNNING	0x0008
187*7ff83669SZhong Wang #define	SS_FLAG_WATCHDOG_IDLE		0x0010
188*7ff83669SZhong Wang #define	SS_FLAG_TRIGGER_FP_ATTACH	0x0020
189*7ff83669SZhong Wang #define	SS_FLAG_FLOGI_FAILED		0x0040
190*7ff83669SZhong Wang 
191*7ff83669SZhong Wang /*
192*7ff83669SZhong Wang  * fcoei_frame - corresponding data structure to fcoe_frame/fc_frame
193*7ff83669SZhong Wang  */
194*7ff83669SZhong Wang typedef struct fcoei_frame {
195*7ff83669SZhong Wang 	fcoei_event_t		 ifm_ae;
196*7ff83669SZhong Wang 	fcoe_frame_t		*ifm_frm;
197*7ff83669SZhong Wang 	uint32_t		 ifm_flags;
198*7ff83669SZhong Wang 	struct fcoei_exchange	*ifm_xch;
199*7ff83669SZhong Wang 
200*7ff83669SZhong Wang 	/*
201*7ff83669SZhong Wang 	 * will be used after the relevant frame mblk was released by ETH layer
202*7ff83669SZhong Wang 	 */
203*7ff83669SZhong Wang 	uint8_t			 ifm_rctl;
204*7ff83669SZhong Wang } fcoei_frame_t;
205*7ff83669SZhong Wang 
206*7ff83669SZhong Wang #define	IFM_FLAG_NONE		0x0000
207*7ff83669SZhong Wang #define	IFM_FLAG_FREE_NETB	0x0001
208*7ff83669SZhong Wang 
209*7ff83669SZhong Wang /*
210*7ff83669SZhong Wang  * fcoei_exchange - corresponding data structure to leadville fc_packet
211*7ff83669SZhong Wang  */
212*7ff83669SZhong Wang typedef struct fcoei_exchange {
213*7ff83669SZhong Wang 	list_node_t		 xch_comp_node;
214*7ff83669SZhong Wang 	fcoei_event_t		 xch_ae;
215*7ff83669SZhong Wang 	uint32_t		 xch_flags;
216*7ff83669SZhong Wang 	fcoei_soft_state_t	*xch_ss;
217*7ff83669SZhong Wang 	clock_t			 xch_start_tick;
218*7ff83669SZhong Wang 	clock_t			 xch_end_tick;
219*7ff83669SZhong Wang 	int			 xch_resid;
220*7ff83669SZhong Wang 	ksema_t			 xch_sema;
221*7ff83669SZhong Wang 
222*7ff83669SZhong Wang 	/*
223*7ff83669SZhong Wang 	 * current cnt for timing check, when the exchange is created
224*7ff83669SZhong Wang 	 */
225*7ff83669SZhong Wang 	uint32_t		*xch_cnt;
226*7ff83669SZhong Wang 
227*7ff83669SZhong Wang 	/*
228*7ff83669SZhong Wang 	 * leadville fc_packet will not maintain oxid/rxid,
229*7ff83669SZhong Wang 	 * so fcoei exchange  need do it
230*7ff83669SZhong Wang 	 */
231*7ff83669SZhong Wang 	uint16_t		 xch_oxid;
232*7ff83669SZhong Wang 	uint16_t		 xch_rxid;
233*7ff83669SZhong Wang 
234*7ff83669SZhong Wang 	/*
235*7ff83669SZhong Wang 	 * to link leadville's stuff
236*7ff83669SZhong Wang 	 */
237*7ff83669SZhong Wang 	fc_packet_t		*xch_fpkt;
238*7ff83669SZhong Wang 	fc_unsol_buf_t		*xch_ub;
239*7ff83669SZhong Wang } fcoei_exchange_t;
240*7ff83669SZhong Wang 
241*7ff83669SZhong Wang #define	XCH_FLAG_NONE		0x00000000
242*7ff83669SZhong Wang #define	XCH_FLAG_TMOUT		0x00000001
243*7ff83669SZhong Wang #define	XCH_FLAG_ABORT		0x00000002
244*7ff83669SZhong Wang #define	XCH_FLAG_IN_SOL_HASH	0x00000004
245*7ff83669SZhong Wang #define	XCH_FLAG_IN_UNSOL_HASH	0x00000008
246*7ff83669SZhong Wang 
247*7ff83669SZhong Wang typedef struct fcoei_walk_arg
248*7ff83669SZhong Wang {
249*7ff83669SZhong Wang 	fcoei_exchange_t	*wa_xch;
250*7ff83669SZhong Wang 	uint16_t		 wa_oxid;
251*7ff83669SZhong Wang } fcoei_walk_arg_t;
252*7ff83669SZhong Wang 
253*7ff83669SZhong Wang /*
254*7ff83669SZhong Wang  * Define conversion and calculation macros
255*7ff83669SZhong Wang  */
256*7ff83669SZhong Wang #define	FRM2IFM(x_frm)	((fcoei_frame_t *)(x_frm)->frm_client_private)
257*7ff83669SZhong Wang #define	FRM2SS(x_frm)							\
258*7ff83669SZhong Wang 	((fcoei_soft_state_t *)(x_frm)->frm_eport->eport_client_private)
259*7ff83669SZhong Wang 
260*7ff83669SZhong Wang #define	PORT2SS(x_port)	((fcoei_soft_state_t *)(x_port)->port_fca_private)
261*7ff83669SZhong Wang #define	EPORT2SS(x_eport)					\
262*7ff83669SZhong Wang 	((fcoei_soft_state_t *)(x_eport)->eport_client_private)
263*7ff83669SZhong Wang 
264*7ff83669SZhong Wang #define	FPKT2XCH(x_fpkt)	((fcoei_exchange_t *)x_fpkt->pkt_fca_private)
265*7ff83669SZhong Wang #define	FRM2FPKT(x_fpkt)	(FRM2IFM(frm)->ifm_xch->xch_fpkt)
266*7ff83669SZhong Wang 
267*7ff83669SZhong Wang #define	HANDLE2SS(x_handle)	((fcoei_soft_state_t *)fca_handle)
268*7ff83669SZhong Wang 
269*7ff83669SZhong Wang #define	FPLD			frm->frm_payload
270*7ff83669SZhong Wang 
271*7ff83669SZhong Wang #define	FCOEI_FRM2FHDR(x_frm, x_fhdr)				\
272*7ff83669SZhong Wang 	{							\
273*7ff83669SZhong Wang 		(x_fhdr)->r_ctl = FRM_R_CTL(x_frm);		\
274*7ff83669SZhong Wang 		(x_fhdr)->d_id = FRM_D_ID(x_frm);		\
275*7ff83669SZhong Wang 		(x_fhdr)->s_id = FRM_S_ID(x_frm);		\
276*7ff83669SZhong Wang 		(x_fhdr)->type = FRM_TYPE(x_frm);		\
277*7ff83669SZhong Wang 		(x_fhdr)->f_ctl = FRM_F_CTL(x_frm);		\
278*7ff83669SZhong Wang 		(x_fhdr)->seq_id = FRM_SEQ_ID(x_frm);		\
279*7ff83669SZhong Wang 		(x_fhdr)->df_ctl = FRM_DF_CTL(x_frm);		\
280*7ff83669SZhong Wang 		(x_fhdr)->seq_cnt = FRM_SEQ_CNT(x_frm);		\
281*7ff83669SZhong Wang 		(x_fhdr)->ox_id = FRM_OXID(x_frm);		\
282*7ff83669SZhong Wang 		(x_fhdr)->rx_id = FRM_RXID(x_frm);		\
283*7ff83669SZhong Wang 		(x_fhdr)->ro = FRM_PARAM(x_frm);		\
284*7ff83669SZhong Wang 	}
285*7ff83669SZhong Wang 
286*7ff83669SZhong Wang #define	FCOEI_PARTIAL_FHDR2FRM(x_fhdr, x_frm)		\
287*7ff83669SZhong Wang 	{						\
288*7ff83669SZhong Wang 		FFM_R_CTL((x_fhdr)->r_ctl, x_frm);	\
289*7ff83669SZhong Wang 		FFM_D_ID((x_fhdr)->d_id, x_frm);	\
290*7ff83669SZhong Wang 		FFM_S_ID((x_fhdr)->s_id, x_frm);	\
291*7ff83669SZhong Wang 		FFM_TYPE((x_fhdr)->type, x_frm);	\
292*7ff83669SZhong Wang 		FFM_F_CTL((x_fhdr)->f_ctl, x_frm);	\
293*7ff83669SZhong Wang 	}
294*7ff83669SZhong Wang 
295*7ff83669SZhong Wang #define	PRT_FRM_HDR(x_p, x_f)						\
296*7ff83669SZhong Wang 	{								\
297*7ff83669SZhong Wang 		FCOEI_LOG(x_p, "rctl/%x, fctl/%x, type/%x, oxid/%x",	\
298*7ff83669SZhong Wang 			FCOE_B2V_1((x_f)->frm_hdr->hdr_r_ctl),		\
299*7ff83669SZhong Wang 			FCOE_B2V_3((x_f)->frm_hdr->hdr_f_ctl),		\
300*7ff83669SZhong Wang 			FCOE_B2V_1((x_f)->frm_hdr->hdr_type),		\
301*7ff83669SZhong Wang 			FCOE_B2V_2((x_f)->frm_hdr->hdr_oxid));		\
302*7ff83669SZhong Wang 	}
303*7ff83669SZhong Wang 
304*7ff83669SZhong Wang #define	FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp)				\
305*7ff83669SZhong Wang 	{								\
306*7ff83669SZhong Wang 		do {							\
307*7ff83669SZhong Wang 			if (++xch->xch_ss->ss_next_sol_oxid == 0xFFFF) { \
308*7ff83669SZhong Wang 				++xch->xch_ss->ss_next_sol_oxid;	\
309*7ff83669SZhong Wang 			}						\
310*7ff83669SZhong Wang 		} while (mod_hash_find(xch->xch_ss->ss_sol_oxid_hash,	\
311*7ff83669SZhong Wang 		    (mod_hash_key_t)(intptr_t)xch->xch_ss->ss_next_sol_oxid, \
312*7ff83669SZhong Wang 		    (mod_hash_val_t)&xch_tmp) == 0);	\
313*7ff83669SZhong Wang 		xch->xch_oxid = xch->xch_ss->ss_next_sol_oxid;		\
314*7ff83669SZhong Wang 		xch->xch_rxid = 0xFFFF;					\
315*7ff83669SZhong Wang 		(void) mod_hash_insert(xch->xch_ss->ss_sol_oxid_hash,	\
316*7ff83669SZhong Wang 		    FMHK(xch->xch_oxid), (mod_hash_val_t)xch); \
317*7ff83669SZhong Wang 		xch->xch_flags |= XCH_FLAG_IN_SOL_HASH;			\
318*7ff83669SZhong Wang 	}
319*7ff83669SZhong Wang 
320*7ff83669SZhong Wang #define	FCOEI_SET_UNSOL_FRM_RXID(frm, xch_tmp)				\
321*7ff83669SZhong Wang 	{								\
322*7ff83669SZhong Wang 		do {							\
323*7ff83669SZhong Wang 			if (++FRM2SS(frm)->ss_next_unsol_rxid == 0xFFFF) { \
324*7ff83669SZhong Wang 				++FRM2SS(frm)->ss_next_unsol_rxid;	\
325*7ff83669SZhong Wang 			}						\
326*7ff83669SZhong Wang 		} while (mod_hash_find(FRM2SS(frm)->ss_unsol_rxid_hash,	\
327*7ff83669SZhong Wang 		    (mod_hash_key_t)(intptr_t)FRM2SS(frm)->ss_next_unsol_rxid, \
328*7ff83669SZhong Wang 		    (mod_hash_val_t)&xch_tmp) == 0);	\
329*7ff83669SZhong Wang 		FFM_RXID(FRM2SS(frm)->ss_next_unsol_rxid, frm);	\
330*7ff83669SZhong Wang 	}
331*7ff83669SZhong Wang 
332*7ff83669SZhong Wang #define	FCOEI_INIT_UNSOL_ID_HASH(xch)					\
333*7ff83669SZhong Wang 	{								\
334*7ff83669SZhong Wang 		xch->xch_oxid = fpkt->pkt_cmd_fhdr.ox_id;		\
335*7ff83669SZhong Wang 		xch->xch_rxid = fpkt->pkt_cmd_fhdr.rx_id;		\
336*7ff83669SZhong Wang 		(void) mod_hash_insert(xch->xch_ss->ss_unsol_rxid_hash,	\
337*7ff83669SZhong Wang 		    FMHK(xch->xch_rxid), (mod_hash_val_t)xch); 		\
338*7ff83669SZhong Wang 		xch->xch_flags |= XCH_FLAG_IN_UNSOL_HASH;		\
339*7ff83669SZhong Wang 	}
340*7ff83669SZhong Wang 
341*7ff83669SZhong Wang /*
342*7ff83669SZhong Wang  * Common functions defined in fcoei.c
343*7ff83669SZhong Wang  */
344*7ff83669SZhong Wang void fcoei_complete_xch(fcoei_exchange_t *xch, fcoe_frame_t *frm,
345*7ff83669SZhong Wang     uint8_t pkt_state, uint8_t pkt_reason);
346*7ff83669SZhong Wang void fcoei_init_ifm(fcoe_frame_t *frm, fcoei_exchange_t *xch);
347*7ff83669SZhong Wang void fcoei_handle_comp_xch_list(fcoei_soft_state_t *ss);
348*7ff83669SZhong Wang 
349*7ff83669SZhong Wang /*
350*7ff83669SZhong Wang  * Common functions defined in fcoei_lv.c
351*7ff83669SZhong Wang  */
352*7ff83669SZhong Wang void fcoei_init_fcatran_vectors(fc_fca_tran_t *fcatran);
353*7ff83669SZhong Wang void fcoei_process_event_exchange(fcoei_event_t *ae);
354*7ff83669SZhong Wang void fcoei_process_event_reset(fcoei_event_t *ae);
355*7ff83669SZhong Wang 
356*7ff83669SZhong Wang /*
357*7ff83669SZhong Wang  * Common functions defined in fcoei_eth.c
358*7ff83669SZhong Wang  */
359*7ff83669SZhong Wang void fcoei_init_ect_vectors(fcoe_client_t *ect);
360*7ff83669SZhong Wang void fcoei_process_unsol_frame(fcoe_frame_t *frm);
361*7ff83669SZhong Wang void fcoei_handle_sol_frame_done(fcoe_frame_t *frm);
362*7ff83669SZhong Wang void fcoei_process_event_port(fcoei_event_t *ae);
363*7ff83669SZhong Wang void fcoei_port_event(fcoe_port_t *eport, uint32_t event);
364*7ff83669SZhong Wang 
365*7ff83669SZhong Wang #endif /* _KERNEL */
366*7ff83669SZhong Wang 
367*7ff83669SZhong Wang #ifdef	__cplusplus
368*7ff83669SZhong Wang }
369*7ff83669SZhong Wang #endif
370*7ff83669SZhong Wang 
371*7ff83669SZhong Wang #endif /* _FCOEI_H */
372