2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER START
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * The contents of this file are subject to the terms of the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Common Development and Distribution License (the "License").
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You may not use this file except in compliance with the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * or http://www.opensolaris.org/os/licensing.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * See the License for the specific language governing permissions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and limitations under the License.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * When distributing Covered Code, include this CDDL HEADER in each
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * If applicable, add the following below this CDDL HEADER, with the
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang *
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER END
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Use is subject to license terms.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifndef _FCOE_COMMON_H_
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define _FCOE_COMMON_H_
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef __cplusplus
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern "C" {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef _KERNEL
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Interface return value
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_SUCCESS 0
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_FAILURE -1
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_BUSY -2
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_NOT_SUPPORTED -3
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_BAD_FRAME -4
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE port speed
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_PORT_SPEED_1G 1000000000
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_PORT_SPEED_10G 10000000000
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FC Frame header size: 24 bytes
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCFH_SIZE (sizeof (fcoe_fc_frame_header_t))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FLOGI
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FLOGI_REQ_PAYLOAD_SIZE 116
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FLOGI_ACC_PAYLOAD_SIZE 116
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_MIN_MTU_SIZE 2500
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOE_MAX_FC_FRAME_SIZE 2136
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * 24 byte FC frame header
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * For all data structures that have endian problems, we will use only
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * one type: uint8_t. We need associate the data structure pointer with
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * one buffer directly.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_fc_frame_header {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_r_ctl[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_d_id[3];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_cs_ctl[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_s_id[3];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_type[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_f_ctl[3];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_seq_id[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_df_ctl[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_seq_cnt[2];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_oxid[2];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_rxid[2];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t hdr_param[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_fc_frame_header_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Solicited frame: allocted by FCOET/FOCEI, free-ed by FCOE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Unsolicited frame: allocated by FCOE, free-ed by FCOET/FCOEI
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangstruct fcoe_port;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_frame {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t frm_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *frm_netb;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm_hdr will be cleared by fcoe explicitly
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_fc_frame_header_t *frm_hdr;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *frm_ofh1;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *frm_ofh2;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *frm_fc_frame;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoe client need clear FC payload explicitly,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * except for RD/WR data frames
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *frm_payload;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t frm_fc_frame_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t frm_payload_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t frm_alloc_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang struct fcoe_port *frm_eport;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *frm_fcoe_private;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *frm_client_private;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang clock_t frm_clock;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_frame_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE HBA
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_port {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t eport_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *eport_fcoe_private;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *eport_client_private;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t eport_portwwn[8];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t eport_nodewwn[8];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t eport_max_fc_frame_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t eport_mtu;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint64_t eport_link_speed;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t eport_efh_dst[ETHERADDRL];
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_tx_frame)(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *(*eport_alloc_frame)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t this_fc_frame_size, void *netb);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_release_frame)(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *(*eport_alloc_netb)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t this_fc_frame_size, uint8_t **ppfc);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_free_netb)(void *netb);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_deregister_client)(struct fcoe_port *eport);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int (*eport_ctl)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int cmd, void *arg);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int (*eport_set_mac_address)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t *addr, boolean_t fc_assigned);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_port_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE only supports two kinds of topology: direct P2P, fabric P2P.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT_FLAG_IS_DIRECT_P2P 0x01
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT_FLAG_TGT_MODE 0x02
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT_FLAG_INI_MODE 0x04
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT_FLAG_MAC_IN_USE 0x08
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_NOTIFY_EPORT_LINK_UP 0x01
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_NOTIFY_EPORT_LINK_DOWN 0x02
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_NOTIFY_EPORT_ADDR_CHG 0x03
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_PORT_CTL_CMDS 0x3000
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_CMD_PORT_ONLINE (FCOE_PORT_CTL_CMDS | 0x01)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_CMD_PORT_OFFLINE (FCOE_PORT_CTL_CMDS | 0x02)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCoE version control
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangtypedef enum fcoe_ver
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang{
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_VER_1 = 0xAA01,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_VER_2,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_VER_3,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_VER_4,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_VER_5
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang} fcoe_ver_e;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOE_VER_NOW FCOE_VER_1
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangextern const fcoe_ver_e fcoe_ver_now;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_client {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoe_ver_e ect_fcoe_ver;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ect_eport_flags;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ect_max_fc_frame_size;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint32_t ect_private_frame_struct_size;
d4401b99a36e5170ccaa7defc0d2ac65b23f08c6Kelly Hu uint32_t ect_channelid;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *ect_client_port_struct;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*ect_rx_frame)(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*ect_port_event)(fcoe_port_t *eport, uint32_t event);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*ect_release_sol_frame)(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_client_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Define common-used conversion or calculation macros
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_V2B_1(x_v, x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] = 0xFF & (x_v); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_V2B_2(x_v, x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] = 0xFF & (x_v); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 8); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_V2B_3(x_v, x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[2] = 0xFF & (x_v); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 8); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 16); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_V2B_4(x_v, x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[3] = 0xFF & (x_v); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 8); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 16); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 24); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_V2B_8(x_v, x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang { \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[7] = 0xFF & (x_v); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[6] = 0xFF & ((x_v) >> 8); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[5] = 0xFF & ((x_v) >> 16); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[4] = 0xFF & ((x_v) >> 24); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[3] = 0xFF & ((x_v) >> 32); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[2] = 0xFF & ((x_v) >> 40); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] = 0xFF & ((x_v) >> 48); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] = 0xFF & ((x_v) >> 56); \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang }
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_B2V_1(x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[0]) & 0xFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_B2V_2(x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[1] | ((uint8_t *)(x_b))[0] << 8) & 0xFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_B2V_3(x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[2] | ((uint8_t *)(x_b))[1] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] << 16) & 0xFFFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_B2V_4(x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[3] | ((uint8_t *)(x_b))[2] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] << 16 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] << 24) & 0xFFFFFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_B2V_8(x_b) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[7] | ((uint8_t *)(x_b))[6] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[5] << 16 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[4] << 24 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[3] << 32 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[2] << 40 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[1] << 48 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] << 56) & 0xFFFFFFFFFFFFFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Get FC frame header's element
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_R_CTL(x_frm) (FCOE_B2V_1((x_frm)->frm_hdr->hdr_r_ctl))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_D_ID(x_frm) (FCOE_B2V_3((x_frm)->frm_hdr->hdr_d_id))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_S_ID(x_frm) (FCOE_B2V_3((x_frm)->frm_hdr->hdr_s_id))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_TYPE(x_frm) (FCOE_B2V_1((x_frm)->frm_hdr->hdr_type))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_F_CTL(x_frm) (FCOE_B2V_3((x_frm)->frm_hdr->hdr_f_ctl))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_SEQ_ID(x_frm) (FCOE_B2V_1((x_frm)->frm_hdr->hdr_seq_id))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_DF_CTL(x_frm) (FCOE_B2V_1((x_frm)->frm_hdr->hdr_df_ctl))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_SEQ_CNT(x_frm) (FCOE_B2V_2((x_frm)->frm_hdr->hdr_seq_cnt))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_OXID(x_frm) (FCOE_B2V_2((x_frm)->frm_hdr->hdr_oxid))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_RXID(x_frm) (FCOE_B2V_2((x_frm)->frm_hdr->hdr_rxid))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_PARAM(x_frm) (FCOE_B2V_4((x_frm)->frm_hdr->hdr_param))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Set FC frame header's element
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_R_CTL(x_v, x_frm) FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_r_ctl)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_D_ID(x_v, x_frm) FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_d_id)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_S_ID(x_v, x_frm) FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_s_id)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_TYPE(x_v, x_frm) FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_type)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_F_CTL(x_v, x_frm) FCOE_V2B_3((x_v), (x_frm)->frm_hdr->hdr_f_ctl)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_SEQ_ID(x_v, x_frm) FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_seq_id)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_DF_CTL(x_v, x_frm) FCOE_V2B_1((x_v), (x_frm)->frm_hdr->hdr_df_ctl)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_SEQ_CNT(x_v, x_frm) FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_seq_cnt)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_OXID(x_v, x_frm) FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_oxid)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_RXID(x_v, x_frm) FCOE_V2B_2((x_v), (x_frm)->frm_hdr->hdr_rxid)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FFM_PARAM(x_v, x_frm) FCOE_V2B_4((x_v), (x_frm)->frm_hdr->hdr_param)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * frame header checking
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FRM_IS_LAST_FRAME(x_frm) (FRM_F_CTL(x_frm) & (1 << 19))
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FRM_SENDER_IS_XCH_RESPONDER(x_frm) (FRM_F_CTL(x_frm) & (1 << 23))
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOET/FCOEI will only call this fcoe function explicitly, all others
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * should be called through vectors in struct fcoe_port.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE client call this to register one port to FCOE, FCOE need initialize
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and return the corresponding fcoe_port.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern fcoe_port_t *fcoe_register_client(fcoe_client_t *client);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define EPORT_CLT_TYPE(eport) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (((eport)->eport_flags & EPORT_FLAG_INI_MODE) ? \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_CLIENT_INITIATOR : FCOE_CLIENT_TARGET)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_SET_DEFAULT_OUI(x_oui) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (x_oui)[0] = 0x0e; (x_oui)[1] = 0xfc; (x_oui)[2] = 0x00;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_SET_DEFAULT_FPORT_ADDR(x_addr) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang FCOE_SET_DEFAULT_OUI(x_addr) \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (x_addr)[3] = 0xff; (x_addr)[4] = 0xff; (x_addr)[5] = 0xfe;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FC payload size
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_DEFAULT_FCP_DATA_PAYLOAD_SIZE 2048
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_MIN_FCP_DATA_PAYLOAD_SIZE 1024
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_fcp_cmnd {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_lun[8];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_ref_num[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * least 3 bits
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_attribute[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Magnagement flags
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_management_flags[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * additional cdb len and read/write flag
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_addlen_rdwr[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_cdb[16];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffc_fcp_dl[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_fcp_cmnd_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_fcp_rsp {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_rsvd[8];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * see SAM-4
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_retry_delay_timer[2];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_flags[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_scsi_status[1];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_resid[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_sns_len[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t ffr_rsp_len[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang /*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Followed by sense data when available
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_fcp_rsp_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef struct fcoe_fcp_xfer_rdy {
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t fxr_data_ro[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t fxr_burst_len[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang uint8_t fxr_rsvd[4];
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang} fcoe_fcp_xfer_rdy_t;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang/*
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE project global functions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#if !defined(__FUNCTION__)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define __FUNCTION__ ((caddr_t)__func__)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#endif
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FCOE_STR_LEN 32
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * timestamp (golbal variable in sys/systm.h)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni#define CURRENT_CLOCK (ddi_get_lbolt())
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_SEC2TICK(x_sec) (drv_usectohz((x_sec) * 1000000))
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang/*
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Form/convert mod_hash_key from/to xch ID
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FMHK(x_xid) (mod_hash_key_t)(uintptr_t)(x_xid)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define CMHK(x_key) (uint16_t)(uintptr_t)(x_key)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangtypedef void (*TQ_FUNC_P)(void *);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern void fcoe_trace(caddr_t ident, const char *fmt, ...);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#ifdef __cplusplus
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang}
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif /* _FCOE_COMMON_H_ */