2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * See the License for the specific language governing permissions
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * and limitations under the License.
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 * CDDL HEADER END
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Use is subject to license terms.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Interface return value
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE port speed
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FC Frame header size: 24 bytes
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCFH_SIZE (sizeof (fcoe_fc_frame_header_t))
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 * Solicited frame: allocted by FCOET/FOCEI, free-ed by FCOE
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Unsolicited frame: allocated by FCOE, free-ed by FCOET/FCOEI
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm_hdr will be cleared by fcoe explicitly
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoe client need clear FC payload explicitly,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * except for RD/WR data frames
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang fcoe_frame_t *(*eport_alloc_frame)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_release_frame)(fcoe_frame_t *frame);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void *(*eport_alloc_netb)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang void (*eport_deregister_client)(struct fcoe_port *eport);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang int (*eport_set_mac_address)(struct fcoe_port *eport,
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE only supports two kinds of topology: direct P2P, fabric P2P.
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_CMD_PORT_ONLINE (FCOE_PORT_CTL_CMDS | 0x01)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_CMD_PORT_OFFLINE (FCOE_PORT_CTL_CMDS | 0x02)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCoE version control
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 * Define common-used conversion or calculation macros
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[1] | ((uint8_t *)(x_b))[0] << 8) & 0xFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[2] | ((uint8_t *)(x_b))[1] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[3] | ((uint8_t *)(x_b))[2] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((((uint8_t *)(x_b))[7] | ((uint8_t *)(x_b))[6] << 8 | \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang ((uint8_t *)(x_b))[0] << 56) & 0xFFFFFFFFFFFFFFFF)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Get FC frame header's element
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 * Set FC frame header's element
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 * frame header checking
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 * 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 Wangextern fcoe_port_t *fcoe_register_client(fcoe_client_t *client);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (((eport)->eport_flags & EPORT_FLAG_INI_MODE) ? \
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (x_oui)[0] = 0x0e; (x_oui)[1] = 0xfc; (x_oui)[2] = 0x00;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang (x_addr)[3] = 0xff; (x_addr)[4] = 0xff; (x_addr)[5] = 0xfe;
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FC payload size
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * least 3 bits
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Magnagement flags
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * additional cdb len and read/write flag
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * Followed by sense data when available
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang * FCOE project global functions
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * timestamp (golbal variable in sys/systm.h)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#define FCOE_SEC2TICK(x_sec) (drv_usectohz((x_sec) * 1000000))
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Form/convert mod_hash_key from/to xch ID
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang#define FMHK(x_xid) (mod_hash_key_t)(uintptr_t)(x_xid)
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wangextern void fcoe_trace(caddr_t ident, const char *fmt, ...);
2a8164df8a5f42c8a00f10c67d7bc84f80ae9c41Zhong Wang#endif /* _FCOE_COMMON_H_ */