xref: /titanic_41/usr/src/uts/common/sys/fcoe/fcoe_common.h (revision d3d50737e566cade9a08d73d2af95105ac7cd960)
12a8164dfSZhong Wang /*
22a8164dfSZhong Wang  * CDDL HEADER START
32a8164dfSZhong Wang  *
42a8164dfSZhong Wang  * The contents of this file are subject to the terms of the
52a8164dfSZhong Wang  * Common Development and Distribution License (the "License").
62a8164dfSZhong Wang  * You may not use this file except in compliance with the License.
72a8164dfSZhong Wang  *
82a8164dfSZhong Wang  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92a8164dfSZhong Wang  * or http://www.opensolaris.org/os/licensing.
102a8164dfSZhong Wang  * See the License for the specific language governing permissions
112a8164dfSZhong Wang  * and limitations under the License.
122a8164dfSZhong Wang  *
132a8164dfSZhong Wang  * When distributing Covered Code, include this CDDL HEADER in each
142a8164dfSZhong Wang  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152a8164dfSZhong Wang  * If applicable, add the following below this CDDL HEADER, with the
162a8164dfSZhong Wang  * fields enclosed by brackets "[]" replaced with your own identifying
172a8164dfSZhong Wang  * information: Portions Copyright [yyyy] [name of copyright owner]
182a8164dfSZhong Wang  *
192a8164dfSZhong Wang  * CDDL HEADER END
202a8164dfSZhong Wang  */
212a8164dfSZhong Wang /*
222a8164dfSZhong Wang  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
232a8164dfSZhong Wang  * Use is subject to license terms.
242a8164dfSZhong Wang  */
252a8164dfSZhong Wang #ifndef	_FCOE_COMMON_H_
262a8164dfSZhong Wang #define	_FCOE_COMMON_H_
272a8164dfSZhong Wang 
282a8164dfSZhong Wang #ifdef	__cplusplus
292a8164dfSZhong Wang extern "C" {
302a8164dfSZhong Wang #endif
312a8164dfSZhong Wang 
322a8164dfSZhong Wang #ifdef	_KERNEL
332a8164dfSZhong Wang 
342a8164dfSZhong Wang /*
352a8164dfSZhong Wang  * Interface return value
362a8164dfSZhong Wang  */
372a8164dfSZhong Wang #define	FCOE_SUCCESS		 0
382a8164dfSZhong Wang #define	FCOE_FAILURE		-1
392a8164dfSZhong Wang #define	FCOE_BUSY		-2
402a8164dfSZhong Wang #define	FCOE_NOT_SUPPORTED	-3
412a8164dfSZhong Wang #define	FCOE_BAD_FRAME		-4
422a8164dfSZhong Wang 
432a8164dfSZhong Wang /*
442a8164dfSZhong Wang  * FCOE port speed
452a8164dfSZhong Wang  */
462a8164dfSZhong Wang #define	FCOE_PORT_SPEED_1G	1000000000
472a8164dfSZhong Wang #define	FCOE_PORT_SPEED_10G	10000000000
482a8164dfSZhong Wang 
492a8164dfSZhong Wang /*
502a8164dfSZhong Wang  * FC Frame header size: 24 bytes
512a8164dfSZhong Wang  */
522a8164dfSZhong Wang #define	FCFH_SIZE		(sizeof (fcoe_fc_frame_header_t))
532a8164dfSZhong Wang 
542a8164dfSZhong Wang /*
552a8164dfSZhong Wang  * FLOGI
562a8164dfSZhong Wang  */
572a8164dfSZhong Wang #define	FLOGI_REQ_PAYLOAD_SIZE	116
582a8164dfSZhong Wang #define	FLOGI_ACC_PAYLOAD_SIZE	116
592a8164dfSZhong Wang 
602a8164dfSZhong Wang #define	FCOE_MIN_MTU_SIZE	2500
617ff83669SZhong Wang #define	FCOE_MAX_FC_FRAME_SIZE	2136
622a8164dfSZhong Wang 
632a8164dfSZhong Wang /*
642a8164dfSZhong Wang  * 24 byte FC frame header
652a8164dfSZhong Wang  * For all data structures that have endian problems, we will use only
662a8164dfSZhong Wang  * one type: uint8_t. We need associate the data structure pointer with
672a8164dfSZhong Wang  * one buffer directly.
682a8164dfSZhong Wang  */
692a8164dfSZhong Wang typedef struct fcoe_fc_frame_header {
702a8164dfSZhong Wang 	uint8_t hdr_r_ctl[1];
712a8164dfSZhong Wang 	uint8_t hdr_d_id[3];
722a8164dfSZhong Wang 
732a8164dfSZhong Wang 	uint8_t hdr_cs_ctl[1];
742a8164dfSZhong Wang 	uint8_t hdr_s_id[3];
752a8164dfSZhong Wang 
762a8164dfSZhong Wang 	uint8_t hdr_type[1];
772a8164dfSZhong Wang 	uint8_t hdr_f_ctl[3];
782a8164dfSZhong Wang 
792a8164dfSZhong Wang 	uint8_t hdr_seq_id[1];
802a8164dfSZhong Wang 	uint8_t hdr_df_ctl[1];
812a8164dfSZhong Wang 	uint8_t hdr_seq_cnt[2];
822a8164dfSZhong Wang 
832a8164dfSZhong Wang 	uint8_t hdr_oxid[2];
842a8164dfSZhong Wang 	uint8_t hdr_rxid[2];
852a8164dfSZhong Wang 
862a8164dfSZhong Wang 	uint8_t hdr_param[4];
872a8164dfSZhong Wang } fcoe_fc_frame_header_t;
882a8164dfSZhong Wang 
892a8164dfSZhong Wang /*
902a8164dfSZhong Wang  * Solicited frame:   allocted by FCOET/FOCEI,  free-ed by FCOE
912a8164dfSZhong Wang  * Unsolicited frame: allocated by FCOE,        free-ed by FCOET/FCOEI
922a8164dfSZhong Wang  */
932a8164dfSZhong Wang struct fcoe_port;
942a8164dfSZhong Wang typedef struct fcoe_frame {
952a8164dfSZhong Wang 	uint32_t		 frm_flags;
962a8164dfSZhong Wang 	void			*frm_netb;
977ff83669SZhong Wang 
987ff83669SZhong Wang 	/*
997ff83669SZhong Wang 	 * frm_hdr will be cleared by fcoe explicitly
1007ff83669SZhong Wang 	 */
1012a8164dfSZhong Wang 	fcoe_fc_frame_header_t	*frm_hdr;
1022a8164dfSZhong Wang 	uint8_t			*frm_ofh1;
1032a8164dfSZhong Wang 	uint8_t			*frm_ofh2;
1042a8164dfSZhong Wang 	uint8_t			*frm_fc_frame;
1057ff83669SZhong Wang 
1067ff83669SZhong Wang 	/*
1077ff83669SZhong Wang 	 * fcoe client need clear FC payload explicitly,
1087ff83669SZhong Wang 	 * except for RD/WR data frames
1097ff83669SZhong Wang 	 */
1102a8164dfSZhong Wang 	uint8_t			*frm_payload;
1112a8164dfSZhong Wang 	uint32_t		 frm_fc_frame_size;
1122a8164dfSZhong Wang 	uint32_t		 frm_payload_size;
1132a8164dfSZhong Wang 	uint32_t		 frm_alloc_size;
1142a8164dfSZhong Wang 	struct fcoe_port	*frm_eport;
1152a8164dfSZhong Wang 	void			*frm_fcoe_private;
1162a8164dfSZhong Wang 	void			*frm_client_private;
1177ff83669SZhong Wang 	clock_t			 frm_clock;
1182a8164dfSZhong Wang } fcoe_frame_t;
1192a8164dfSZhong Wang 
1202a8164dfSZhong Wang /*
1212a8164dfSZhong Wang  * FCOE HBA
1222a8164dfSZhong Wang  */
1232a8164dfSZhong Wang typedef struct fcoe_port {
1242a8164dfSZhong Wang 	uint32_t	   eport_flags;
1252a8164dfSZhong Wang 	void		  *eport_fcoe_private;
1262a8164dfSZhong Wang 	void		  *eport_client_private;
1272a8164dfSZhong Wang 	uint8_t		   eport_portwwn[8];
1282a8164dfSZhong Wang 	uint8_t		   eport_nodewwn[8];
1292a8164dfSZhong Wang 	uint32_t	   eport_max_fc_frame_size;
1302a8164dfSZhong Wang 	uint32_t	   eport_mtu;
1312a8164dfSZhong Wang 	uint64_t	   eport_link_speed;
1322a8164dfSZhong Wang 	uint8_t		   eport_efh_dst[ETHERADDRL];
1337ff83669SZhong Wang 
1342a8164dfSZhong Wang 	void		 (*eport_tx_frame)(fcoe_frame_t *frame);
1352a8164dfSZhong Wang 	fcoe_frame_t	*(*eport_alloc_frame)(struct fcoe_port *eport,
1362a8164dfSZhong Wang 	    uint32_t this_fc_frame_size, void *netb);
1372a8164dfSZhong Wang 	void		 (*eport_release_frame)(fcoe_frame_t *frame);
1382a8164dfSZhong Wang 	void		*(*eport_alloc_netb)(struct fcoe_port *eport,
1392a8164dfSZhong Wang 	    uint32_t this_fc_frame_size, uint8_t **ppfc);
1402a8164dfSZhong Wang 	void		 (*eport_free_netb)(void *netb);
1412a8164dfSZhong Wang 	void		 (*eport_deregister_client)(struct fcoe_port *eport);
1422a8164dfSZhong Wang 	int		 (*eport_ctl)(struct fcoe_port *eport,
1432a8164dfSZhong Wang 	    int cmd, void *arg);
1442a8164dfSZhong Wang 	int		 (*eport_set_mac_address)(struct fcoe_port *eport,
1452a8164dfSZhong Wang 	    uint8_t *addr, boolean_t fc_assigned);
1462a8164dfSZhong Wang } fcoe_port_t;
1472a8164dfSZhong Wang 
1482a8164dfSZhong Wang /*
1492a8164dfSZhong Wang  * FCOE only supports two kinds of topology: direct P2P, fabric P2P.
1502a8164dfSZhong Wang  */
1512a8164dfSZhong Wang #define	EPORT_FLAG_IS_DIRECT_P2P	0x01
1522a8164dfSZhong Wang #define	EPORT_FLAG_TGT_MODE		0x02
1532a8164dfSZhong Wang #define	EPORT_FLAG_INI_MODE		0x04
1542a8164dfSZhong Wang #define	EPORT_FLAG_MAC_IN_USE		0x08
1552a8164dfSZhong Wang 
1562a8164dfSZhong Wang #define	FCOE_NOTIFY_EPORT_LINK_UP	0x01
1572a8164dfSZhong Wang #define	FCOE_NOTIFY_EPORT_LINK_DOWN	0x02
1582a8164dfSZhong Wang #define	FCOE_NOTIFY_EPORT_ADDR_CHG	0x03
1592a8164dfSZhong Wang 
1602a8164dfSZhong Wang #define	FCOE_PORT_CTL_CMDS		0x3000
1612a8164dfSZhong Wang #define	FCOE_CMD_PORT_ONLINE		(FCOE_PORT_CTL_CMDS | 0x01)
1622a8164dfSZhong Wang #define	FCOE_CMD_PORT_OFFLINE		(FCOE_PORT_CTL_CMDS | 0x02)
1632a8164dfSZhong Wang 
1647ff83669SZhong Wang /*
1657ff83669SZhong Wang  * FCoE version control
1667ff83669SZhong Wang  */
1677ff83669SZhong Wang typedef enum fcoe_ver
1687ff83669SZhong Wang {
1697ff83669SZhong Wang 	FCOE_VER_1 = 0xAA01,
1707ff83669SZhong Wang 	FCOE_VER_2,
1717ff83669SZhong Wang 	FCOE_VER_3,
1727ff83669SZhong Wang 	FCOE_VER_4,
1737ff83669SZhong Wang 	FCOE_VER_5
1747ff83669SZhong Wang } fcoe_ver_e;
1757ff83669SZhong Wang 
1767ff83669SZhong Wang #define	FCOE_VER_NOW FCOE_VER_1
1777ff83669SZhong Wang extern const fcoe_ver_e fcoe_ver_now;
1787ff83669SZhong Wang 
1792a8164dfSZhong Wang typedef struct fcoe_client {
1807ff83669SZhong Wang 	fcoe_ver_e	 ect_fcoe_ver;
1812a8164dfSZhong Wang 	uint32_t	 ect_eport_flags;
1822a8164dfSZhong Wang 	uint32_t	 ect_max_fc_frame_size;
1832a8164dfSZhong Wang 	uint32_t	 ect_private_frame_struct_size;
184d4401b99SKelly Hu 	uint32_t	 ect_channelid;
1852a8164dfSZhong Wang 	void		*ect_client_port_struct;
1862a8164dfSZhong Wang 	void		 (*ect_rx_frame)(fcoe_frame_t *frame);
1872a8164dfSZhong Wang 	void		 (*ect_port_event)(fcoe_port_t *eport, uint32_t event);
1882a8164dfSZhong Wang 	void		 (*ect_release_sol_frame)(fcoe_frame_t *frame);
1892a8164dfSZhong Wang } fcoe_client_t;
1902a8164dfSZhong Wang 
1912a8164dfSZhong Wang /*
1922a8164dfSZhong Wang  * Define common-used conversion or calculation macros
1932a8164dfSZhong Wang  */
1942a8164dfSZhong Wang #define	FCOE_V2B_1(x_v, x_b)				\
1952a8164dfSZhong Wang 	{						\
1962a8164dfSZhong Wang 		((uint8_t *)(x_b))[0] = 0xFF & (x_v);	\
1972a8164dfSZhong Wang 	}
1982a8164dfSZhong Wang 
1992a8164dfSZhong Wang #define	FCOE_V2B_2(x_v, x_b)					\
2002a8164dfSZhong Wang 	{							\
2012a8164dfSZhong Wang 		((uint8_t *)(x_b))[1] = 0xFF & (x_v);		\
2022a8164dfSZhong Wang 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 8);	\
2032a8164dfSZhong Wang 	}
2042a8164dfSZhong Wang 
2052a8164dfSZhong Wang #define	FCOE_V2B_3(x_v, x_b)					\
2062a8164dfSZhong Wang 	{							\
2072a8164dfSZhong Wang 		((uint8_t *)(x_b))[2] = 0xFF & (x_v);		\
2082a8164dfSZhong Wang 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 8);	\
2092a8164dfSZhong Wang 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 16);	\
2102a8164dfSZhong Wang 	}
2112a8164dfSZhong Wang 
2122a8164dfSZhong Wang #define	FCOE_V2B_4(x_v, x_b)					\
2132a8164dfSZhong Wang 	{							\
2142a8164dfSZhong Wang 		((uint8_t *)(x_b))[3] = 0xFF & (x_v);		\
2152a8164dfSZhong Wang 		((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 8);	\
2162a8164dfSZhong Wang 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 16);	\
2172a8164dfSZhong Wang 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 24);	\
2182a8164dfSZhong Wang 	}
2192a8164dfSZhong Wang 
2202a8164dfSZhong Wang #define	FCOE_V2B_8(x_v, x_b)					\
2212a8164dfSZhong Wang 	{							\
2222a8164dfSZhong Wang 		((uint8_t *)(x_b))[7] = 0xFF & (x_v);		\
2232a8164dfSZhong Wang 		((uint8_t *)(x_b))[6] = 0xFF & ((x_v) >> 8);	\
2242a8164dfSZhong Wang 		((uint8_t *)(x_b))[5] = 0xFF & ((x_v) >> 16);	\
2252a8164dfSZhong Wang 		((uint8_t *)(x_b))[4] = 0xFF & ((x_v) >> 24);	\
2262a8164dfSZhong Wang 		((uint8_t *)(x_b))[3] = 0xFF & ((x_v) >> 32);	\
2272a8164dfSZhong Wang 		((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 40);	\
2282a8164dfSZhong Wang 		((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 48);	\
2292a8164dfSZhong Wang 		((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 56);	\
2302a8164dfSZhong Wang 	}
2312a8164dfSZhong Wang 
2322a8164dfSZhong Wang #define	FCOE_B2V_1(x_b)				\
2332a8164dfSZhong Wang 	((((uint8_t *)(x_b))[0]) & 0xFF)
2342a8164dfSZhong Wang 
2352a8164dfSZhong Wang #define	FCOE_B2V_2(x_b)						\
2362a8164dfSZhong Wang 	((((uint8_t *)(x_b))[1] | ((uint8_t *)(x_b))[0] << 8) & 0xFFFF)
2372a8164dfSZhong Wang 
2382a8164dfSZhong Wang #define	FCOE_B2V_3(x_b)						\
2392a8164dfSZhong Wang 	((((uint8_t *)(x_b))[2] | ((uint8_t *)(x_b))[1] << 8 |	\
2402a8164dfSZhong Wang 	((uint8_t *)(x_b))[0] << 16) & 0xFFFFFF)
2412a8164dfSZhong Wang 
2422a8164dfSZhong Wang #define	FCOE_B2V_4(x_b)						\
2432a8164dfSZhong Wang 	((((uint8_t *)(x_b))[3] | ((uint8_t *)(x_b))[2] << 8 |	\
2442a8164dfSZhong Wang 	((uint8_t *)(x_b))[1] << 16 |				\
2452a8164dfSZhong Wang 	((uint8_t *)(x_b))[0] << 24) & 0xFFFFFFFF)
2462a8164dfSZhong Wang 
2472a8164dfSZhong Wang #define	FCOE_B2V_8(x_b)						\
2482a8164dfSZhong Wang 	((((uint8_t *)(x_b))[7] | ((uint8_t *)(x_b))[6] << 8 |	\
2492a8164dfSZhong Wang 	((uint8_t *)(x_b))[5] << 16 |				\
2502a8164dfSZhong Wang 	((uint8_t *)(x_b))[4] << 24 |				\
2512a8164dfSZhong Wang 	((uint8_t *)(x_b))[3] << 32 |				\
2522a8164dfSZhong Wang 	((uint8_t *)(x_b))[2] << 40 |				\
2532a8164dfSZhong Wang 	((uint8_t *)(x_b))[1] << 48 |				\
2542a8164dfSZhong Wang 	((uint8_t *)(x_b))[0] << 56) & 0xFFFFFFFFFFFFFFFF)
2552a8164dfSZhong Wang 
2562a8164dfSZhong Wang /*
2572a8164dfSZhong Wang  * Get FC frame header's element
2582a8164dfSZhong Wang  */
2592a8164dfSZhong Wang #define	FRM_R_CTL(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_r_ctl))
2602a8164dfSZhong Wang #define	FRM_D_ID(x_frm)		(FCOE_B2V_3((x_frm)->frm_hdr->hdr_d_id))
2612a8164dfSZhong Wang #define	FRM_S_ID(x_frm)		(FCOE_B2V_3((x_frm)->frm_hdr->hdr_s_id))
2622a8164dfSZhong Wang #define	FRM_TYPE(x_frm)		(FCOE_B2V_1((x_frm)->frm_hdr->hdr_type))
2632a8164dfSZhong Wang #define	FRM_F_CTL(x_frm)	(FCOE_B2V_3((x_frm)->frm_hdr->hdr_f_ctl))
2642a8164dfSZhong Wang #define	FRM_SEQ_ID(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_seq_id))
2652a8164dfSZhong Wang #define	FRM_DF_CTL(x_frm)	(FCOE_B2V_1((x_frm)->frm_hdr->hdr_df_ctl))
2662a8164dfSZhong Wang #define	FRM_SEQ_CNT(x_frm)	(FCOE_B2V_2((x_frm)->frm_hdr->hdr_seq_cnt))
2672a8164dfSZhong Wang #define	FRM_OXID(x_frm)		(FCOE_B2V_2((x_frm)->frm_hdr->hdr_oxid))
2682a8164dfSZhong Wang #define	FRM_RXID(x_frm)		(FCOE_B2V_2((x_frm)->frm_hdr->hdr_rxid))
2692a8164dfSZhong Wang #define	FRM_PARAM(x_frm)	(FCOE_B2V_4((x_frm)->frm_hdr->hdr_param))
2702a8164dfSZhong Wang 
2712a8164dfSZhong Wang /*
2722a8164dfSZhong Wang  * Set FC frame header's element
2732a8164dfSZhong Wang  */
2742a8164dfSZhong Wang #define	FFM_R_CTL(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_r_ctl)
2752a8164dfSZhong Wang #define	FFM_D_ID(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_d_id)
2762a8164dfSZhong Wang #define	FFM_S_ID(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_s_id)
2772a8164dfSZhong Wang #define	FFM_TYPE(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_type)
2782a8164dfSZhong Wang #define	FFM_F_CTL(x_v, x_frm)	FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_f_ctl)
2792a8164dfSZhong Wang #define	FFM_SEQ_ID(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_seq_id)
2802a8164dfSZhong Wang #define	FFM_DF_CTL(x_v, x_frm)	FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_df_ctl)
2812a8164dfSZhong Wang #define	FFM_SEQ_CNT(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_seq_cnt)
2822a8164dfSZhong Wang #define	FFM_OXID(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_oxid)
2832a8164dfSZhong Wang #define	FFM_RXID(x_v, x_frm)	FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_rxid)
2842a8164dfSZhong Wang #define	FFM_PARAM(x_v, x_frm)	FCOE_V2B_4((x_v), (x_frm)->frm_hdr->hdr_param)
2852a8164dfSZhong Wang 
2862a8164dfSZhong Wang /*
2872a8164dfSZhong Wang  * frame header checking
2882a8164dfSZhong Wang  */
2892a8164dfSZhong Wang #define	FRM_IS_LAST_FRAME(x_frm)		(FRM_F_CTL(x_frm) & (1 << 19))
2907ff83669SZhong Wang #define	FRM_SENDER_IS_XCH_RESPONDER(x_frm)	(FRM_F_CTL(x_frm) & (1 << 23))
2912a8164dfSZhong Wang 
2922a8164dfSZhong Wang /*
2932a8164dfSZhong Wang  * FCOET/FCOEI will only call this fcoe function explicitly, all others
2942a8164dfSZhong Wang  * should be called through vectors in struct fcoe_port.
2952a8164dfSZhong Wang  * FCOE client call this to register one port to FCOE, FCOE need initialize
2962a8164dfSZhong Wang  * and return the corresponding fcoe_port.
2972a8164dfSZhong Wang  */
2982a8164dfSZhong Wang extern fcoe_port_t *fcoe_register_client(fcoe_client_t *client);
2992a8164dfSZhong Wang 
3002a8164dfSZhong Wang #define	EPORT_CLT_TYPE(eport)				\
3012a8164dfSZhong Wang 	(((eport)->eport_flags & EPORT_FLAG_INI_MODE) ? \
3022a8164dfSZhong Wang 	FCOE_CLIENT_INITIATOR : FCOE_CLIENT_TARGET)
3032a8164dfSZhong Wang 
3042a8164dfSZhong Wang #define	FCOE_SET_DEFAULT_OUI(x_oui)	\
3052a8164dfSZhong Wang 	(x_oui)[0] = 0x0e; (x_oui)[1] = 0xfc; (x_oui)[2] = 0x00;
3062a8164dfSZhong Wang #define	FCOE_SET_DEFAULT_FPORT_ADDR(x_addr)	\
3072a8164dfSZhong Wang 	FCOE_SET_DEFAULT_OUI(x_addr)		\
3082a8164dfSZhong Wang 	(x_addr)[3] = 0xff; (x_addr)[4] = 0xff; (x_addr)[5] = 0xfe;
3092a8164dfSZhong Wang 
3102a8164dfSZhong Wang /*
3112a8164dfSZhong Wang  * FC payload size
3122a8164dfSZhong Wang  */
3132a8164dfSZhong Wang #define	FCOE_DEFAULT_FCP_DATA_PAYLOAD_SIZE	2048
3142a8164dfSZhong Wang #define	FCOE_MIN_FCP_DATA_PAYLOAD_SIZE		1024
3152a8164dfSZhong Wang 
3162a8164dfSZhong Wang typedef struct fcoe_fcp_cmnd {
3172a8164dfSZhong Wang 	uint8_t ffc_lun[8];
3182a8164dfSZhong Wang 	uint8_t ffc_ref_num[1];
3192a8164dfSZhong Wang 
3202a8164dfSZhong Wang 	/*
3212a8164dfSZhong Wang 	 * least 3 bits
3222a8164dfSZhong Wang 	 */
3232a8164dfSZhong Wang 	uint8_t ffc_attribute[1];
3242a8164dfSZhong Wang 
3252a8164dfSZhong Wang 	/*
3262a8164dfSZhong Wang 	 * Magnagement flags
3272a8164dfSZhong Wang 	 */
3282a8164dfSZhong Wang 	uint8_t ffc_management_flags[1];
3292a8164dfSZhong Wang 
3302a8164dfSZhong Wang 	/*
3312a8164dfSZhong Wang 	 * additional cdb len and read/write flag
3322a8164dfSZhong Wang 	 */
3332a8164dfSZhong Wang 	uint8_t ffc_addlen_rdwr[1];
3342a8164dfSZhong Wang 
3352a8164dfSZhong Wang 	uint8_t ffc_cdb[16];
3362a8164dfSZhong Wang 	uint8_t ffc_fcp_dl[4];
3372a8164dfSZhong Wang } fcoe_fcp_cmnd_t;
3382a8164dfSZhong Wang 
3392a8164dfSZhong Wang typedef struct fcoe_fcp_rsp {
3402a8164dfSZhong Wang 	uint8_t ffr_rsvd[8];
3412a8164dfSZhong Wang 
3422a8164dfSZhong Wang 	/*
3432a8164dfSZhong Wang 	 * see SAM-4
3442a8164dfSZhong Wang 	 */
3452a8164dfSZhong Wang 	uint8_t ffr_retry_delay_timer[2];
3462a8164dfSZhong Wang 	uint8_t ffr_flags[1];
3472a8164dfSZhong Wang 	uint8_t ffr_scsi_status[1];
3482a8164dfSZhong Wang 	uint8_t ffr_resid[4];
3492a8164dfSZhong Wang 	uint8_t ffr_sns_len[4];
3502a8164dfSZhong Wang 	uint8_t ffr_rsp_len[4];
3512a8164dfSZhong Wang 	/*
3522a8164dfSZhong Wang 	 * Followed by sense data when available
3532a8164dfSZhong Wang 	 */
3542a8164dfSZhong Wang } fcoe_fcp_rsp_t;
3552a8164dfSZhong Wang 
3562a8164dfSZhong Wang typedef struct fcoe_fcp_xfer_rdy {
3572a8164dfSZhong Wang 	uint8_t fxr_data_ro[4];
3582a8164dfSZhong Wang 	uint8_t fxr_burst_len[4];
3592a8164dfSZhong Wang 	uint8_t fxr_rsvd[4];
3602a8164dfSZhong Wang } fcoe_fcp_xfer_rdy_t;
3612a8164dfSZhong Wang 
3622a8164dfSZhong Wang /*
3632a8164dfSZhong Wang  * FCOE project global functions
3642a8164dfSZhong Wang  */
3657ff83669SZhong Wang #if !defined(__FUNCTION__)
3667ff83669SZhong Wang #define	__FUNCTION__ ((caddr_t)__func__)
3677ff83669SZhong Wang #endif
3687ff83669SZhong Wang 
3697ff83669SZhong Wang #define	FCOE_STR_LEN 32
3707ff83669SZhong Wang 
3717ff83669SZhong Wang /*
3727ff83669SZhong Wang  * timestamp (golbal variable in sys/systm.h)
3737ff83669SZhong Wang  */
374*d3d50737SRafael Vanoni #define	CURRENT_CLOCK		(ddi_get_lbolt())
3752a8164dfSZhong Wang #define	FCOE_SEC2TICK(x_sec)	(drv_usectohz((x_sec) * 1000000))
3767ff83669SZhong Wang 
3777ff83669SZhong Wang /*
3787ff83669SZhong Wang  * Form/convert mod_hash_key from/to xch ID
3797ff83669SZhong Wang  */
3807ff83669SZhong Wang #define	FMHK(x_xid)		(mod_hash_key_t)(uintptr_t)(x_xid)
3817ff83669SZhong Wang #define	CMHK(x_key)		(uint16_t)(uintptr_t)(x_key)
3827ff83669SZhong Wang 
3832a8164dfSZhong Wang typedef void (*TQ_FUNC_P)(void *);
3842a8164dfSZhong Wang extern void fcoe_trace(caddr_t ident, const char *fmt, ...);
3852a8164dfSZhong Wang 
3862a8164dfSZhong Wang #endif
3872a8164dfSZhong Wang 
3882a8164dfSZhong Wang #ifdef	__cplusplus
3892a8164dfSZhong Wang }
3902a8164dfSZhong Wang #endif
3912a8164dfSZhong Wang 
3922a8164dfSZhong Wang #endif	/* _FCOE_COMMON_H_ */
393