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