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