xref: /onnv-gate/usr/src/uts/common/sys/fcoe/fcoe_common.h (revision 11066:cebb50cbe4f9)
19087SZhong.Wang@Sun.COM /*
29087SZhong.Wang@Sun.COM  * CDDL HEADER START
39087SZhong.Wang@Sun.COM  *
49087SZhong.Wang@Sun.COM  * The contents of this file are subject to the terms of the
59087SZhong.Wang@Sun.COM  * Common Development and Distribution License (the "License").
69087SZhong.Wang@Sun.COM  * You may not use this file except in compliance with the License.
79087SZhong.Wang@Sun.COM  *
89087SZhong.Wang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99087SZhong.Wang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
109087SZhong.Wang@Sun.COM  * See the License for the specific language governing permissions
119087SZhong.Wang@Sun.COM  * and limitations under the License.
129087SZhong.Wang@Sun.COM  *
139087SZhong.Wang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
149087SZhong.Wang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159087SZhong.Wang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
169087SZhong.Wang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
179087SZhong.Wang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
189087SZhong.Wang@Sun.COM  *
199087SZhong.Wang@Sun.COM  * CDDL HEADER END
209087SZhong.Wang@Sun.COM  */
219087SZhong.Wang@Sun.COM /*
229087SZhong.Wang@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
239087SZhong.Wang@Sun.COM  * Use is subject to license terms.
249087SZhong.Wang@Sun.COM  */
259087SZhong.Wang@Sun.COM #ifndef	_FCOE_COMMON_H_
269087SZhong.Wang@Sun.COM #define	_FCOE_COMMON_H_
279087SZhong.Wang@Sun.COM 
289087SZhong.Wang@Sun.COM #ifdef	__cplusplus
299087SZhong.Wang@Sun.COM extern "C" {
309087SZhong.Wang@Sun.COM #endif
319087SZhong.Wang@Sun.COM 
329087SZhong.Wang@Sun.COM #ifdef	_KERNEL
339087SZhong.Wang@Sun.COM 
349087SZhong.Wang@Sun.COM /*
359087SZhong.Wang@Sun.COM  * Interface return value
369087SZhong.Wang@Sun.COM  */
379087SZhong.Wang@Sun.COM #define	FCOE_SUCCESS		 0
389087SZhong.Wang@Sun.COM #define	FCOE_FAILURE		-1
399087SZhong.Wang@Sun.COM #define	FCOE_BUSY		-2
409087SZhong.Wang@Sun.COM #define	FCOE_NOT_SUPPORTED	-3
419087SZhong.Wang@Sun.COM #define	FCOE_BAD_FRAME		-4
429087SZhong.Wang@Sun.COM 
439087SZhong.Wang@Sun.COM /*
449087SZhong.Wang@Sun.COM  * FCOE port speed
459087SZhong.Wang@Sun.COM  */
469087SZhong.Wang@Sun.COM #define	FCOE_PORT_SPEED_1G	1000000000
479087SZhong.Wang@Sun.COM #define	FCOE_PORT_SPEED_10G	10000000000
489087SZhong.Wang@Sun.COM 
499087SZhong.Wang@Sun.COM /*
509087SZhong.Wang@Sun.COM  * FC Frame header size: 24 bytes
519087SZhong.Wang@Sun.COM  */
529087SZhong.Wang@Sun.COM #define	FCFH_SIZE		(sizeof (fcoe_fc_frame_header_t))
539087SZhong.Wang@Sun.COM 
549087SZhong.Wang@Sun.COM /*
559087SZhong.Wang@Sun.COM  * FLOGI
569087SZhong.Wang@Sun.COM  */
579087SZhong.Wang@Sun.COM #define	FLOGI_REQ_PAYLOAD_SIZE	116
589087SZhong.Wang@Sun.COM #define	FLOGI_ACC_PAYLOAD_SIZE	116
599087SZhong.Wang@Sun.COM 
609087SZhong.Wang@Sun.COM #define	FCOE_MIN_MTU_SIZE	2500
6110264SZhong.Wang@Sun.COM #define	FCOE_MAX_FC_FRAME_SIZE	2136
629087SZhong.Wang@Sun.COM 
639087SZhong.Wang@Sun.COM /*
649087SZhong.Wang@Sun.COM  * 24 byte FC frame header
659087SZhong.Wang@Sun.COM  * For all data structures that have endian problems, we will use only
669087SZhong.Wang@Sun.COM  * one type: uint8_t. We need associate the data structure pointer with
679087SZhong.Wang@Sun.COM  * one buffer directly.
689087SZhong.Wang@Sun.COM  */
699087SZhong.Wang@Sun.COM typedef struct fcoe_fc_frame_header {
709087SZhong.Wang@Sun.COM 	uint8_t hdr_r_ctl[1];
719087SZhong.Wang@Sun.COM 	uint8_t hdr_d_id[3];
729087SZhong.Wang@Sun.COM 
739087SZhong.Wang@Sun.COM 	uint8_t hdr_cs_ctl[1];
749087SZhong.Wang@Sun.COM 	uint8_t hdr_s_id[3];
759087SZhong.Wang@Sun.COM 
769087SZhong.Wang@Sun.COM 	uint8_t hdr_type[1];
779087SZhong.Wang@Sun.COM 	uint8_t hdr_f_ctl[3];
789087SZhong.Wang@Sun.COM 
799087SZhong.Wang@Sun.COM 	uint8_t hdr_seq_id[1];
809087SZhong.Wang@Sun.COM 	uint8_t hdr_df_ctl[1];
819087SZhong.Wang@Sun.COM 	uint8_t hdr_seq_cnt[2];
829087SZhong.Wang@Sun.COM 
839087SZhong.Wang@Sun.COM 	uint8_t hdr_oxid[2];
849087SZhong.Wang@Sun.COM 	uint8_t hdr_rxid[2];
859087SZhong.Wang@Sun.COM 
869087SZhong.Wang@Sun.COM 	uint8_t hdr_param[4];
879087SZhong.Wang@Sun.COM } fcoe_fc_frame_header_t;
889087SZhong.Wang@Sun.COM 
899087SZhong.Wang@Sun.COM /*
909087SZhong.Wang@Sun.COM  * Solicited frame:   allocted by FCOET/FOCEI,  free-ed by FCOE
919087SZhong.Wang@Sun.COM  * Unsolicited frame: allocated by FCOE,        free-ed by FCOET/FCOEI
929087SZhong.Wang@Sun.COM  */
939087SZhong.Wang@Sun.COM struct fcoe_port;
949087SZhong.Wang@Sun.COM typedef struct fcoe_frame {
959087SZhong.Wang@Sun.COM 	uint32_t		 frm_flags;
969087SZhong.Wang@Sun.COM 	void			*frm_netb;
9710264SZhong.Wang@Sun.COM 
9810264SZhong.Wang@Sun.COM 	/*
9910264SZhong.Wang@Sun.COM 	 * frm_hdr will be cleared by fcoe explicitly
10010264SZhong.Wang@Sun.COM 	 */
1019087SZhong.Wang@Sun.COM 	fcoe_fc_frame_header_t	*frm_hdr;
1029087SZhong.Wang@Sun.COM 	uint8_t			*frm_ofh1;
1039087SZhong.Wang@Sun.COM 	uint8_t			*frm_ofh2;
1049087SZhong.Wang@Sun.COM 	uint8_t			*frm_fc_frame;
10510264SZhong.Wang@Sun.COM 
10610264SZhong.Wang@Sun.COM 	/*
10710264SZhong.Wang@Sun.COM 	 * fcoe client need clear FC payload explicitly,
10810264SZhong.Wang@Sun.COM 	 * except for RD/WR data frames
10910264SZhong.Wang@Sun.COM 	 */
1109087SZhong.Wang@Sun.COM 	uint8_t			*frm_payload;
1119087SZhong.Wang@Sun.COM 	uint32_t		 frm_fc_frame_size;
1129087SZhong.Wang@Sun.COM 	uint32_t		 frm_payload_size;
1139087SZhong.Wang@Sun.COM 	uint32_t		 frm_alloc_size;
1149087SZhong.Wang@Sun.COM 	struct fcoe_port	*frm_eport;
1159087SZhong.Wang@Sun.COM 	void			*frm_fcoe_private;
1169087SZhong.Wang@Sun.COM 	void			*frm_client_private;
11710264SZhong.Wang@Sun.COM 	clock_t			 frm_clock;
1189087SZhong.Wang@Sun.COM } fcoe_frame_t;
1199087SZhong.Wang@Sun.COM 
1209087SZhong.Wang@Sun.COM /*
1219087SZhong.Wang@Sun.COM  * FCOE HBA
1229087SZhong.Wang@Sun.COM  */
1239087SZhong.Wang@Sun.COM typedef struct fcoe_port {
1249087SZhong.Wang@Sun.COM 	uint32_t	   eport_flags;
1259087SZhong.Wang@Sun.COM 	void		  *eport_fcoe_private;
1269087SZhong.Wang@Sun.COM 	void		  *eport_client_private;
1279087SZhong.Wang@Sun.COM 	uint8_t		   eport_portwwn[8];
1289087SZhong.Wang@Sun.COM 	uint8_t		   eport_nodewwn[8];
1299087SZhong.Wang@Sun.COM 	uint32_t	   eport_max_fc_frame_size;
1309087SZhong.Wang@Sun.COM 	uint32_t	   eport_mtu;
1319087SZhong.Wang@Sun.COM 	uint64_t	   eport_link_speed;
1329087SZhong.Wang@Sun.COM 	uint8_t		   eport_efh_dst[ETHERADDRL];
13310264SZhong.Wang@Sun.COM 
1349087SZhong.Wang@Sun.COM 	void		 (*eport_tx_frame)(fcoe_frame_t *frame);
1359087SZhong.Wang@Sun.COM 	fcoe_frame_t	*(*eport_alloc_frame)(struct fcoe_port *eport,
1369087SZhong.Wang@Sun.COM 	    uint32_t this_fc_frame_size, void *netb);
1379087SZhong.Wang@Sun.COM 	void		 (*eport_release_frame)(fcoe_frame_t *frame);
1389087SZhong.Wang@Sun.COM 	void		*(*eport_alloc_netb)(struct fcoe_port *eport,
1399087SZhong.Wang@Sun.COM 	    uint32_t this_fc_frame_size, uint8_t **ppfc);
1409087SZhong.Wang@Sun.COM 	void		 (*eport_free_netb)(void *netb);
1419087SZhong.Wang@Sun.COM 	void		 (*eport_deregister_client)(struct fcoe_port *eport);
1429087SZhong.Wang@Sun.COM 	int		 (*eport_ctl)(struct fcoe_port *eport,
1439087SZhong.Wang@Sun.COM 	    int cmd, void *arg);
1449087SZhong.Wang@Sun.COM 	int		 (*eport_set_mac_address)(struct fcoe_port *eport,
1459087SZhong.Wang@Sun.COM 	    uint8_t *addr, boolean_t fc_assigned);
1469087SZhong.Wang@Sun.COM } fcoe_port_t;
1479087SZhong.Wang@Sun.COM 
1489087SZhong.Wang@Sun.COM /*
1499087SZhong.Wang@Sun.COM  * FCOE only supports two kinds of topology: direct P2P, fabric P2P.
1509087SZhong.Wang@Sun.COM  */
1519087SZhong.Wang@Sun.COM #define	EPORT_FLAG_IS_DIRECT_P2P	0x01
1529087SZhong.Wang@Sun.COM #define	EPORT_FLAG_TGT_MODE		0x02
1539087SZhong.Wang@Sun.COM #define	EPORT_FLAG_INI_MODE		0x04
1549087SZhong.Wang@Sun.COM #define	EPORT_FLAG_MAC_IN_USE		0x08
1559087SZhong.Wang@Sun.COM 
1569087SZhong.Wang@Sun.COM #define	FCOE_NOTIFY_EPORT_LINK_UP	0x01
1579087SZhong.Wang@Sun.COM #define	FCOE_NOTIFY_EPORT_LINK_DOWN	0x02
1589087SZhong.Wang@Sun.COM #define	FCOE_NOTIFY_EPORT_ADDR_CHG	0x03
1599087SZhong.Wang@Sun.COM 
1609087SZhong.Wang@Sun.COM #define	FCOE_PORT_CTL_CMDS		0x3000
1619087SZhong.Wang@Sun.COM #define	FCOE_CMD_PORT_ONLINE		(FCOE_PORT_CTL_CMDS | 0x01)
1629087SZhong.Wang@Sun.COM #define	FCOE_CMD_PORT_OFFLINE		(FCOE_PORT_CTL_CMDS | 0x02)
1639087SZhong.Wang@Sun.COM 
16410264SZhong.Wang@Sun.COM /*
16510264SZhong.Wang@Sun.COM  * FCoE version control
16610264SZhong.Wang@Sun.COM  */
16710264SZhong.Wang@Sun.COM typedef enum fcoe_ver
16810264SZhong.Wang@Sun.COM {
16910264SZhong.Wang@Sun.COM 	FCOE_VER_1 = 0xAA01,
17010264SZhong.Wang@Sun.COM 	FCOE_VER_2,
17110264SZhong.Wang@Sun.COM 	FCOE_VER_3,
17210264SZhong.Wang@Sun.COM 	FCOE_VER_4,
17310264SZhong.Wang@Sun.COM 	FCOE_VER_5
17410264SZhong.Wang@Sun.COM } fcoe_ver_e;
17510264SZhong.Wang@Sun.COM 
17610264SZhong.Wang@Sun.COM #define	FCOE_VER_NOW FCOE_VER_1
17710264SZhong.Wang@Sun.COM extern const fcoe_ver_e fcoe_ver_now;
17810264SZhong.Wang@Sun.COM 
1799087SZhong.Wang@Sun.COM typedef struct fcoe_client {
18010264SZhong.Wang@Sun.COM 	fcoe_ver_e	 ect_fcoe_ver;
1819087SZhong.Wang@Sun.COM 	uint32_t	 ect_eport_flags;
1829087SZhong.Wang@Sun.COM 	uint32_t	 ect_max_fc_frame_size;
1839087SZhong.Wang@Sun.COM 	uint32_t	 ect_private_frame_struct_size;
1849307Skelly.hu@Sun.COM 	uint32_t	 ect_channelid;
1859087SZhong.Wang@Sun.COM 	void		*ect_client_port_struct;
1869087SZhong.Wang@Sun.COM 	void		 (*ect_rx_frame)(fcoe_frame_t *frame);
1879087SZhong.Wang@Sun.COM 	void		 (*ect_port_event)(fcoe_port_t *eport, uint32_t event);
1889087SZhong.Wang@Sun.COM 	void		 (*ect_release_sol_frame)(fcoe_frame_t *frame);
1899087SZhong.Wang@Sun.COM } fcoe_client_t;
1909087SZhong.Wang@Sun.COM 
1919087SZhong.Wang@Sun.COM /*
1929087SZhong.Wang@Sun.COM  * Define common-used conversion or calculation macros
1939087SZhong.Wang@Sun.COM  */
1949087SZhong.Wang@Sun.COM #define	FCOE_V2B_1(x_v, x_b)				\
1959087SZhong.Wang@Sun.COM 	{						\
1969087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[0] = 0xFF & (x_v);	\
1979087SZhong.Wang@Sun.COM 	}
1989087SZhong.Wang@Sun.COM 
1999087SZhong.Wang@Sun.COM #define	FCOE_V2B_2(x_v, x_b)					\
2009087SZhong.Wang@Sun.COM 	{							\
2019087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[1] = 0xFF & (x_v);		\
2029087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 8);	\
2039087SZhong.Wang@Sun.COM 	}
2049087SZhong.Wang@Sun.COM 
2059087SZhong.Wang@Sun.COM #define	FCOE_V2B_3(x_v, x_b)					\
2069087SZhong.Wang@Sun.COM 	{							\
2079087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[2] = 0xFF & (x_v);		\
2089087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 8);	\
2099087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 16);	\
2109087SZhong.Wang@Sun.COM 	}
2119087SZhong.Wang@Sun.COM 
2129087SZhong.Wang@Sun.COM #define	FCOE_V2B_4(x_v, x_b)					\
2139087SZhong.Wang@Sun.COM 	{							\
2149087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[3] = 0xFF & (x_v);		\
2159087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 8);	\
2169087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 16);	\
2179087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 24);	\
2189087SZhong.Wang@Sun.COM 	}
2199087SZhong.Wang@Sun.COM 
2209087SZhong.Wang@Sun.COM #define	FCOE_V2B_8(x_v, x_b)					\
2219087SZhong.Wang@Sun.COM 	{							\
2229087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[7] = 0xFF & (x_v);		\
2239087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[6] = 0xFF & ((x_v) >> 8);	\
2249087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[5] = 0xFF & ((x_v) >> 16);	\
2259087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[4] = 0xFF & ((x_v) >> 24);	\
2269087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[3] = 0xFF & ((x_v) >> 32);	\
2279087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 40);	\
2289087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 48);	\
2299087SZhong.Wang@Sun.COM 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 56);	\
2309087SZhong.Wang@Sun.COM 	}
2319087SZhong.Wang@Sun.COM 
2329087SZhong.Wang@Sun.COM #define	FCOE_B2V_1(x_b)				\
2339087SZhong.Wang@Sun.COM 	((((uint8_t *)(x_b))[0]) & 0xFF)
2349087SZhong.Wang@Sun.COM 
2359087SZhong.Wang@Sun.COM #define	FCOE_B2V_2(x_b)						\
2369087SZhong.Wang@Sun.COM 	((((uint8_t *)(x_b))[1] | ((uint8_t *)(x_b))[0] << 8) & 0xFFFF)
2379087SZhong.Wang@Sun.COM 
2389087SZhong.Wang@Sun.COM #define	FCOE_B2V_3(x_b)						\
2399087SZhong.Wang@Sun.COM 	((((uint8_t *)(x_b))[2] | ((uint8_t *)(x_b))[1] << 8 |	\
2409087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[0] << 16) & 0xFFFFFF)
2419087SZhong.Wang@Sun.COM 
2429087SZhong.Wang@Sun.COM #define	FCOE_B2V_4(x_b)						\
2439087SZhong.Wang@Sun.COM 	((((uint8_t *)(x_b))[3] | ((uint8_t *)(x_b))[2] << 8 |	\
2449087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[1] << 16 |				\
2459087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[0] << 24) & 0xFFFFFFFF)
2469087SZhong.Wang@Sun.COM 
2479087SZhong.Wang@Sun.COM #define	FCOE_B2V_8(x_b)						\
2489087SZhong.Wang@Sun.COM 	((((uint8_t *)(x_b))[7] | ((uint8_t *)(x_b))[6] << 8 |	\
2499087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[5] << 16 |				\
2509087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[4] << 24 |				\
2519087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[3] << 32 |				\
2529087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[2] << 40 |				\
2539087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[1] << 48 |				\
2549087SZhong.Wang@Sun.COM 	((uint8_t *)(x_b))[0] << 56) & 0xFFFFFFFFFFFFFFFF)
2559087SZhong.Wang@Sun.COM 
2569087SZhong.Wang@Sun.COM /*
2579087SZhong.Wang@Sun.COM  * Get FC frame header's element
2589087SZhong.Wang@Sun.COM  */
2599087SZhong.Wang@Sun.COM #define	FRM_R_CTL(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_r_ctl))
2609087SZhong.Wang@Sun.COM #define	FRM_D_ID(x_frm)		(FCOE_B2V_3((x_frm)->frm_hdr->hdr_d_id))
2619087SZhong.Wang@Sun.COM #define	FRM_S_ID(x_frm)		(FCOE_B2V_3((x_frm)->frm_hdr->hdr_s_id))
2629087SZhong.Wang@Sun.COM #define	FRM_TYPE(x_frm)		(FCOE_B2V_1((x_frm)->frm_hdr->hdr_type))
2639087SZhong.Wang@Sun.COM #define	FRM_F_CTL(x_frm)	(FCOE_B2V_3((x_frm)->frm_hdr->hdr_f_ctl))
2649087SZhong.Wang@Sun.COM #define	FRM_SEQ_ID(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_seq_id))
2659087SZhong.Wang@Sun.COM #define	FRM_DF_CTL(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_df_ctl))
2669087SZhong.Wang@Sun.COM #define	FRM_SEQ_CNT(x_frm)	(FCOE_B2V_2((x_frm)->frm_hdr->hdr_seq_cnt))
2679087SZhong.Wang@Sun.COM #define	FRM_OXID(x_frm)		(FCOE_B2V_2((x_frm)->frm_hdr->hdr_oxid))
2689087SZhong.Wang@Sun.COM #define	FRM_RXID(x_frm)		(FCOE_B2V_2((x_frm)->frm_hdr->hdr_rxid))
2699087SZhong.Wang@Sun.COM #define	FRM_PARAM(x_frm)	(FCOE_B2V_4((x_frm)->frm_hdr->hdr_param))
2709087SZhong.Wang@Sun.COM 
2719087SZhong.Wang@Sun.COM /*
2729087SZhong.Wang@Sun.COM  * Set FC frame header's element
2739087SZhong.Wang@Sun.COM  */
2749087SZhong.Wang@Sun.COM #define	FFM_R_CTL(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_r_ctl)
2759087SZhong.Wang@Sun.COM #define	FFM_D_ID(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_d_id)
2769087SZhong.Wang@Sun.COM #define	FFM_S_ID(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_s_id)
2779087SZhong.Wang@Sun.COM #define	FFM_TYPE(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_type)
2789087SZhong.Wang@Sun.COM #define	FFM_F_CTL(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_f_ctl)
2799087SZhong.Wang@Sun.COM #define	FFM_SEQ_ID(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_seq_id)
2809087SZhong.Wang@Sun.COM #define	FFM_DF_CTL(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_df_ctl)
2819087SZhong.Wang@Sun.COM #define	FFM_SEQ_CNT(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_seq_cnt)
2829087SZhong.Wang@Sun.COM #define	FFM_OXID(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_oxid)
2839087SZhong.Wang@Sun.COM #define	FFM_RXID(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_rxid)
2849087SZhong.Wang@Sun.COM #define	FFM_PARAM(x_v, x_frm)	FCOE_V2B_4((x_v), (x_frm)->frm_hdr->hdr_param)
2859087SZhong.Wang@Sun.COM 
2869087SZhong.Wang@Sun.COM /*
2879087SZhong.Wang@Sun.COM  * frame header checking
2889087SZhong.Wang@Sun.COM  */
2899087SZhong.Wang@Sun.COM #define	FRM_IS_LAST_FRAME(x_frm)		(FRM_F_CTL(x_frm) & (1 << 19))
29010264SZhong.Wang@Sun.COM #define	FRM_SENDER_IS_XCH_RESPONDER(x_frm)	(FRM_F_CTL(x_frm) & (1 << 23))
2919087SZhong.Wang@Sun.COM 
2929087SZhong.Wang@Sun.COM /*
2939087SZhong.Wang@Sun.COM  * FCOET/FCOEI will only call this fcoe function explicitly, all others
2949087SZhong.Wang@Sun.COM  * should be called through vectors in struct fcoe_port.
2959087SZhong.Wang@Sun.COM  * FCOE client call this to register one port to FCOE, FCOE need initialize
2969087SZhong.Wang@Sun.COM  * and return the corresponding fcoe_port.
2979087SZhong.Wang@Sun.COM  */
2989087SZhong.Wang@Sun.COM extern fcoe_port_t *fcoe_register_client(fcoe_client_t *client);
2999087SZhong.Wang@Sun.COM 
3009087SZhong.Wang@Sun.COM #define	EPORT_CLT_TYPE(eport)				\
3019087SZhong.Wang@Sun.COM 	(((eport)->eport_flags & EPORT_FLAG_INI_MODE) ? \
3029087SZhong.Wang@Sun.COM 	FCOE_CLIENT_INITIATOR : FCOE_CLIENT_TARGET)
3039087SZhong.Wang@Sun.COM 
3049087SZhong.Wang@Sun.COM #define	FCOE_SET_DEFAULT_OUI(x_oui)	\
3059087SZhong.Wang@Sun.COM 	(x_oui)[0] = 0x0e; (x_oui)[1] = 0xfc; (x_oui)[2] = 0x00;
3069087SZhong.Wang@Sun.COM #define	FCOE_SET_DEFAULT_FPORT_ADDR(x_addr)	\
3079087SZhong.Wang@Sun.COM 	FCOE_SET_DEFAULT_OUI(x_addr)		\
3089087SZhong.Wang@Sun.COM 	(x_addr)[3] = 0xff; (x_addr)[4] = 0xff; (x_addr)[5] = 0xfe;
3099087SZhong.Wang@Sun.COM 
3109087SZhong.Wang@Sun.COM /*
3119087SZhong.Wang@Sun.COM  * FC payload size
3129087SZhong.Wang@Sun.COM  */
3139087SZhong.Wang@Sun.COM #define	FCOE_DEFAULT_FCP_DATA_PAYLOAD_SIZE	2048
3149087SZhong.Wang@Sun.COM #define	FCOE_MIN_FCP_DATA_PAYLOAD_SIZE		1024
3159087SZhong.Wang@Sun.COM 
3169087SZhong.Wang@Sun.COM typedef struct fcoe_fcp_cmnd {
3179087SZhong.Wang@Sun.COM 	uint8_t ffc_lun[8];
3189087SZhong.Wang@Sun.COM 	uint8_t ffc_ref_num[1];
3199087SZhong.Wang@Sun.COM 
3209087SZhong.Wang@Sun.COM 	/*
3219087SZhong.Wang@Sun.COM 	 * least 3 bits
3229087SZhong.Wang@Sun.COM 	 */
3239087SZhong.Wang@Sun.COM 	uint8_t ffc_attribute[1];
3249087SZhong.Wang@Sun.COM 
3259087SZhong.Wang@Sun.COM 	/*
3269087SZhong.Wang@Sun.COM 	 * Magnagement flags
3279087SZhong.Wang@Sun.COM 	 */
3289087SZhong.Wang@Sun.COM 	uint8_t ffc_management_flags[1];
3299087SZhong.Wang@Sun.COM 
3309087SZhong.Wang@Sun.COM 	/*
3319087SZhong.Wang@Sun.COM 	 * additional cdb len and read/write flag
3329087SZhong.Wang@Sun.COM 	 */
3339087SZhong.Wang@Sun.COM 	uint8_t ffc_addlen_rdwr[1];
3349087SZhong.Wang@Sun.COM 
3359087SZhong.Wang@Sun.COM 	uint8_t ffc_cdb[16];
3369087SZhong.Wang@Sun.COM 	uint8_t ffc_fcp_dl[4];
3379087SZhong.Wang@Sun.COM } fcoe_fcp_cmnd_t;
3389087SZhong.Wang@Sun.COM 
3399087SZhong.Wang@Sun.COM typedef struct fcoe_fcp_rsp {
3409087SZhong.Wang@Sun.COM 	uint8_t ffr_rsvd[8];
3419087SZhong.Wang@Sun.COM 
3429087SZhong.Wang@Sun.COM 	/*
3439087SZhong.Wang@Sun.COM 	 * see SAM-4
3449087SZhong.Wang@Sun.COM 	 */
3459087SZhong.Wang@Sun.COM 	uint8_t ffr_retry_delay_timer[2];
3469087SZhong.Wang@Sun.COM 	uint8_t ffr_flags[1];
3479087SZhong.Wang@Sun.COM 	uint8_t ffr_scsi_status[1];
3489087SZhong.Wang@Sun.COM 	uint8_t ffr_resid[4];
3499087SZhong.Wang@Sun.COM 	uint8_t ffr_sns_len[4];
3509087SZhong.Wang@Sun.COM 	uint8_t ffr_rsp_len[4];
3519087SZhong.Wang@Sun.COM 	/*
3529087SZhong.Wang@Sun.COM 	 * Followed by sense data when available
3539087SZhong.Wang@Sun.COM 	 */
3549087SZhong.Wang@Sun.COM } fcoe_fcp_rsp_t;
3559087SZhong.Wang@Sun.COM 
3569087SZhong.Wang@Sun.COM typedef struct fcoe_fcp_xfer_rdy {
3579087SZhong.Wang@Sun.COM 	uint8_t fxr_data_ro[4];
3589087SZhong.Wang@Sun.COM 	uint8_t fxr_burst_len[4];
3599087SZhong.Wang@Sun.COM 	uint8_t fxr_rsvd[4];
3609087SZhong.Wang@Sun.COM } fcoe_fcp_xfer_rdy_t;
3619087SZhong.Wang@Sun.COM 
3629087SZhong.Wang@Sun.COM /*
3639087SZhong.Wang@Sun.COM  * FCOE project global functions
3649087SZhong.Wang@Sun.COM  */
36510264SZhong.Wang@Sun.COM #if !defined(__FUNCTION__)
36610264SZhong.Wang@Sun.COM #define	__FUNCTION__ ((caddr_t)__func__)
36710264SZhong.Wang@Sun.COM #endif
36810264SZhong.Wang@Sun.COM 
36910264SZhong.Wang@Sun.COM #define	FCOE_STR_LEN 32
37010264SZhong.Wang@Sun.COM 
37110264SZhong.Wang@Sun.COM /*
37210264SZhong.Wang@Sun.COM  * timestamp (golbal variable in sys/systm.h)
37310264SZhong.Wang@Sun.COM  */
374*11066Srafael.vanoni@sun.com #define	CURRENT_CLOCK		(ddi_get_lbolt())
3759087SZhong.Wang@Sun.COM #define	FCOE_SEC2TICK(x_sec)	(drv_usectohz((x_sec) * 1000000))
37610264SZhong.Wang@Sun.COM 
37710264SZhong.Wang@Sun.COM /*
37810264SZhong.Wang@Sun.COM  * Form/convert mod_hash_key from/to xch ID
37910264SZhong.Wang@Sun.COM  */
38010264SZhong.Wang@Sun.COM #define	FMHK(x_xid)		(mod_hash_key_t)(uintptr_t)(x_xid)
38110264SZhong.Wang@Sun.COM #define	CMHK(x_key)		(uint16_t)(uintptr_t)(x_key)
38210264SZhong.Wang@Sun.COM 
3839087SZhong.Wang@Sun.COM typedef void (*TQ_FUNC_P)(void *);
3849087SZhong.Wang@Sun.COM extern void fcoe_trace(caddr_t ident, const char *fmt, ...);
3859087SZhong.Wang@Sun.COM 
3869087SZhong.Wang@Sun.COM #endif
3879087SZhong.Wang@Sun.COM 
3889087SZhong.Wang@Sun.COM #ifdef	__cplusplus
3899087SZhong.Wang@Sun.COM }
3909087SZhong.Wang@Sun.COM #endif
3919087SZhong.Wang@Sun.COM 
3929087SZhong.Wang@Sun.COM #endif	/* _FCOE_COMMON_H_ */
393