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