2026-01-21 18:59:54 +08:00

1699 lines
34 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Huawei Hifc PCI Express Linux driver
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*
*/
#ifndef __HIFCOE_WQE_H__
#define __HIFCOE_WQE_H__
/*
* TASK TYPE: in order to compatible wiht EDA, please add new type before BUTT.
*/
enum hifcoe_task_type_e {
HIFCOE_TASK_T_EMPTY = 0,/* SCQE TYPE: means task type not initialize */
HIFCOE_TASK_T_IWRITE = 1, /* SQE TYPE: ini send FCP Write Command */
HIFCOE_TASK_T_IREAD = 2,/* SQE TYPE: ini send FCP Read Command */
/* SCQE TYPE: ini recv fcp rsp for IREAD/IWRITE/ITMF*/
HIFCOE_TASK_T_IRESP = 3,
HIFCOE_TASK_T_TCMND = 4,/* NA */
HIFCOE_TASK_T_TREAD = 5,/* SQE TYPE: tgt send FCP Read Command */
/* SQE TYPE: tgt send FCP Write Command (XFER_RDY) */
HIFCOE_TASK_T_TWRITE = 6,
HIFCOE_TASK_T_TRESP = 7,/* SQE TYPE: tgt send fcp rsp of Read/Write*/
HIFCOE_TASK_T_TSTS = 8, /* SCQE TYPE: tgt sts for TREAD/TWRITE/TRESP*/
HIFCOE_TASK_T_ABTS = 9, /* SQE TYPE: ini send abts request Command */
HIFCOE_TASK_T_IELS = 10,/* NA */
HIFCOE_TASK_T_ITMF = 11,/* SQE TYPE: ini send tmf request Command */
HIFCOE_TASK_T_CLEAN_UP = 12,/* NA */
HIFCOE_TASK_T_CLEAN_UP_ALL = 13,/* NA */
HIFCOE_TASK_T_UNSOLICITED = 14, /* NA */
HIFCOE_TASK_T_ERR_WARN = 15,/* NA */
HIFCOE_TASK_T_SESS_EN = 16, /* CMDQ TYPE: enable session */
HIFCOE_TASK_T_SESS_DIS = 17,/* NA */
HIFCOE_TASK_T_SESS_DEL = 18,/* NA */
HIFCOE_TASK_T_RQE_REPLENISH = 19, /* NA */
HIFCOE_TASK_T_RCV_TCMND = 20, /* SCQE TYPE: tgt recv fcp cmd */
HIFCOE_TASK_T_RCV_ELS_CMD = 21, /* SCQE TYPE: tgt recv els cmd */
HIFCOE_TASK_T_RCV_ABTS_CMD = 22,/* SCQE TYPE: tgt recv abts cmd */
/* SCQE TYPE: tgt recv immidiate data */
HIFCOE_TASK_T_RCV_IMMIDIATE = 23,
/*
* SQE TYPE: send ESL rsp. PLOGI_ACC, PRLI_ACC will carry the parent
* context parameter indication.
*/
HIFCOE_TASK_T_ELS_RSP = 24,
HIFCOE_TASK_T_ELS_RSP_STS = 25, /* SCQE TYPE: ELS rsp sts */
HIFCOE_TASK_T_ABTS_RSP = 26,/* CMDQ TYPE: tgt send abts rsp */
HIFCOE_TASK_T_ABTS_RSP_STS = 27,/* SCQE TYPE: tgt abts rsp sts*/
HIFCOE_TASK_T_ABORT = 28, /* CMDQ TYPE: tgt send Abort Command */
HIFCOE_TASK_T_ABORT_STS = 29, /* SCQE TYPE: Abort sts */
HIFCOE_TASK_T_ELS = 30, /* SQE TYPE: send ELS request Command */
HIFCOE_TASK_T_RCV_ELS_RSP = 31, /* SCQE TYPE: recv ELS response */
HIFCOE_TASK_T_GS = 32, /* SQE TYPE: send GS request Command */
HIFCOE_TASK_T_RCV_GS_RSP = 33, /* SCQE TYPE: recv GS response */
HIFCOE_TASK_T_SESS_EN_STS = 34, /* SCQE TYPE: enable session sts */
HIFCOE_TASK_T_SESS_DIS_STS = 35,/* NA */
HIFCOE_TASK_T_SESS_DEL_STS = 36,/* NA */
HIFCOE_TASK_T_RCV_ABTS_RSP = 37,/* SCQE TYPE: ini recv abts rsp */
HIFCOE_TASK_T_BUFFER_CLEAR = 38,/* CMDQ TYPE: Buffer Clear */
HIFCOE_TASK_T_BUFFER_CLEAR_STS = 39,/* SCQE TYPE: Buffer Clear sts */
HIFCOE_TASK_T_FLUSH_SQ = 40,/* CMDQ TYPE: flush sq */
HIFCOE_TASK_T_FLUSH_SQ_STS = 41,/* SCQE TYPE: flush sq sts */
HIFCOE_TASK_T_SESS_RESET = 42, /* SQE TYPE: Reset session */
HIFCOE_TASK_T_SESS_RESET_STS = 43, /* SCQE TYPE: Reset session sts */
HIFCOE_TASK_T_RQE_REPLENISH_STS = 44, /* NA */
HIFCOE_TASK_T_DUMP_EXCH = 45, /* CMDQ TYPE: dump exch */
HIFCOE_TASK_T_INIT_SRQC = 46, /* CMDQ TYPE: init SRQC */
HIFCOE_TASK_T_CLEAR_SRQ = 47, /* CMDQ TYPE: clear SRQ */
HIFCOE_TASK_T_CLEAR_SRQ_STS = 48, /* SCQE TYPE: clear SRQ sts */
HIFCOE_TASK_T_INIT_SCQC = 49, /* CMDQ TYPE: init SCQC */
HIFCOE_TASK_T_DEL_SCQC = 50,/* CMDQ TYPE: delete SCQC */
HIFCOE_TASK_T_TMF_RESP = 51,/* SQE TYPE: tgt send tmf rsp */
HIFCOE_TASK_T_DEL_SRQC = 52,/* CMDQ TYPE: delete SRQC */
/* SCQE TYPE: tgt recv continue immidiate data */
HIFCOE_TASK_T_RCV_IMMI_CONTINUE = 53,
HIFCOE_TASK_T_ITMF_RESP = 54, /* SCQE TYPE: ini recv tmf rsp */
HIFCOE_TASK_T_ITMF_MARKER_STS = 55,/* SCQE TYPE: tmf marker sts */
HIFCOE_TASK_T_TACK = 56,
HIFCOE_TASK_T_SEND_AEQERR = 57,
HIFCOE_TASK_T_ABTS_MARKER_STS = 58,/* SCQE TYPE: abts marker sts */
HIFCOE_TASK_T_FLR_CLEAR_IO = 59,/* FLR clear io type*/
HIFCOE_TASK_T_BUTT
};
/*
* error code for error report
*/
enum hifcoe_err_code_e {
FCOE_CQE_COMPLETED = 0, /* Successful */
FCOE_SESS_HT_INSERT_FAIL = 1,/* Offload fail: hash insert fail */
FCOE_SESS_HT_INSERT_DUPLICATE = 2, /* Offload fail: duplicate offload */
FCOE_SESS_HT_BIT_SET_FAIL = 3, /* Offload fail: bloom filter set fail */
/* Offload fail: hash delete fail(duplicate delete) */
FCOE_SESS_HT_DELETE_FAIL = 4,
FCOE_CQE_BUFFER_CLEAR_IO_COMPLETED = 5, /* IO done in buffer clear */
/* IO done in session rst mode=1 */
FCOE_CQE_SESSION_ONLY_CLEAR_IO_COMPLETED = 6,
/* IO done in session rst mode=3 */
FCOE_CQE_SESSION_RST_CLEAR_IO_COMPLETED = 7,
FCOE_CQE_TMF_RSP_IO_COMPLETED = 8, /* IO done in tgt tmf rsp */
FCOE_CQE_TMF_IO_COMPLETED = 9, /* IO done in ini tmf */
FCOE_CQE_DRV_ABORT_IO_COMPLETED = 10,/* IO done in tgt abort */
/* IO done in fcp rsp process. Used for the sceanrio:
* 1.abort before cmd
* 2.send fcp rsp directly after recv cmd
*/
FCOE_CQE_DRV_ABORT_IO_IN_RSP_COMPLETED = 11,
/* IO done in fcp cmd process. Used for the sceanrio:
* 1.abort before cmd
* 2.child setup fail
*/
FCOE_CQE_DRV_ABORT_IO_IN_CMD_COMPLETED = 12,
FCOE_CQE_WQE_FLUSH_IO_COMPLETED = 13,/* IO done in FLUSH SQ */
/* fcp data format check: DIFX check error */
FCOE_ERROR_CODE_DATA_DIFX_FAILED = 14,
/* fcp data format check: task_type is not read */
FCOE_ERROR_CODE_DATA_TASK_TYPE_INCORRECT = 15,
/* fcp data format check: data offset is not continuous */
FCOE_ERROR_CODE_DATA_OOO_RO = 16,
/* fcp data format check: data is over run */
FCOE_ERROR_CODE_DATA_EXCEEDS_DATA2TRNS = 17,
/* fcp rsp format check: payload is too short */
FCOE_ERROR_CODE_FCP_RSP_INVALID_LENGTH_FIELD = 18,
/* fcp rsp format check: fcp_conf need, but exch don't hold seq
* initiative
*/
FCOE_ERROR_CODE_FCP_RSP_CONF_REQ_NOT_SUPPORTED_YET = 19,
/* fcp rsp format check: fcp_conf is required, but it's the last seq */
FCOE_ERROR_CODE_FCP_RSP_OPENED_SEQ = 20,
/* xfer rdy format check: payload is too short */
FCOE_ERROR_CODE_XFER_INVALID_PAYLOAD_SIZE = 21,
/* xfer rdy format check: last data out havn't finished */
FCOE_ERROR_CODE_XFER_PEND_XFER_SET = 22,
/* xfer rdy format check: data offset is not continuous */
FCOE_ERROR_CODE_XFER_OOO_RO = 23,
/* xfer rdy format check: burst len is 0 */
FCOE_ERROR_CODE_XFER_NULL_BURST_LEN = 24,
FCOE_ERROR_CODE_REC_TIMER_EXPIRE = 25, /* Timer expire: REC_TIMER */
FCOE_ERROR_CODE_E_D_TIMER_EXPIRE = 26, /* Timer expire: E_D_TIMER */
FCOE_ERROR_CODE_ABORT_TIMER_EXPIRE = 27,/* Timer expire: Abort timer */
/* Abort IO magic number mismatch */
FCOE_ERROR_CODE_ABORT_MAGIC_NUM_NOT_MATCH = 28,
/* RX immidiate data cmd pkt child setup fail */
FCOE_IMMI_CMDPKT_SETUP_FAIL = 29,
/* RX fcp data sequence id not equal */
FCOE_ERROR_CODE_DATA_SEQ_ID_NOT_EQUAL = 30,
FCOE_ELS_GS_RSP_EXCH_CHECK_FAIL = 31,/* ELS/GS exch info check fail */
FCOE_CQE_ELS_GS_SRQE_GET_FAIL = 32, /* ELS/GS process get SRQE fail */
FCOE_CQE_DATA_DMA_REQ_FAIL = 33, /* SMF soli-childdma rsp error */
FCOE_CQE_SESSION_CLOSED = 34,/* Session is closed */
FCOE_SCQ_IS_FULL = 35, /* SCQ is full */
FCOE_SRQ_IS_FULL = 36, /* SRQ is full */
FCOE_ERROR_DUCHILDCTX_SETUP_FAIL = 37, /* dpchild ctx setup fail */
FCOE_ERROR_INVALID_TXMFS = 38, /* invalid txmfs */
/* offload fail,lack of SCQE,through AEQ */
FCOE_ERROR_OFFLOAD_LACKOF_SCQE_FAIL = 39,
FCOE_ERROR_INVALID_TASK_ID = 40, /* tx invlaid task id */
FCOE_ERROR_INVALID_PKT_LEN = 41, /* tx els gs pakcet len check */
FCOE_CQE_ELS_GS_REQ_CLR_IO_COMPLETED = 42, /* IO done in els gs tx */
FCOE_CQE_ELS_RSP_CLR_IO_COMPLETED = 43, /* IO done in els rsp tx */
FCOE_ERROR_CODE_RESID_UNDER_ERR = 44 /* FCP RSP RESID ERROR */
};
/* AEQ EVENT TYPE */
enum hifcoe_aeq_evt_type_e {
/*
* SCQ and SRQ not enough, HOST will initiate a operation to associated
* SCQ/SRQ
*/
FC_AEQ_EVENT_QUEUE_ERROR = 48,
/* WQE MSN check error,HOST will reset port */
FC_AEQ_EVENT_WQE_FATAL_ERROR = 49,
/* serious chip error, HOST will reset chip */
FC_AEQ_EVENT_CTX_FATAL_ERROR = 50,
FC_AEQ_EVENT_OFFLOAD_ERROR = 51,
FC_FC_AEQ_EVENT_TYPE_LAST
};
enum hifcoe_aeq_evt_err_code_e {
/* detail type of resource lack */
FC_SCQ_IS_FULL_ERR = 0,
FC_SRQ_IS_FULL_ERR,
/* detail type of FC_AEQ_EVENT_WQE_FATAL_ERROR */
FC_SQE_CHILD_SETUP_WQE_MSN_ERR = 2,
FC_SQE_CHILD_SETUP_WQE_GPA_ERR,
FC_CMDPKT_CHILD_SETUP_INVALID_WQE_ERR_1,
FC_CMDPKT_CHILD_SETUP_INVALID_WQE_ERR_2,
FC_CLEAEQ_WQE_ERR,
FC_WQEFETCH_WQE_MSN_ERR,
FC_WQEFETCH_QUINFO_ERR,
/* detail type of FC_AEQ_EVENT_CTX_FATAL_ERROR */
FC_SCQE_ERR_BIT_ERR = 9,
FC_UPDMA_ADDR_REQ_SRQ_ERR,
FC_SOLICHILDDMA_ADDR_REQ_ERR,
FC_UNSOLICHILDDMA_ADDR_REQ_ERR,
FC_SQE_CHILD_SETUP_QINFO_ERR_1,
FC_SQE_CHILD_SETUP_QINFO_ERR_2,
FC_CMDPKT_CHILD_SETUP_QINFO_ERR_1,
FC_CMDPKT_CHILD_SETUP_QINFO_ERR_2,
FC_CMDPKT_CHILD_SETUP_PMSN_ERR,
FC_CLEAEQ_CTX_ERR,
FC_WQEFETCH_CTX_ERR,
FC_FLUSH_QPC_ERR_LQP,
FC_FLUSH_QPC_ERR_SMF,
FC_PREFETCH_QPC_ERR_1,
FC_PREFETCH_QPC_ERR_2,
FC_PREFETCH_QPC_ERR_3,
FC_PREFETCH_QPC_ERR_4,
FC_PREFETCH_QPC_ERR_5,
FC_PREFETCH_QPC_ERR_6,
FC_PREFETCH_QPC_ERR_7,
FC_PREFETCH_QPC_ERR_8,
FC_PREFETCH_QPC_ERR_9,
FC_PREFETCH_QPC_ERR_10,
FC_PREFETCH_QPC_ERR_11,
FC_PREFETCH_QPC_ERR_DEFAULT,
FC_CHILDHASH_INSERT_SW_ERR,
FC_CHILDHASH_LOOKUP_SW_ERR,
FC_CHILDHASH_DEL_SW_ERR,
FC_FLOWHASH_INSERT_SW_ERR,
FC_FLOWHASH_LOOKUP_SW_ERR,
FC_FLOWHASH_DEL_SW_ERR,
FC_FLUSH_QPC_ERR_USED,
FC_FLUSH_QPC_ERR_OUTER_LOCK,
FC_AEQ_EVT_ERR_CODE_BUTT
};
/* AEQ data structure */
struct hifcoe_aqe_data_s {
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 evt_code: 8;
u32 rsvd: 8;
u32 conn_id : 16; /* conn_id */
#else
u32 conn_id : 16;
u32 rsvd: 8;
u32 evt_code: 8;
#endif
} wd0;
u32 data0;
};
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd: 12;
u32 xid : 20; /* xid */
#else
u32 xid : 20; /* xid */
u32 rsvd: 12;
#endif
} wd1;
u32 data1;
};
};
/* Control Section: Common Header */
struct hifcoe_wqe_ctrl_ch_s {
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 owner : 1;
u32 ctrl_sl : 2;
u32 csl : 2;
u32 dif_sl: 3;
u32 cr: 1;
u32 df: 1;
u32 va: 1;
u32 tsl : 5;
u32 cf: 1;
u32 wf: 1;
u32 rsvd0 : 4;
u32 drv_sl: 2;
u32 bdsl : 8;
#else
u32 bdsl : 8;
u32 drv_sl: 2;
u32 rsvd0 : 4;
u32 wf: 1;
u32 cf: 1;
u32 tsl : 5;
u32 va: 1;
u32 df: 1;
u32 cr: 1;
u32 dif_sl: 3;
u32 csl : 2;
u32 ctrl_sl: 2;
u32 owner : 1;
#endif
} wd0;
u32 ctrl_ch_val;
};
};
/* Control Section: Queue Specific Field */
struct hifcoe_wqe_ctrl_qsf_s {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 dump_wqe_sn : 16;
u32 wqe_sn:16;
#else
u32 wqe_sn:16;
u32 dump_wqe_sn : 16;
#endif
};
/* DIF info definition in WQE */
struct hifcoe_fc_dif_info_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/* difx enable flag:1'b0: disable;1'b1: enable */
u32 difx_en : 1;
/*
* sector size:1'b0: sector size is 512B.1'b1: sector size is
* 4KB.
*/
u32 sct_size : 1;
u32 difx_len : 11;
/*
* The DIFX verify type: 2'b00: Type0, 2'b01: Type 1, 2'b10:
* Type 2, 2'b11: Type 3
*/
u32 dif_verify_type : 2;
/*
* The DIFX insert and replace type: 2'b00: Type0, 2'b01: Type 1
* , 2'b10: Type 2, 2'b11: Type 3
*/
u32 dif_ins_rep_type : 2;
u32 difx_app_esc : 1;
u32 difx_ref_esc : 1;
u32 grd_ctrl : 3;
u32 grd_agm_ctrl : 2;
u32 grd_agm_ini_ctrl : 3;
u32 ref_tag_ctrl : 3;
u32 ref_tag_mode : 2;
#else
u32 ref_tag_mode : 2;
u32 ref_tag_ctrl : 3;
u32 grd_agm_ini_ctrl : 3;
u32 grd_agm_ctrl : 2;
u32 grd_ctrl : 3;
u32 difx_ref_esc : 1;
u32 difx_app_esc : 1;
u32 dif_ins_rep_type : 2;
u32 dif_verify_type : 2;
u32 difx_len : 11;
u32 sct_size : 1;
u32 difx_en : 1;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 app_tag_ctrl : 3;
u32 vpid : 7;
u32 lun_qos_en : 2;
u32 rsvd : 4;
u32 cmp_app_tag_msk : 16;
#else
u32 cmp_app_tag_msk : 16;
u32 rsvd : 4;
u32 lun_qos_en : 2;
u32 vpid : 7;
u32 app_tag_ctrl : 3;
#endif
} wd1;
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 rep_app_tag;
u16 cmp_app_tag;
#else
u16 cmp_app_tag;
u16 rep_app_tag;
#endif
u32 cmp_ref_tag;
u32 rep_ref_tag;
};
/* Task Section: TMF SQE for INI */
struct hifcoe_tmf_info_s {
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 reset_exch_start :16;
u32 reset_exch_end :16;
#else
u32 reset_exch_end :16;
u32 reset_exch_start :16;
#endif
} bs;
u32 value;
} w0;
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :5;
u32 marker_sts :1;
u32 reset_type :2;
u32 reset_did :24;
#else
u32 reset_did :24;
u32 reset_type :2;
u32 marker_sts :1;
u32 rsvd0 :5;
#endif
} bs;
u32 value;
} w1;
union {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :8;
u32 reset_sid :24;
#else
u32 reset_sid :24;
u32 rsvd0 :8;
#endif
} bs;
u32 value;
} w2;
u8 reset_lun[8];
};
/* Task Section: CMND SQE for INI */
struct hifcoe_sqe_icmnd_s {
u8 fcp_cmnd_iu[48];
union {
struct hifcoe_fc_dif_info_s dif_info;
struct hifcoe_tmf_info_s tmf;
} info;
u32 magic_num;
u32 rsp_gpa_hi;
u32 rsp_gpa_lo;
};
/* Task Section: ABTS SQE */
struct hifcoe_sqe_abts_s {
u32 fh_parm_abts;
u32 magic_num;
};
struct hifcoe_keys_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsv : 16;
u32 smac0 : 8;
u32 smac1 : 8;
#else
u32 smac1 : 8;
u32 smac0 : 8;
u32 rsv : 16;
#endif
} wd0;
u8 smac[4];
u8 dmac[6];
u8 sid[3];
u8 did[3];
u32 svlan;
u32 cvlan;
};
/* BDSL: Session Enable WQE */
/* keys field only use 26 bytes room */
struct hifcoe_cmdqe_sess_en_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rx_id : 16;
#else
u32 rx_id : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd1 : 12;
u32 cid : 20;
#else
u32 cid : 20;
u32 rsvd1 : 12;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 scqn :16;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 scqn :16;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd3 :12;
u32 xid_p :20;
#else
u32 xid_p :20;
u32 rsvd3 :12;
#endif
} wd3;
u32 context_gpa_hi;
u32 context_gpa_lo;
struct hifcoe_keys_s keys;
};
/* Control Section */
struct hifcoe_wqe_ctrl_s {
struct hifcoe_wqe_ctrl_ch_s ch;
struct hifcoe_wqe_ctrl_qsf_s qsf;
};
struct hifcoe_sqe_els_rsp_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/*
* ELS RSP packet payload. ELS RSP payload GPA is store in BDSL, ucode
* use child setup to send data(do not include fc_hdr/eth_hdr)
*/
u32 data_len:16;
u32 echo_flag :16;
#else
u32 echo_flag :16;
u32 data_len:16;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/* Para Update:drv indicate Parent Context para need to be
* update or not.
* 00---no update
* 01---send PLOGI_ACC, need to updata Port para
* 10---send PRLI_ACC, need to updata process para
* 11---Reserved
*/
u32 para_update :2;
u32 clr_io :1;
u32 lp_bflag:1; /* use for loopback */
u32 rsvd1 :28;
#else
u32 rsvd1 :28;
u32 lp_bflag:1;
u32 clr_io :1;
u32 para_update :2;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 tx_mfs :16;
u32 rsvd2 :14;
u32 e_d_tov :1;
u32 seq_cnt :1;
#else
u32 seq_cnt :1;
u32 e_d_tov :1;
u32 rsvd2 :14;
u32 tx_mfs :16;
#endif
} wd2;
u32 e_d_tov_timer_val;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 immi_taskid_start:16;
u32 immi_taskid_cnt :13;
u32 xfer_dis:1;
u32 rec :1;
u32 conf:1;
#else
u32 conf:1;
u32 rec :1;
u32 xfer_dis:1;
u32 immi_taskid_cnt :13;
u32 immi_taskid_start:16;
#endif
} wd4;
u32 first_burst_len;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 reset_exch_start :16;
u32 reset_exch_end:16;
#else
u32 reset_exch_end:16;
u32 reset_exch_start :16;
#endif
} wd6;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd:16;
u32 scqn:16;
#else
u32 scqn:16;
u32 rsvd:16;
#endif
} wd7;
u32 magic_num;
u32 magic_local;
u32 magic_remote;
u32 ts_rcv_echo_req;
};
struct hifcoe_sqe_reset_session_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 reset_exch_start :16;
u32 reset_exch_end:16;
#else
u32 reset_exch_end:16;
u32 reset_exch_start :16;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd:6;
/*
* 1: clean io;
* 2: delete session;
* 3: clean io&delete session
*/
u32 mode:2;
u32 reset_did :24;
#else
u32 reset_did :24;
u32 mode:2;
u32 rsvd:6;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd:8;
u32 reset_sid :24;
#else
u32 reset_sid :24;
u32 rsvd:8;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd:16;
u32 scqn:16;
#else
u32 scqn:16;
u32 rsvd:16;
#endif
} wd3;
};
struct hifcoe_sqe_t_els_gs_s {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/*
* ELS/GS req packet payload. ELS/GS payload GPA is store in BDSL,
* ucode use child setup to send data(do not include fc_hdr/eth_hdr)
*/
u16 data_len;
u16 echo_flag; /* echo flag */
#else
u16 echo_flag;
u16 data_len;
#endif
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/* Para Update: drv indicate Parent Context para need to be
* update or not.
* 00---no update
* 01---send PRLI Req, need to updata Port para
* 10---Reserved
* 11---Reserved
*/
u32 para_update :2;
u32 clr_io :1;
u32 lp_bflag:1; /* use for loopback */
u32 rec_support :1;
u32 rec_flag:1;
u32 orign_oxid :16;
u32 rsvd1 :10;
#else
u32 rsvd1 :10;
u32 orign_oxid :16;
u32 rec_flag:1;
u32 rec_support :1;
u32 lp_bflag:1;
u32 clr_io :1;
u32 para_update :2;
#endif
} wd4;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 tx_mfs :16;
u32 rsvd2 :14;
u32 e_d_tov :1;
u32 seq_cnt :1;
#else
u32 seq_cnt :1;
u32 e_d_tov :1;
u32 rsvd2 :14;
u32 tx_mfs :16;
#endif
} wd5;
u32 e_d_tov_timer_val;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 reset_exch_start :16;
u32 reset_exch_end:16;
#else
u32 reset_exch_end:16;
u32 reset_exch_start :16;
#endif
} wd6;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd:16;
u32 scqn:16;
#else
u32 scqn:16;
u32 rsvd:16;
#endif
} wd7;
u32 magic_num;
};
struct hifcoe_sqe_els_gs_elsrsp_comm_s {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 data_len;
u16 rsvd;
#else
u16 rsvd;
u16 data_len;
#endif
};
/* SQE Task Section's Contents except Common Header */
union hifcoe_sqe_ts_cont_u {
struct hifcoe_sqe_icmnd_s icmnd;
struct hifcoe_sqe_abts_s abts;
struct hifcoe_sqe_els_rsp_s els_rsp;
struct hifcoe_sqe_t_els_gs_s t_els_gs;
struct hifcoe_sqe_els_gs_elsrsp_comm_s els_gs_elsrsp_comm;
struct hifcoe_sqe_reset_session_s reset_session;
u32 value[16];
};
struct hifcoe_sqe_ts_s {
/* SQE Task Section's Common Header */
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type :8;
u32 rsvd:5; /* used for loopback saving bdsl's num */
/* cdb_type = 0:CDB_LEN = 16B, cdb_type = 1:CDB_LEN = 32B */
u32 cdb_type:1;
/* standard immidiate data flag, use with local-xid for initiator */
u32 immi_std:1;
/*
* CRC err inject flag: drv set, and ucode use for send first packet of
* WQE
*/
u32 crc_inj :1;
u32 local_xid :16; /* local exch_id */
#else
u32 local_xid :16;
u32 crc_inj :1;
u32 immi_std:1;
/* cdb_type = 0:CDB_LEN = 16B, cdb_type = 1:CDB_LEN = 32B */
u32 cdb_type:1;
u32 rsvd:5; /* used for loopback saving bdsl's num */
u32 task_type :8;
#endif
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 remote_xid; /* remote exch_id */
u16 conn_id;
#else
u16 conn_id;
u16 remote_xid;
#endif
} wd0;
union hifcoe_sqe_ts_cont_u cont;
};
struct hifcoe_constant_sge_s {
u32 buf_addr_hi;
u32 buf_addr_lo;
};
struct hifcoe_variable_sge_s {
u32 buf_addr_hi;
u32 buf_addr_lo;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 r_flag :1;
u32 buf_len :31;
#else
u32 buf_len :31;
u32 r_flag :1;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 last_flag :1;
u32 extension_flag :1;
u32 xid : 14;
u32 buf_addr_gpa: 16;
#else
u32 buf_addr_gpa: 16;
u32 xid : 14;
u32 extension_flag :1;
u32 last_flag :1;
#endif
} wd1;
};
/* SQE, should not be over 128B */
struct hifcoe_sqe_s {
struct hifcoe_wqe_ctrl_s ctrl_sl;
struct hifcoe_sqe_ts_s ts_sl;
struct hifcoe_variable_sge_s sge[2];
};
struct hifcoe_rqe_ctrl_s {
struct hifcoe_wqe_ctrl_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 dump_wqe_msn;
u16 wqe_msn;
#else
u16 wqe_msn;
u16 dump_wqe_msn;
#endif
} wd0;
};
struct hifcoe_rqe_drv_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/*
* User ID[15:0], 15 bits valid and User ID[15] is fix to 0
*/
u32 user_id :16;
u32 rsvd0 :16;
#else
u32 rsvd0 :16;
u32 user_id :16;
#endif
} wd0;
u32 rsvd1;
};
/* RQE,should not be over 32B */
struct hifcoe_rqe_s {
struct hifcoe_rqe_ctrl_s ctrl_sl;
u32 cqe_gpa_h;
u32 cqe_gpa_l;
struct hifcoe_constant_sge_s bds_sl;
struct hifcoe_rqe_drv_s drv_sl;
};
struct hifcoe_cmdqe_abts_rsp_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rx_id : 16;
#else
u32 rx_id : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsp_type:1; /* 0:BA_ACC, 1:BA_RJT */
u32 payload_len :7;
u32 port_id :4;
u32 rsvd1 :4;
u32 ox_id :16;
#else
u32 ox_id :16;
u32 rsvd1 :4;
u32 port_id :4;
u32 payload_len :7;
u32 rsp_type:1;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 scqn: 16;
u32 conn_id : 16;
#else
u32 conn_id : 16;
u32 scqn: 16;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd: 12;
u32 xid : 20;
#else
u32 xid : 20;
u32 rsvd: 12;
#endif
} wd3;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd: 12;
u32 cid : 20;
#else
u32 cid : 20;
u32 rsvd: 12;
#endif
} wd4;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd: 16;
u32 req_rx_id : 16;
#else
u32 req_rx_id : 16;
u32 rsvd: 16;
#endif
} wd5;
/* payload length is according to rsp_type:1DWORD or 3DWORD */
u32 payload[3];
};
struct hifcoe_cmdqe_buffer_clear_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 wqe_type:8;
u32 rsvd0 :8;
u32 rsvd1 :16;
#else
u32 rsvd1 :16;
u32 rsvd0 :8;
u32 wqe_type:8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rx_id_start :16;
u32 rx_id_end :16;
#else
u32 rx_id_end :16;
u32 rx_id_start :16;
#endif
} wd1;
u32 scqn;
u32 wd3;
};
struct hifcoe_cmdqe_flush_sq_info_s {
u32 cid;
u32 xid;
};
struct hifcoe_cmdqe_flush_sq_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 wqe_type :8;
u32 sq_qid :8;
u32 entry_count :16;
#else
u32 entry_count :16;
u32 sq_qid :8;
u32 wqe_type :8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 last_wqe:1;
u32 pos :11;
u32 port_id:4;
u32 scqn:16;
#else
u32 scqn:16;
u32 port_id :4;
u32 pos :11;
u32 last_wqe:1;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 pkt_ptr :16;
u32 rsvd:16;
#else
u32 rsvd:16;
u32 pkt_ptr :16;
#endif
} wd2;
struct hifcoe_cmdqe_flush_sq_info_s sq_info_entry[0];
};
struct hifcoe_cmdqe_creat_srqc_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rsvd1 : 16;
#else
u32 rsvd1 : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
u32 srqc_gpa_h;
u32 srqc_gpa_l;
u32 srqc[16];/* srqc_size=64B */
};
struct hifcoe_cmdqe_delete_srqc_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rsvd1 : 16;
#else
u32 rsvd1 : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
u32 srqc_gpa_h;
u32 srqc_gpa_l;
};
struct hifcoe_cmdqe_clr_srq_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rsvd1 : 16;
#else
u32 rsvd1 : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
/*
* 0: SRQ for recv ELS;
* 1: SRQ for recv immidiate data
*/
u32 srq_type: 16;
u32 scqn: 16;
#else
u32 scqn: 16;
u32 srq_type: 16;
#endif
} wd1;
u32 srqc_gpa_h;
u32 srqc_gpa_l;
};
struct hifcoe_cmdqe_creat_scqc_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rsvd1 : 16;
#else
u32 rsvd1 : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd2 : 16;
u32 scqn: 16;
#else
u32 scqn: 16;
u32 rsvd2 : 16;
#endif
} wd1;
u32 scqc[16];/* scqc_size=64B */
};
struct hifcoe_cmdqe_delete_scqc_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rsvd1 : 16;
#else
u32 rsvd1 : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd2 : 16;
u32 scqn: 16;
#else
u32 scqn: 16;
u32 rsvd2 : 16;
#endif
} wd1;
};
struct hifcoe_sqe_t_rsp_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 fill:2; /* 2bit of F_CTL[1:0] */
u32 conf:1; /* Wait INI confirm, 0: disable, 1:enable */
/*
* 0: payload area store payload,
* 1: payload area store payload GPA
*/
u32 mode:1;
u32 immi:1;
u32 rsvd0 :3;
u32 fcp_rsp_len :8; /* FCP_RESP payload(24~96B)*/
u32 rsvd1 :16;
#else
u32 rsvd1 :16;
u32 fcp_rsp_len :8;
u32 rsvd0 :3;
u32 immi:1;
u32 mode:1;
u32 conf:1;
u32 fill:2;
#endif
} wd0;
u32 magic_num;
u32 hotpooltag;
union {
struct {
u32 addr_h;
u32 addr_l;
} gpa;
struct {
u32 data[25]; /* FCP_RESP payload buf, 100B rsvd */
} buf;
} payload;
};
struct hifcoe_sqe_tresp_ts_s {
/* SQE Task Section's Common Header */
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u8 task_type;
u8 rsvd0;
u16 local_xid;
#else
u16 local_xid;
u8 rsvd0;
u8 task_type;
#endif
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 remote_xid;
u16 conn_id;
#else
u16 conn_id;
u16 remote_xid;
#endif
} wd0;
struct hifcoe_sqe_t_rsp_s t_rsp;
};
/* SQE for fcp response, max TSL is 120B*/
struct hifcoe_sqe_tresp_s {
struct hifcoe_wqe_ctrl_s ctrl_sl;
struct hifcoe_sqe_tresp_ts_s ts_sl;
};
/* SCQE Common Header */
struct hifcoe_scqe_ch_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 owner : 1;
u32 err_code: 7;
u32 cqe_remain_cnt : 3;
u32 rsvd0 : 13;
u32 task_type : 8;
#else
u32 task_type : 8;
u32 rsvd0 : 13;
u32 cqe_remain_cnt : 3;
u32 err_code: 7;
u32 owner : 1;
#endif
} wd0;
};
struct hifcoe_scqe_type_s {
struct hifcoe_scqe_ch_s ch;
u32 rsvd0;
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u16 rsvd4;
u16 conn_id;
#else
u16 conn_id;
u16 rsvd4;
#endif
u32 rsvd1[12];
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd2 :31;
u32 done:1;
#else
u32 done:1;
u32 rsvd3 :31;
#endif
} wd0;
};
struct hifcoe_scqe_sess_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd1 :12;
u32 xid_qpn :20;
#else
u32 xid_qpn :20;
u32 rsvd1 :12;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd3 :16;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 rsvd3 :16;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd2 :12;
u32 cid :20;
#else
u32 cid :20;
u32 rsvd2 :12;
#endif
} wd2;
u64 bloomfilter_id; /* valid only in session offload */
};
struct hifcoe_scqe_comm_rsp_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :16;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 rsvd0 :16;
#endif
} wd1;
u32 magic_num;
};
struct hifcoe_scqe_iresp_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 dif_info:5;
u32 rsvd0 :11;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 rsvd0 :11;
u32 dif_info:5;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :16;
u32 fcp_flag:8;
u32 scsi_status :8;
#else
u32 scsi_status :8;
u32 fcp_flag:8;
u32 rsvd0 :16;
#endif
} wd2;
u32 fcp_resid;
u32 fcp_sns_len;
u32 fcp_rsp_len;
u32 magic_num;
};
struct hifcoe_scqe_rcv_abts_rsp_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :16;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 rsvd0 :16;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0:24;
u32 fh_rctrl :8;
#else
u32 fh_rctrl :8;
u32 rsvd0:24;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd1 :8;
u32 did :24;
#else
u32 did :24;
u32 rsvd1 :8;
#endif
} wd3;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd2 :8;
u32 sid :24;
#else
u32 sid :24;
u32 rsvd2 :8;
#endif
} wd4;
/* payload length is according to fh_rctrl:1DWORD or 3DWORD */
u32 payload[3];
u32 magic_num;
};
struct hifcoe_scqe_rcv_els_cmd_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd0 :8;
u32 did :24;
#else
u32 did :24;
u32 rsvd0 :8;
#endif
} wd0;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd1 :8;
u32 sid :24;
#else
u32 sid :24;
u32 rsvd1 :8;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd2;
struct{
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 data_len :16;/* ELS cmd Payload length */
u32 user_id_num :16;/* current used user_id num */
#else
u32 user_id_num :16;
u32 data_len :16;
#endif
} wd3;
u32 user_id[9]; /* User ID of SRQ SGE, used for drvier buffer release */
u32 ts;
};
struct hifcoe_scqe_rcv_els_gs_rsp_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 data_len:16;
u32 conn_id :16;
#else
u32 conn_id :16;
u32 data_len:16; /* ELS/GS RSP Payload length */
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 end_rsp :1;
u32 echo_rsp:1;
u32 rsvd:6;
u32 did :24;
#else
u32 did :24;
u32 rsvd:6;
u32 echo_rsp:1;
u32 end_rsp :1;
#endif
} wd3;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 user_id_num :8;
u32 sid :24;
#else
u32 sid :24;
u32 user_id_num :8;
#endif
} wd4;
u32 magic_num;
u32 user_id[9];
};
struct hifcoe_scqe_rcv_flush_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 last_flush : 8;
u32 port_id: 8;
u32 rsvd0 : 16;
#else
u32 rsvd0 : 16;
u32 port_id: 8;
u32 last_flush : 8;
#endif
} wd0;
};
struct hifcoe_scqe_rcv_clear_buf_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 port_id: 8;
u32 rsvd0 : 24;
#else
u32 rsvd0 : 24;
u32 port_id: 8;
#endif
} wd0;
};
struct hifcoe_scqe_itmf_marker_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 end_rsp :8;
u32 did :24;
#else
u32 did :24;
u32 end_rsp :8;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 rsvd1:8;
u32 sid :24;
#else
u32 sid :24;
u32 rsvd1:8;
#endif
} wd3;
};
struct hifcoe_scqe_abts_marker_sts_s {
struct hifcoe_scqe_ch_s ch;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 ox_id :16;
u32 rx_id :16;
#else
u32 rx_id :16;
u32 ox_id :16;
#endif
} wd1;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 end_rsp :8;
u32 did :24;
#else
u32 did :24;
u32 end_rsp :8;
#endif
} wd2;
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 io_state :8;
u32 sid :24;
#else
u32 sid :24;
u32 io_state :8;
#endif
} wd3;
};
/* SCQE, should not be over 64B */
union hifcoe_scqe_u {
struct hifcoe_scqe_type_s common;
/* session enable/disable/delete sts */
struct hifcoe_scqe_sess_sts_s sess_sts;
/* aborts/abts_rsp/els rsp sts */
struct hifcoe_scqe_comm_rsp_sts_s comm_sts;
struct hifcoe_scqe_rcv_clear_buf_sts_s clear_sts;/* clear buffer sts */
struct hifcoe_scqe_rcv_flush_sts_s flush_sts; /* flush sq sts */
struct hifcoe_scqe_iresp_s iresp;
struct hifcoe_scqe_rcv_abts_rsp_s rcv_abts_rsp; /* recv abts rsp*/
struct hifcoe_scqe_rcv_els_cmd_s rcv_els_cmd;/* recv els cmd */
struct hifcoe_scqe_rcv_els_gs_rsp_s rcv_els_gs_rsp;/* recv els/gs rsp */
struct hifcoe_scqe_itmf_marker_sts_s itmf_marker_sts;/* tmf marker */
struct hifcoe_scqe_abts_marker_sts_s abts_marker_sts;/* abts marker */
};
struct hifcoe_cmdqe_type_s {
struct {
#if (__BYTE_ORDER__ == __BIG_ENDIAN__)
u32 task_type : 8;
u32 rsvd0 : 8;
u32 rx_id : 16;
#else
u32 rx_id : 16;
u32 rsvd0 : 8;
u32 task_type : 8;
#endif
} wd0;
};
/* CMDQE, variable length */
union hifc_cmdqe_u {
struct hifcoe_cmdqe_type_s common;
struct hifcoe_cmdqe_sess_en_s session_enable;
struct hifcoe_cmdqe_abts_rsp_s snd_abts_rsp;
struct hifcoe_cmdqe_buffer_clear_s buffer_clear;
struct hifcoe_cmdqe_flush_sq_s flush_sq;
struct hifcoe_cmdqe_creat_srqc_s create_srqc;
struct hifcoe_cmdqe_delete_srqc_s delete_srqc;
struct hifcoe_cmdqe_clr_srq_s clear_srq;
struct hifcoe_cmdqe_creat_scqc_s create_scqc;
struct hifcoe_cmdqe_delete_scqc_s delete_scqc;
};
#endif