1*7ff83669SZhong Wang /* 2*7ff83669SZhong Wang * CDDL HEADER START 3*7ff83669SZhong Wang * 4*7ff83669SZhong Wang * The contents of this file are subject to the terms of the 5*7ff83669SZhong Wang * Common Development and Distribution License (the "License"). 6*7ff83669SZhong Wang * You may not use this file except in compliance with the License. 7*7ff83669SZhong Wang * 8*7ff83669SZhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*7ff83669SZhong Wang * or http://www.opensolaris.org/os/licensing. 10*7ff83669SZhong Wang * See the License for the specific language governing permissions 11*7ff83669SZhong Wang * and limitations under the License. 12*7ff83669SZhong Wang * 13*7ff83669SZhong Wang * When distributing Covered Code, include this CDDL HEADER in each 14*7ff83669SZhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*7ff83669SZhong Wang * If applicable, add the following below this CDDL HEADER, with the 16*7ff83669SZhong Wang * fields enclosed by brackets "[]" replaced with your own identifying 17*7ff83669SZhong Wang * information: Portions Copyright [yyyy] [name of copyright owner] 18*7ff83669SZhong Wang * 19*7ff83669SZhong Wang * CDDL HEADER END 20*7ff83669SZhong Wang */ 21*7ff83669SZhong Wang /* 22*7ff83669SZhong Wang * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*7ff83669SZhong Wang * Use is subject to license terms. 24*7ff83669SZhong Wang */ 25*7ff83669SZhong Wang #ifndef _FCOEI_H 26*7ff83669SZhong Wang #define _FCOEI_H 27*7ff83669SZhong Wang 28*7ff83669SZhong Wang #ifdef __cplusplus 29*7ff83669SZhong Wang extern "C" { 30*7ff83669SZhong Wang #endif 31*7ff83669SZhong Wang 32*7ff83669SZhong Wang #ifdef _KERNEL 33*7ff83669SZhong Wang 34*7ff83669SZhong Wang /* 35*7ff83669SZhong Wang * FCOEI logging 36*7ff83669SZhong Wang */ 37*7ff83669SZhong Wang extern int fcoei_use_ext_log; 38*7ff83669SZhong Wang extern void *fcoei_state; 39*7ff83669SZhong Wang 40*7ff83669SZhong Wang #define FCOEI_EXT_LOG(log_ident, ...) \ 41*7ff83669SZhong Wang { \ 42*7ff83669SZhong Wang if (fcoei_use_ext_log) { \ 43*7ff83669SZhong Wang fcoe_trace(log_ident, __VA_ARGS__); \ 44*7ff83669SZhong Wang } \ 45*7ff83669SZhong Wang } 46*7ff83669SZhong Wang 47*7ff83669SZhong Wang #define FCOEI_LOG(log_ident, ...) \ 48*7ff83669SZhong Wang fcoe_trace(log_ident, __VA_ARGS__) 49*7ff83669SZhong Wang 50*7ff83669SZhong Wang /* 51*7ff83669SZhong Wang * IOCTL supporting stuff 52*7ff83669SZhong Wang */ 53*7ff83669SZhong Wang #define FCOEI_IOCTL_FLAG_MASK 0xFF 54*7ff83669SZhong Wang #define FCOEI_IOCTL_FLAG_IDLE 0x00 55*7ff83669SZhong Wang #define FCOEI_IOCTL_FLAG_OPEN 0x01 56*7ff83669SZhong Wang #define FCOEI_IOCTL_FLAG_EXCL 0x02 57*7ff83669SZhong Wang 58*7ff83669SZhong Wang /* 59*7ff83669SZhong Wang * define common constants 60*7ff83669SZhong Wang */ 61*7ff83669SZhong Wang #define FCOEI_MAX_OPEN_XCHS 2048 62*7ff83669SZhong Wang #define FCOEI_SOL_HASH_SIZE 2048 63*7ff83669SZhong Wang #define FCOEI_UNSOL_HASH_SIZE 128 64*7ff83669SZhong Wang #define FCOEI_VERSION "20090729-1.00" 65*7ff83669SZhong Wang #define FCOEI_NAME_VERSION "SunFC FCoEI v" FCOEI_VERSION 66*7ff83669SZhong Wang 67*7ff83669SZhong Wang /* 68*7ff83669SZhong Wang * define RNID Management Info 69*7ff83669SZhong Wang */ 70*7ff83669SZhong Wang #define FCOEI_RNID_HBA 0x7 71*7ff83669SZhong Wang #define FCOEI_RNID_IPV4 0x1 72*7ff83669SZhong Wang #define FCOEI_RNID_IPV6 0x2 73*7ff83669SZhong Wang 74*7ff83669SZhong Wang typedef enum event_type { 75*7ff83669SZhong Wang AE_EVENT_NONE = 0, 76*7ff83669SZhong Wang AE_EVENT_EXCHANGE, 77*7ff83669SZhong Wang AE_EVENT_SOL_FRAME, 78*7ff83669SZhong Wang AE_EVENT_UNSOL_FRAME, 79*7ff83669SZhong Wang AE_EVENT_PORT, 80*7ff83669SZhong Wang AE_EVENT_ABORT, 81*7ff83669SZhong Wang AE_EVENT_RESET, 82*7ff83669SZhong Wang } event_type_e; 83*7ff83669SZhong Wang 84*7ff83669SZhong Wang typedef struct fcoei_event { 85*7ff83669SZhong Wang list_node_t ae_node; 86*7ff83669SZhong Wang event_type_e ae_type; 87*7ff83669SZhong Wang 88*7ff83669SZhong Wang /* 89*7ff83669SZhong Wang * event specific 90*7ff83669SZhong Wang */ 91*7ff83669SZhong Wang uint64_t ae_specific; 92*7ff83669SZhong Wang 93*7ff83669SZhong Wang /* 94*7ff83669SZhong Wang * event related object 95*7ff83669SZhong Wang */ 96*7ff83669SZhong Wang void *ae_obj; 97*7ff83669SZhong Wang } fcoei_event_t; 98*7ff83669SZhong Wang 99*7ff83669SZhong Wang typedef struct fcoei_soft_state { 100*7ff83669SZhong Wang dev_info_t *ss_dip; 101*7ff83669SZhong Wang uint32_t ss_flags; 102*7ff83669SZhong Wang uint32_t ss_fcp_data_payload_size; 103*7ff83669SZhong Wang list_t ss_comp_xch_list; 104*7ff83669SZhong Wang 105*7ff83669SZhong Wang /* 106*7ff83669SZhong Wang * common data structure (fc_local_port_t) between leadville and fcoei 107*7ff83669SZhong Wang */ 108*7ff83669SZhong Wang void *ss_port; 109*7ff83669SZhong Wang 110*7ff83669SZhong Wang /* 111*7ff83669SZhong Wang * common data structure between fcoei and fcoe module 112*7ff83669SZhong Wang */ 113*7ff83669SZhong Wang fcoe_port_t *ss_eport; 114*7ff83669SZhong Wang 115*7ff83669SZhong Wang mod_hash_t *ss_sol_oxid_hash; 116*7ff83669SZhong Wang mod_hash_t *ss_unsol_rxid_hash; 117*7ff83669SZhong Wang uint16_t ss_next_sol_oxid; 118*7ff83669SZhong Wang uint16_t ss_next_unsol_rxid; 119*7ff83669SZhong Wang 120*7ff83669SZhong Wang /* 121*7ff83669SZhong Wang * We will use ss_taskq to dispatch watchdog and other tasks 122*7ff83669SZhong Wang */ 123*7ff83669SZhong Wang ddi_taskq_t *ss_taskq; 124*7ff83669SZhong Wang 125*7ff83669SZhong Wang kcondvar_t ss_watchdog_cv; 126*7ff83669SZhong Wang kmutex_t ss_watchdog_mutex; 127*7ff83669SZhong Wang 128*7ff83669SZhong Wang /* 129*7ff83669SZhong Wang * current port state, speed. see fctl.h 130*7ff83669SZhong Wang */ 131*7ff83669SZhong Wang uint16_t ss_link_state; 132*7ff83669SZhong Wang uint16_t ss_link_speed; 133*7ff83669SZhong Wang 134*7ff83669SZhong Wang /* 135*7ff83669SZhong Wang * # of unprocessed port/link change 136*7ff83669SZhong Wang */ 137*7ff83669SZhong Wang uint32_t ss_port_event_counter; 138*7ff83669SZhong Wang list_t ss_event_list; 139*7ff83669SZhong Wang 140*7ff83669SZhong Wang /* 141*7ff83669SZhong Wang * solicited and unsolicited exchanges timing checking 142*7ff83669SZhong Wang */ 143*7ff83669SZhong Wang uint32_t ss_sol_cnt1; 144*7ff83669SZhong Wang uint32_t ss_sol_cnt2; 145*7ff83669SZhong Wang uint32_t *ss_sol_cnt; 146*7ff83669SZhong Wang uint32_t ss_unsol_cnt1; 147*7ff83669SZhong Wang uint32_t ss_unsol_cnt2; 148*7ff83669SZhong Wang uint32_t *ss_unsol_cnt; 149*7ff83669SZhong Wang 150*7ff83669SZhong Wang /* 151*7ff83669SZhong Wang * ioctl related stuff 152*7ff83669SZhong Wang */ 153*7ff83669SZhong Wang uint32_t ss_ioctl_flags; 154*7ff83669SZhong Wang kmutex_t ss_ioctl_mutex; 155*7ff83669SZhong Wang 156*7ff83669SZhong Wang /* 157*7ff83669SZhong Wang * fp-defined routines that fcoei will call 158*7ff83669SZhong Wang */ 159*7ff83669SZhong Wang fc_fca_bind_info_t ss_bind_info; 160*7ff83669SZhong Wang 161*7ff83669SZhong Wang /* 162*7ff83669SZhong Wang * fcoei-defined plogi response that fp will use 163*7ff83669SZhong Wang */ 164*7ff83669SZhong Wang la_els_logi_t ss_els_logi; 165*7ff83669SZhong Wang 166*7ff83669SZhong Wang /* 167*7ff83669SZhong Wang * fcoei-defined routines that fp will call 168*7ff83669SZhong Wang */ 169*7ff83669SZhong Wang fc_fca_tran_t ss_fca_tran; 170*7ff83669SZhong Wang 171*7ff83669SZhong Wang /* 172*7ff83669SZhong Wang * Direct p2p information, and ss's fcid will be stored here 173*7ff83669SZhong Wang */ 174*7ff83669SZhong Wang fc_fca_p2p_info_t ss_p2p_info; 175*7ff83669SZhong Wang 176*7ff83669SZhong Wang /* 177*7ff83669SZhong Wang * RNID Management Information 178*7ff83669SZhong Wang */ 179*7ff83669SZhong Wang fc_rnid_t ss_rnid; 180*7ff83669SZhong Wang } fcoei_soft_state_t; 181*7ff83669SZhong Wang 182*7ff83669SZhong Wang #define SS_FLAG_LV_NONE 0x0000 183*7ff83669SZhong Wang #define SS_FLAG_LV_BOUND 0x0001 184*7ff83669SZhong Wang #define SS_FLAG_PORT_DISABLED 0x0002 185*7ff83669SZhong Wang #define SS_FLAG_TERMINATE_WATCHDOG 0x0004 186*7ff83669SZhong Wang #define SS_FLAG_WATCHDOG_RUNNING 0x0008 187*7ff83669SZhong Wang #define SS_FLAG_WATCHDOG_IDLE 0x0010 188*7ff83669SZhong Wang #define SS_FLAG_TRIGGER_FP_ATTACH 0x0020 189*7ff83669SZhong Wang #define SS_FLAG_FLOGI_FAILED 0x0040 190*7ff83669SZhong Wang 191*7ff83669SZhong Wang /* 192*7ff83669SZhong Wang * fcoei_frame - corresponding data structure to fcoe_frame/fc_frame 193*7ff83669SZhong Wang */ 194*7ff83669SZhong Wang typedef struct fcoei_frame { 195*7ff83669SZhong Wang fcoei_event_t ifm_ae; 196*7ff83669SZhong Wang fcoe_frame_t *ifm_frm; 197*7ff83669SZhong Wang uint32_t ifm_flags; 198*7ff83669SZhong Wang struct fcoei_exchange *ifm_xch; 199*7ff83669SZhong Wang 200*7ff83669SZhong Wang /* 201*7ff83669SZhong Wang * will be used after the relevant frame mblk was released by ETH layer 202*7ff83669SZhong Wang */ 203*7ff83669SZhong Wang uint8_t ifm_rctl; 204*7ff83669SZhong Wang } fcoei_frame_t; 205*7ff83669SZhong Wang 206*7ff83669SZhong Wang #define IFM_FLAG_NONE 0x0000 207*7ff83669SZhong Wang #define IFM_FLAG_FREE_NETB 0x0001 208*7ff83669SZhong Wang 209*7ff83669SZhong Wang /* 210*7ff83669SZhong Wang * fcoei_exchange - corresponding data structure to leadville fc_packet 211*7ff83669SZhong Wang */ 212*7ff83669SZhong Wang typedef struct fcoei_exchange { 213*7ff83669SZhong Wang list_node_t xch_comp_node; 214*7ff83669SZhong Wang fcoei_event_t xch_ae; 215*7ff83669SZhong Wang uint32_t xch_flags; 216*7ff83669SZhong Wang fcoei_soft_state_t *xch_ss; 217*7ff83669SZhong Wang clock_t xch_start_tick; 218*7ff83669SZhong Wang clock_t xch_end_tick; 219*7ff83669SZhong Wang int xch_resid; 220*7ff83669SZhong Wang ksema_t xch_sema; 221*7ff83669SZhong Wang 222*7ff83669SZhong Wang /* 223*7ff83669SZhong Wang * current cnt for timing check, when the exchange is created 224*7ff83669SZhong Wang */ 225*7ff83669SZhong Wang uint32_t *xch_cnt; 226*7ff83669SZhong Wang 227*7ff83669SZhong Wang /* 228*7ff83669SZhong Wang * leadville fc_packet will not maintain oxid/rxid, 229*7ff83669SZhong Wang * so fcoei exchange need do it 230*7ff83669SZhong Wang */ 231*7ff83669SZhong Wang uint16_t xch_oxid; 232*7ff83669SZhong Wang uint16_t xch_rxid; 233*7ff83669SZhong Wang 234*7ff83669SZhong Wang /* 235*7ff83669SZhong Wang * to link leadville's stuff 236*7ff83669SZhong Wang */ 237*7ff83669SZhong Wang fc_packet_t *xch_fpkt; 238*7ff83669SZhong Wang fc_unsol_buf_t *xch_ub; 239*7ff83669SZhong Wang } fcoei_exchange_t; 240*7ff83669SZhong Wang 241*7ff83669SZhong Wang #define XCH_FLAG_NONE 0x00000000 242*7ff83669SZhong Wang #define XCH_FLAG_TMOUT 0x00000001 243*7ff83669SZhong Wang #define XCH_FLAG_ABORT 0x00000002 244*7ff83669SZhong Wang #define XCH_FLAG_IN_SOL_HASH 0x00000004 245*7ff83669SZhong Wang #define XCH_FLAG_IN_UNSOL_HASH 0x00000008 246*7ff83669SZhong Wang 247*7ff83669SZhong Wang typedef struct fcoei_walk_arg 248*7ff83669SZhong Wang { 249*7ff83669SZhong Wang fcoei_exchange_t *wa_xch; 250*7ff83669SZhong Wang uint16_t wa_oxid; 251*7ff83669SZhong Wang } fcoei_walk_arg_t; 252*7ff83669SZhong Wang 253*7ff83669SZhong Wang /* 254*7ff83669SZhong Wang * Define conversion and calculation macros 255*7ff83669SZhong Wang */ 256*7ff83669SZhong Wang #define FRM2IFM(x_frm) ((fcoei_frame_t *)(x_frm)->frm_client_private) 257*7ff83669SZhong Wang #define FRM2SS(x_frm) \ 258*7ff83669SZhong Wang ((fcoei_soft_state_t *)(x_frm)->frm_eport->eport_client_private) 259*7ff83669SZhong Wang 260*7ff83669SZhong Wang #define PORT2SS(x_port) ((fcoei_soft_state_t *)(x_port)->port_fca_private) 261*7ff83669SZhong Wang #define EPORT2SS(x_eport) \ 262*7ff83669SZhong Wang ((fcoei_soft_state_t *)(x_eport)->eport_client_private) 263*7ff83669SZhong Wang 264*7ff83669SZhong Wang #define FPKT2XCH(x_fpkt) ((fcoei_exchange_t *)x_fpkt->pkt_fca_private) 265*7ff83669SZhong Wang #define FRM2FPKT(x_fpkt) (FRM2IFM(frm)->ifm_xch->xch_fpkt) 266*7ff83669SZhong Wang 267*7ff83669SZhong Wang #define HANDLE2SS(x_handle) ((fcoei_soft_state_t *)fca_handle) 268*7ff83669SZhong Wang 269*7ff83669SZhong Wang #define FPLD frm->frm_payload 270*7ff83669SZhong Wang 271*7ff83669SZhong Wang #define FCOEI_FRM2FHDR(x_frm, x_fhdr) \ 272*7ff83669SZhong Wang { \ 273*7ff83669SZhong Wang (x_fhdr)->r_ctl = FRM_R_CTL(x_frm); \ 274*7ff83669SZhong Wang (x_fhdr)->d_id = FRM_D_ID(x_frm); \ 275*7ff83669SZhong Wang (x_fhdr)->s_id = FRM_S_ID(x_frm); \ 276*7ff83669SZhong Wang (x_fhdr)->type = FRM_TYPE(x_frm); \ 277*7ff83669SZhong Wang (x_fhdr)->f_ctl = FRM_F_CTL(x_frm); \ 278*7ff83669SZhong Wang (x_fhdr)->seq_id = FRM_SEQ_ID(x_frm); \ 279*7ff83669SZhong Wang (x_fhdr)->df_ctl = FRM_DF_CTL(x_frm); \ 280*7ff83669SZhong Wang (x_fhdr)->seq_cnt = FRM_SEQ_CNT(x_frm); \ 281*7ff83669SZhong Wang (x_fhdr)->ox_id = FRM_OXID(x_frm); \ 282*7ff83669SZhong Wang (x_fhdr)->rx_id = FRM_RXID(x_frm); \ 283*7ff83669SZhong Wang (x_fhdr)->ro = FRM_PARAM(x_frm); \ 284*7ff83669SZhong Wang } 285*7ff83669SZhong Wang 286*7ff83669SZhong Wang #define FCOEI_PARTIAL_FHDR2FRM(x_fhdr, x_frm) \ 287*7ff83669SZhong Wang { \ 288*7ff83669SZhong Wang FFM_R_CTL((x_fhdr)->r_ctl, x_frm); \ 289*7ff83669SZhong Wang FFM_D_ID((x_fhdr)->d_id, x_frm); \ 290*7ff83669SZhong Wang FFM_S_ID((x_fhdr)->s_id, x_frm); \ 291*7ff83669SZhong Wang FFM_TYPE((x_fhdr)->type, x_frm); \ 292*7ff83669SZhong Wang FFM_F_CTL((x_fhdr)->f_ctl, x_frm); \ 293*7ff83669SZhong Wang } 294*7ff83669SZhong Wang 295*7ff83669SZhong Wang #define PRT_FRM_HDR(x_p, x_f) \ 296*7ff83669SZhong Wang { \ 297*7ff83669SZhong Wang FCOEI_LOG(x_p, "rctl/%x, fctl/%x, type/%x, oxid/%x", \ 298*7ff83669SZhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_r_ctl), \ 299*7ff83669SZhong Wang FCOE_B2V_3((x_f)->frm_hdr->hdr_f_ctl), \ 300*7ff83669SZhong Wang FCOE_B2V_1((x_f)->frm_hdr->hdr_type), \ 301*7ff83669SZhong Wang FCOE_B2V_2((x_f)->frm_hdr->hdr_oxid)); \ 302*7ff83669SZhong Wang } 303*7ff83669SZhong Wang 304*7ff83669SZhong Wang #define FCOEI_INIT_SOL_ID_HASH(xch, xch_tmp) \ 305*7ff83669SZhong Wang { \ 306*7ff83669SZhong Wang do { \ 307*7ff83669SZhong Wang if (++xch->xch_ss->ss_next_sol_oxid == 0xFFFF) { \ 308*7ff83669SZhong Wang ++xch->xch_ss->ss_next_sol_oxid; \ 309*7ff83669SZhong Wang } \ 310*7ff83669SZhong Wang } while (mod_hash_find(xch->xch_ss->ss_sol_oxid_hash, \ 311*7ff83669SZhong Wang (mod_hash_key_t)(intptr_t)xch->xch_ss->ss_next_sol_oxid, \ 312*7ff83669SZhong Wang (mod_hash_val_t)&xch_tmp) == 0); \ 313*7ff83669SZhong Wang xch->xch_oxid = xch->xch_ss->ss_next_sol_oxid; \ 314*7ff83669SZhong Wang xch->xch_rxid = 0xFFFF; \ 315*7ff83669SZhong Wang (void) mod_hash_insert(xch->xch_ss->ss_sol_oxid_hash, \ 316*7ff83669SZhong Wang FMHK(xch->xch_oxid), (mod_hash_val_t)xch); \ 317*7ff83669SZhong Wang xch->xch_flags |= XCH_FLAG_IN_SOL_HASH; \ 318*7ff83669SZhong Wang } 319*7ff83669SZhong Wang 320*7ff83669SZhong Wang #define FCOEI_SET_UNSOL_FRM_RXID(frm, xch_tmp) \ 321*7ff83669SZhong Wang { \ 322*7ff83669SZhong Wang do { \ 323*7ff83669SZhong Wang if (++FRM2SS(frm)->ss_next_unsol_rxid == 0xFFFF) { \ 324*7ff83669SZhong Wang ++FRM2SS(frm)->ss_next_unsol_rxid; \ 325*7ff83669SZhong Wang } \ 326*7ff83669SZhong Wang } while (mod_hash_find(FRM2SS(frm)->ss_unsol_rxid_hash, \ 327*7ff83669SZhong Wang (mod_hash_key_t)(intptr_t)FRM2SS(frm)->ss_next_unsol_rxid, \ 328*7ff83669SZhong Wang (mod_hash_val_t)&xch_tmp) == 0); \ 329*7ff83669SZhong Wang FFM_RXID(FRM2SS(frm)->ss_next_unsol_rxid, frm); \ 330*7ff83669SZhong Wang } 331*7ff83669SZhong Wang 332*7ff83669SZhong Wang #define FCOEI_INIT_UNSOL_ID_HASH(xch) \ 333*7ff83669SZhong Wang { \ 334*7ff83669SZhong Wang xch->xch_oxid = fpkt->pkt_cmd_fhdr.ox_id; \ 335*7ff83669SZhong Wang xch->xch_rxid = fpkt->pkt_cmd_fhdr.rx_id; \ 336*7ff83669SZhong Wang (void) mod_hash_insert(xch->xch_ss->ss_unsol_rxid_hash, \ 337*7ff83669SZhong Wang FMHK(xch->xch_rxid), (mod_hash_val_t)xch); \ 338*7ff83669SZhong Wang xch->xch_flags |= XCH_FLAG_IN_UNSOL_HASH; \ 339*7ff83669SZhong Wang } 340*7ff83669SZhong Wang 341*7ff83669SZhong Wang /* 342*7ff83669SZhong Wang * Common functions defined in fcoei.c 343*7ff83669SZhong Wang */ 344*7ff83669SZhong Wang void fcoei_complete_xch(fcoei_exchange_t *xch, fcoe_frame_t *frm, 345*7ff83669SZhong Wang uint8_t pkt_state, uint8_t pkt_reason); 346*7ff83669SZhong Wang void fcoei_init_ifm(fcoe_frame_t *frm, fcoei_exchange_t *xch); 347*7ff83669SZhong Wang void fcoei_handle_comp_xch_list(fcoei_soft_state_t *ss); 348*7ff83669SZhong Wang 349*7ff83669SZhong Wang /* 350*7ff83669SZhong Wang * Common functions defined in fcoei_lv.c 351*7ff83669SZhong Wang */ 352*7ff83669SZhong Wang void fcoei_init_fcatran_vectors(fc_fca_tran_t *fcatran); 353*7ff83669SZhong Wang void fcoei_process_event_exchange(fcoei_event_t *ae); 354*7ff83669SZhong Wang void fcoei_process_event_reset(fcoei_event_t *ae); 355*7ff83669SZhong Wang 356*7ff83669SZhong Wang /* 357*7ff83669SZhong Wang * Common functions defined in fcoei_eth.c 358*7ff83669SZhong Wang */ 359*7ff83669SZhong Wang void fcoei_init_ect_vectors(fcoe_client_t *ect); 360*7ff83669SZhong Wang void fcoei_process_unsol_frame(fcoe_frame_t *frm); 361*7ff83669SZhong Wang void fcoei_handle_sol_frame_done(fcoe_frame_t *frm); 362*7ff83669SZhong Wang void fcoei_process_event_port(fcoei_event_t *ae); 363*7ff83669SZhong Wang void fcoei_port_event(fcoe_port_t *eport, uint32_t event); 364*7ff83669SZhong Wang 365*7ff83669SZhong Wang #endif /* _KERNEL */ 366*7ff83669SZhong Wang 367*7ff83669SZhong Wang #ifdef __cplusplus 368*7ff83669SZhong Wang } 369*7ff83669SZhong Wang #endif 370*7ff83669SZhong Wang 371*7ff83669SZhong Wang #endif /* _FCOEI_H */ 372