xref: /onnv-gate/usr/src/uts/common/io/fcoe/fcoe.h (revision 10264:1196af6129ec)
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 
269087SZhong.Wang@Sun.COM /*
279087SZhong.Wang@Sun.COM  * The following notice accompanied the original version of this file:
289087SZhong.Wang@Sun.COM  *
299087SZhong.Wang@Sun.COM  * BSD LICENSE
309087SZhong.Wang@Sun.COM  *
319087SZhong.Wang@Sun.COM  * Copyright(c) 2007 Intel Corporation. All rights reserved.
329087SZhong.Wang@Sun.COM  * All rights reserved.
339087SZhong.Wang@Sun.COM  *
349087SZhong.Wang@Sun.COM  * Redistribution and use in source and binary forms, with or without
359087SZhong.Wang@Sun.COM  * modification, are permitted provided that the following conditions
369087SZhong.Wang@Sun.COM  * are met:
379087SZhong.Wang@Sun.COM  *
389087SZhong.Wang@Sun.COM  *   * Redistributions of source code must retain the above copyright
399087SZhong.Wang@Sun.COM  *     notice, this list of conditions and the following disclaimer.
409087SZhong.Wang@Sun.COM  *   * Redistributions in binary form must reproduce the above copyright
419087SZhong.Wang@Sun.COM  *     notice, this list of conditions and the following disclaimer in
429087SZhong.Wang@Sun.COM  *     the documentation and/or other materials provided with the
439087SZhong.Wang@Sun.COM  *     distribution.
449087SZhong.Wang@Sun.COM  *   * Neither the name of Intel Corporation nor the names of its
459087SZhong.Wang@Sun.COM  *     contributors may be used to endorse or promote products derived
469087SZhong.Wang@Sun.COM  *     from this software without specific prior written permission.
479087SZhong.Wang@Sun.COM  *
489087SZhong.Wang@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
499087SZhong.Wang@Sun.COM  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
509087SZhong.Wang@Sun.COM  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
519087SZhong.Wang@Sun.COM  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
529087SZhong.Wang@Sun.COM  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
539087SZhong.Wang@Sun.COM  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
549087SZhong.Wang@Sun.COM  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
559087SZhong.Wang@Sun.COM  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
569087SZhong.Wang@Sun.COM  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
579087SZhong.Wang@Sun.COM  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
589087SZhong.Wang@Sun.COM  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
599087SZhong.Wang@Sun.COM  */
609087SZhong.Wang@Sun.COM #ifndef	_FCOE_H_
619087SZhong.Wang@Sun.COM #define	_FCOE_H_
629087SZhong.Wang@Sun.COM 
639087SZhong.Wang@Sun.COM #ifdef	__cplusplus
649087SZhong.Wang@Sun.COM extern "C" {
659087SZhong.Wang@Sun.COM #endif
669087SZhong.Wang@Sun.COM 
679087SZhong.Wang@Sun.COM #ifdef	_KERNEL
689087SZhong.Wang@Sun.COM 
699087SZhong.Wang@Sun.COM extern int			 fcoe_use_ext_log;
709087SZhong.Wang@Sun.COM extern struct fcoe_soft_state	*fcoe_global_ss;
719087SZhong.Wang@Sun.COM 
729087SZhong.Wang@Sun.COM /*
739087SZhong.Wang@Sun.COM  * Caution: 1) LOG will be available in debug/non-debug mode
749087SZhong.Wang@Sun.COM  *	    2) Anything which can potentially flood the log should be under
759087SZhong.Wang@Sun.COM  *	       extended logging, and use FCOE_EXT_LOG.
769087SZhong.Wang@Sun.COM  *	    3) Don't use FCOE_EXT_LOG in performance-critical code path, such
779087SZhong.Wang@Sun.COM  *	       as normal SCSI I/O code path. It could hurt system performance.
789087SZhong.Wang@Sun.COM  *	    4) Use kmdb to change foce_use_ext_log in the fly to adjust
799087SZhong.Wang@Sun.COM  *	       tracing
809087SZhong.Wang@Sun.COM  */
819087SZhong.Wang@Sun.COM #define	FCOE_EXT_LOG(log_ident, ...)	\
829087SZhong.Wang@Sun.COM 	do {	\
839087SZhong.Wang@Sun.COM 		if (fcoe_use_ext_log) {	\
849087SZhong.Wang@Sun.COM 			fcoe_trace(log_ident, __VA_ARGS__);	\
859087SZhong.Wang@Sun.COM 		}	\
869087SZhong.Wang@Sun.COM 	} while (0)
879087SZhong.Wang@Sun.COM 
889087SZhong.Wang@Sun.COM #define	FCOE_LOG(log_ident, ...)	\
899087SZhong.Wang@Sun.COM 	fcoe_trace(log_ident, __VA_ARGS__)
909087SZhong.Wang@Sun.COM 
919087SZhong.Wang@Sun.COM /*
929087SZhong.Wang@Sun.COM  * There will be only one fcoe instance
939087SZhong.Wang@Sun.COM  */
949087SZhong.Wang@Sun.COM typedef struct fcoe_soft_state {
959087SZhong.Wang@Sun.COM 	dev_info_t	*ss_dip;
969087SZhong.Wang@Sun.COM 	uint32_t	 ss_flags;
979087SZhong.Wang@Sun.COM 	list_t		 ss_mac_list;
989087SZhong.Wang@Sun.COM 	uint32_t	 ss_ioctl_flags;
999087SZhong.Wang@Sun.COM 	kmutex_t	 ss_ioctl_mutex;
1009087SZhong.Wang@Sun.COM 
1019087SZhong.Wang@Sun.COM 	/*
1029087SZhong.Wang@Sun.COM 	 * watchdog stuff
1039087SZhong.Wang@Sun.COM 	 */
1049087SZhong.Wang@Sun.COM 	ddi_taskq_t	*ss_watchdog_taskq;
1059087SZhong.Wang@Sun.COM 	kcondvar_t	 ss_watch_cv;
1069087SZhong.Wang@Sun.COM 	kmutex_t	 ss_watch_mutex;
1079087SZhong.Wang@Sun.COM 	list_t		 ss_pfrm_list;	/* Pending frame */
1089087SZhong.Wang@Sun.COM } fcoe_soft_state_t;
1099087SZhong.Wang@Sun.COM 
1109087SZhong.Wang@Sun.COM #define	SS_FLAG_TERMINATE_WATCHDOG	0x0020
1119087SZhong.Wang@Sun.COM #define	SS_FLAG_WATCHDOG_RUNNING	0x0040
1129087SZhong.Wang@Sun.COM #define	SS_FLAG_DOG_WAITING		0x0080
1139087SZhong.Wang@Sun.COM 
1149087SZhong.Wang@Sun.COM /*
1159087SZhong.Wang@Sun.COM  *  Driver name
1169087SZhong.Wang@Sun.COM  */
1179087SZhong.Wang@Sun.COM #define	FCOEI_DRIVER_NAME	"fcoei"
1189087SZhong.Wang@Sun.COM #define	FCOET_DRIVER_NAME	"fcoet"
1199087SZhong.Wang@Sun.COM 
1209087SZhong.Wang@Sun.COM /*
1219087SZhong.Wang@Sun.COM  * One for each ethernet port
1229087SZhong.Wang@Sun.COM  */
1239087SZhong.Wang@Sun.COM typedef struct fcoe_mac
1249087SZhong.Wang@Sun.COM {
1259087SZhong.Wang@Sun.COM 	list_node_t		fm_ss_node;
1269307Skelly.hu@Sun.COM 	datalink_id_t		fm_linkid;
1279087SZhong.Wang@Sun.COM 	uint32_t		fm_flags;
1289087SZhong.Wang@Sun.COM 
1299087SZhong.Wang@Sun.COM 	fcoe_soft_state_t	*fm_ss;
1309087SZhong.Wang@Sun.COM 	fcoe_port_t		fm_eport;
1319087SZhong.Wang@Sun.COM 	fcoe_client_t		fm_client;
1329087SZhong.Wang@Sun.COM 	dev_info_t		*fm_client_dev;
1339087SZhong.Wang@Sun.COM 
1349087SZhong.Wang@Sun.COM 	mac_handle_t		fm_handle;
1359087SZhong.Wang@Sun.COM 	mac_client_handle_t	fm_cli_handle;
1369087SZhong.Wang@Sun.COM 	mac_promisc_handle_t	fm_promisc_handle;
1379087SZhong.Wang@Sun.COM 	mac_notify_handle_t	fm_notify_handle;
1389087SZhong.Wang@Sun.COM 	mac_unicast_handle_t	fm_unicst_handle;
1399087SZhong.Wang@Sun.COM 	uint8_t			fm_primary_addr[ETHERADDRL];
1409087SZhong.Wang@Sun.COM 	uint8_t			fm_current_addr[ETHERADDRL];
1419087SZhong.Wang@Sun.COM 	uint32_t		fm_running:1,
1429087SZhong.Wang@Sun.COM 				fm_force_promisc:1,
1439087SZhong.Wang@Sun.COM 				fm_rsvd:18,
1449087SZhong.Wang@Sun.COM 				fm_state:4,
1459087SZhong.Wang@Sun.COM 				fm_link_state:8;
1469087SZhong.Wang@Sun.COM 	uint32_t		fm_frm_cnt;
1479087SZhong.Wang@Sun.COM 	kcondvar_t		fm_tx_cv;
1489087SZhong.Wang@Sun.COM 	kmutex_t		fm_mutex;
1499087SZhong.Wang@Sun.COM } fcoe_mac_t;
1509087SZhong.Wang@Sun.COM 
1519087SZhong.Wang@Sun.COM #define	FCOE_MAC_STATE_OFFLINE		0x0
1529087SZhong.Wang@Sun.COM #define	FCOE_MAC_STATE_ONLINE		0x1
1539087SZhong.Wang@Sun.COM 
1549087SZhong.Wang@Sun.COM #define	FCOE_MAC_LINK_STATE_DOWN	0x00
1559087SZhong.Wang@Sun.COM #define	FCOE_MAC_LINK_STATE_UP		0x01
1569087SZhong.Wang@Sun.COM 
1579087SZhong.Wang@Sun.COM #define	FCOE_MAC_FLAG_ENABLED		0x01
1589087SZhong.Wang@Sun.COM #define	FCOE_MAC_FLAG_BOUND		0x02
159*10264SZhong.Wang@Sun.COM #define	FCOE_MAC_FLAG_USER_DEL		0x04
1609087SZhong.Wang@Sun.COM 
1619087SZhong.Wang@Sun.COM typedef struct fcoe_frame_header {
1629087SZhong.Wang@Sun.COM 	uint8_t		 ffh_ver[1];	/* version field - upper 4 bits */
1639087SZhong.Wang@Sun.COM 	uint8_t		 ffh_resvd[12];
1649087SZhong.Wang@Sun.COM 	uint8_t		 ffh_sof[1];	/* start of frame per RFC 3643 */
1659087SZhong.Wang@Sun.COM } fcoe_frame_header_t;
1669087SZhong.Wang@Sun.COM 
1679087SZhong.Wang@Sun.COM typedef struct fcoe_frame_tailer {
1689087SZhong.Wang@Sun.COM 	uint8_t		 fft_crc[4];	/* FC packet CRC */
1699087SZhong.Wang@Sun.COM 	uint8_t		 fft_eof[1];
1709087SZhong.Wang@Sun.COM 	uint8_t		 fft_resvd[3];
1719087SZhong.Wang@Sun.COM } fcoe_frame_tailer_t;
1729087SZhong.Wang@Sun.COM 
1739087SZhong.Wang@Sun.COM /*
1749087SZhong.Wang@Sun.COM  * RAW frame structure
1759087SZhong.Wang@Sun.COM  * It is used to describe the content of every mblk
1769087SZhong.Wang@Sun.COM  */
1779087SZhong.Wang@Sun.COM typedef struct fcoe_i_frame {
1789087SZhong.Wang@Sun.COM 	list_node_t		 fmi_pending_node;
1799087SZhong.Wang@Sun.COM 
1809087SZhong.Wang@Sun.COM 	fcoe_frame_t		*fmi_frame;	/* to common struct */
1819087SZhong.Wang@Sun.COM 	fcoe_mac_t		*fmi_mac;	/* to/from where */
1829087SZhong.Wang@Sun.COM 
1839087SZhong.Wang@Sun.COM 	/*
1849087SZhong.Wang@Sun.COM 	 * FRAME structure
1859087SZhong.Wang@Sun.COM 	 */
1869087SZhong.Wang@Sun.COM 	struct ether_header	*fmi_efh;	/* 14 bytes eth header */
1879087SZhong.Wang@Sun.COM 	fcoe_frame_header_t	*fmi_ffh;	/* 14 bytes FCOE hader */
1889087SZhong.Wang@Sun.COM 	uint8_t			*fmi_fc_frame;
1899087SZhong.Wang@Sun.COM 	fcoe_frame_tailer_t	*fmi_fft;	/* 8 bytes FCOE tailer */
1909087SZhong.Wang@Sun.COM } fcoe_i_frame_t;
1919087SZhong.Wang@Sun.COM 
1929087SZhong.Wang@Sun.COM typedef struct fcoe_worker {
1939087SZhong.Wang@Sun.COM 	list_t		worker_frm_list;
1949087SZhong.Wang@Sun.COM 	kmutex_t	worker_lock;
1959087SZhong.Wang@Sun.COM 	kcondvar_t	worker_cv;
1969087SZhong.Wang@Sun.COM 	uint32_t	worker_flags;
1979087SZhong.Wang@Sun.COM 	uint32_t	worker_ntasks;
1989087SZhong.Wang@Sun.COM } fcoe_worker_t;
1999087SZhong.Wang@Sun.COM 
2009087SZhong.Wang@Sun.COM #define	FCOE_WORKER_TERMINATE	0x01
2019087SZhong.Wang@Sun.COM #define	FCOE_WORKER_STARTED	0x02
2029087SZhong.Wang@Sun.COM #define	FCOE_WORKER_ACTIVE	0x04
2039087SZhong.Wang@Sun.COM 
2049087SZhong.Wang@Sun.COM /*
2059087SZhong.Wang@Sun.COM  * IOCTL supporting stuff
2069087SZhong.Wang@Sun.COM  */
2079087SZhong.Wang@Sun.COM #define	FCOE_IOCTL_FLAG_MASK		0xFF
2089087SZhong.Wang@Sun.COM #define	FCOE_IOCTL_FLAG_IDLE		0x00
2099087SZhong.Wang@Sun.COM #define	FCOE_IOCTL_FLAG_OPEN		0x01
2109087SZhong.Wang@Sun.COM #define	FCOE_IOCTL_FLAG_EXCL		0x02
2119087SZhong.Wang@Sun.COM #define	FCOE_IOCTL_FLAG_EXCL_BUSY	0x04
2129087SZhong.Wang@Sun.COM 
2139087SZhong.Wang@Sun.COM /*
2149087SZhong.Wang@Sun.COM  * define common-used macros to simplify coding
2159087SZhong.Wang@Sun.COM  */
2169087SZhong.Wang@Sun.COM #define	FCOE_FIP_TYPE		0x8914
2179087SZhong.Wang@Sun.COM #define	FCOE_802_1Q_TAG		0x8100
2189087SZhong.Wang@Sun.COM 
2199087SZhong.Wang@Sun.COM #define	PADDING_HEADER_SIZE	(sizeof (struct ether_header) + \
2209087SZhong.Wang@Sun.COM 	sizeof (fcoe_frame_header_t))
2219087SZhong.Wang@Sun.COM #define	PADDING_SIZE	(PADDING_HEADER_SIZE + sizeof (fcoe_frame_tailer_t))
2229087SZhong.Wang@Sun.COM 
2239087SZhong.Wang@Sun.COM #define	EPORT2MAC(x_eport)	((fcoe_mac_t *)(x_eport)->eport_fcoe_private)
2249087SZhong.Wang@Sun.COM 
2259087SZhong.Wang@Sun.COM #define	FRM2MAC(x_frm)		(EPORT2MAC((x_frm)->frm_eport))
2269087SZhong.Wang@Sun.COM #define	FRM2FMI(x_frm)		((fcoe_i_frame_t *)(x_frm)->frm_fcoe_private)
2279087SZhong.Wang@Sun.COM #define	FRM2MBLK(x_frm)		((mblk_t *)(x_frm)->frm_netb)
2289087SZhong.Wang@Sun.COM 
2299087SZhong.Wang@Sun.COM #define	FCOE_VER			0
2309087SZhong.Wang@Sun.COM #define	FCOE_DECAPS_VER(x_ffh)		((x_ffh)->ffh_ver[0] >> 4)
2319087SZhong.Wang@Sun.COM #define	FCOE_ENCAPS_VER(x_ffh, x_v)			\
2329087SZhong.Wang@Sun.COM 	{						\
2339087SZhong.Wang@Sun.COM 		(x_ffh)->ffh_ver[0] = ((x_v) << 4);	\
2349087SZhong.Wang@Sun.COM 	}
2359087SZhong.Wang@Sun.COM 
2369087SZhong.Wang@Sun.COM /*
2379087SZhong.Wang@Sun.COM  * fcoe driver common functions
2389087SZhong.Wang@Sun.COM  */
2399307Skelly.hu@Sun.COM extern fcoe_mac_t *fcoe_lookup_mac_by_id(datalink_id_t);
2409087SZhong.Wang@Sun.COM extern void fcoe_destroy_mac(fcoe_mac_t *);
2419087SZhong.Wang@Sun.COM extern mblk_t *fcoe_get_mblk(fcoe_mac_t *, uint32_t);
2429087SZhong.Wang@Sun.COM extern void fcoe_post_frame(fcoe_frame_t *);
2439087SZhong.Wang@Sun.COM 
2449087SZhong.Wang@Sun.COM #endif	/* _KERNEL */
2459087SZhong.Wang@Sun.COM 
2469087SZhong.Wang@Sun.COM #ifdef	__cplusplus
2479087SZhong.Wang@Sun.COM }
2489087SZhong.Wang@Sun.COM #endif
2499087SZhong.Wang@Sun.COM 
2509087SZhong.Wang@Sun.COM #endif	/* _FCOE_H_ */
251