#ifndef _EMLXS_IOCB_H
#define _EMLXS_IOCB_H
#ifdef __cplusplus
extern "C" {
#endif
#define CMD_RCV_SEQUENCE_CX 0x01
#define CMD_XMIT_SEQUENCE_CR 0x02
#define CMD_XMIT_SEQUENCE_CX 0x03
#define CMD_XMIT_BCAST_CN 0x04
#define CMD_XMIT_BCAST_CX 0x05
#define CMD_QUE_RING_BUF_CN 0x06
#define CMD_QUE_XRI_BUF_CX 0x07
#define CMD_IOCB_CONTINUE_CN 0x08
#define CMD_RET_XRI_BUF_CX 0x09
#define CMD_ELS_REQUEST_CR 0x0A
#define CMD_ELS_REQUEST_CX 0x0B
#define CMD_RCV_ELS_REQ_CX 0x0D
#define CMD_ABORT_XRI_CN 0x0E
#define CMD_ABORT_XRI_CX 0x0F
#define CMD_CLOSE_XRI_CN 0x10
#define CMD_CLOSE_XRI_CX 0x11
#define CMD_CREATE_XRI_CR 0x12
#define CMD_CREATE_XRI_CX 0x13
#define CMD_GET_RPI_CN 0x14
#define CMD_XMIT_ELS_RSP_CX 0x15
#define CMD_GET_RPI_CR 0x16
#define CMD_XRI_ABORTED_CX 0x17
#define CMD_FCP_IWRITE_CR 0x18
#define CMD_FCP_IWRITE_CX 0x19
#define CMD_FCP_IREAD_CR 0x1A
#define CMD_FCP_IREAD_CX 0x1B
#define CMD_FCP_ICMND_CR 0x1C
#define CMD_FCP_ICMND_CX 0x1D
#define CMD_FCP_TSEND_CX 0x1F
#define CMD_ADAPTER_MSG 0x20
#define CMD_FCP_TRECEIVE_CX 0x21
#define CMD_ADAPTER_DUMP 0x22
#define CMD_FCP_TRSP_CX 0x23
#define CMD_FCP_AUTO_TRSP_CX 0x29
#define CMD_BPL_IWRITE_CR 0x48
#define CMD_BPL_IWRITE_CX 0x49
#define CMD_BPL_IREAD_CR 0x4A
#define CMD_BPL_IREAD_CX 0x4B
#define CMD_BPL_ICMND_CR 0x4C
#define CMD_BPL_ICMND_CX 0x4D
#define CMD_ASYNC_STATUS 0x7C
#define CMD_RCV_SEQUENCE64_CX 0x81
#define CMD_XMIT_SEQUENCE64_CR 0x82
#define CMD_XMIT_SEQUENCE64_CX 0x83
#define CMD_XMIT_BCAST64_CN 0x84
#define CMD_XMIT_BCAST64_CX 0x85
#define CMD_QUE_RING_BUF64_CN 0x86
#define CMD_QUE_XRI_BUF64_CX 0x87
#define CMD_IOCB_CONTINUE64_CN 0x88
#define CMD_RET_XRI_BUF64_CX 0x89
#define CMD_ELS_REQUEST64_CR 0x8A
#define CMD_ELS_REQUEST64_CX 0x8B
#define CMD_RCV_ELS_REQ64_CX 0x8D
#define CMD_XMIT_ELS_RSP64_CX 0x95
#define CMD_XMIT_BLS_RSP64_CX 0x97
#define CMD_FCP_IWRITE64_CR 0x98
#define CMD_FCP_IWRITE64_CX 0x99
#define CMD_FCP_IREAD64_CR 0x9A
#define CMD_FCP_IREAD64_CX 0x9B
#define CMD_FCP_ICMND64_CR 0x9C
#define CMD_FCP_ICMND64_CX 0x9D
#define CMD_FCP_TSEND64_CX 0x9F
#define CMD_FCP_TRECEIVE64_CX 0xA1
#define CMD_FCP_TRSP64_CX 0xA3
#define CMD_RCV_SEQ64_CX 0xB5
#define CMD_RCV_ELS64_CX 0xB7
#define CMD_RCV_CONT64_CX 0xBB
#define CMD_RCV_SEQ_LIST64_CX 0xC1
#define CMD_GEN_REQUEST64_CR 0xC2
#define CMD_GEN_REQUEST64_CX 0xC3
#define CMD_QUE_RING_LIST64_CN 0xC6
typedef struct
{
#ifdef EMLXS_BIG_ENDIAN
uint8_t statAction;
uint8_t statRsn;
uint8_t statBaExp;
uint8_t statLocalError;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint8_t statLocalError;
uint8_t statBaExp;
uint8_t statRsn;
uint8_t statAction;
#endif
#define FBSY_RSN_MASK 0xF0
#define FBSY_FABRIC_BSY 0x10
#define FBSY_NPORT_BSY 0x30
#define PBSY_ACTION1 0x01
#define PBSY_ACTION2 0x02
#define RJT_RETRYABLE 0x01
#define RJT_NO_RETRY 0x02
#define PBSY_NPORT_BSY 0x01
#define PBSY_RESRCE_BSY 0x03
#define PBSY_VU_BSY 0xFF
#define RJT_BAD_D_ID 0x01
#define RJT_BAD_S_ID 0x02
#define RJT_UNAVAIL_TEMP 0x03
#define RJT_UNAVAIL_PERM 0x04
#define RJT_UNSUP_CLASS 0x05
#define RJT_DELIM_ERR 0x06
#define RJT_UNSUP_TYPE 0x07
#define RJT_BAD_CONTROL 0x08
#define RJT_BAD_RCTL 0x09
#define RJT_BAD_FCTL 0x0A
#define RJT_BAD_OXID 0x0B
#define RJT_BAD_RXID 0x0C
#define RJT_BAD_SEQID 0x0D
#define RJT_BAD_DFCTL 0x0E
#define RJT_BAD_SEQCNT 0x0F
#define RJT_BAD_PARM 0x10
#define RJT_XCHG_ERR 0x11
#define RJT_PROT_ERR 0x12
#define RJT_BAD_LENGTH 0x13
#define RJT_UNEXPECTED_ACK 0x14
#define RJT_LOGIN_REQUIRED 0x16
#define RJT_TOO_MANY_SEQ 0x17
#define RJT_XCHG_NOT_STRT 0x18
#define RJT_UNSUP_SEC_HDR 0x19
#define RJT_UNAVAIL_PATH 0x1A
#define RJT_VENDOR_UNIQUE 0xFF
#define BARJT_BAD_CMD_CODE 0x01
#define BARJT_LOGICAL_ERR 0x03
#define BARJT_LOGICAL_BSY 0x05
#define BARJT_PROTOCOL_ERR 0x07
#define BARJT_VU_ERR 0xFF
#define BARJT_EXP_INVALID_ID 0x01
#define BARJT_EXP_ABORT_SEQ 0x05
#define IOERR_SUCCESS 0x00
#define IOERR_MISSING_CONTINUE 0x01
#define IOERR_SEQUENCE_TIMEOUT 0x02
#define IOERR_INTERNAL_ERROR 0x03
#define IOERR_INVALID_RPI 0x04
#define IOERR_NO_XRI 0x05
#define IOERR_ILLEGAL_COMMAND 0x06
#define IOERR_XCHG_DROPPED 0x07
#define IOERR_ILLEGAL_FIELD 0x08
#define IOERR_RCV_BUFFER_WAITING 0x0B
#define IOERR_TX_DMA_FAILED 0x0D
#define IOERR_RX_DMA_FAILED 0x0E
#define IOERR_ILLEGAL_FRAME 0x0F
#define IOERR_NO_RESOURCES 0x11
#define IOERR_ILLEGAL_LENGTH 0x13
#define IOERR_UNSUPPORTED_FEATURE 0x14
#define IOERR_ABORT_IN_PROGRESS 0x15
#define IOERR_ABORT_REQUESTED 0x16
#define IOERR_RCV_BUFFER_TIMEOUT 0x17
#define IOERR_LOOP_OPEN_FAILURE 0x18
#define IOERR_RING_RESET 0x19
#define IOERR_LINK_DOWN 0x1A
#define IOERR_CORRUPTED_DATA 0x1B
#define IOERR_CORRUPTED_RPI 0x1C
#define IOERR_OUT_OF_ORDER_DATA 0x1D
#define IOERR_OUT_OF_ORDER_ACK 0x1E
#define IOERR_DUP_FRAME 0x1F
#define IOERR_LINK_CONTROL_FRAME 0x20
#define IOERR_BAD_HOST_ADDRESS 0x21
#define IOERR_RCV_HDRBUF_WAITING 0x22
#define IOERR_MISSING_HDR_BUFFER 0x23
#define IOERR_MSEQ_CHAIN_CORRUPTED 0x24
#define IOERR_ABORTMULT_REQUESTED 0x25
#define IOERR_BUFFER_SHORTAGE 0x28
#define IOERR_XRIBUF_WAITING 0x29
#define IOERR_MISSING_HBQ_ENTRY 0x2B
#define IOERR_ABORT_EXT_REQ 0x2C
#define IOERR_CLOSE_EXT_REQ 0x2D
#define IOERR_INVALID_VPI 0x2E
#define IOERR_XRIBUF_MISSING 0x30
#define IOERR_ASSI_RSP_SUPPRESSED 0x31
#define IOERR_ROFFSET_INVAL 0x40
#define IOERR_ROFFSET_MISSING 0x41
#define IOERR_INSUF_BUFFER 0x42
#define IOERR_MISSING_SI 0x43
#define IOERR_MISSING_ES 0x44
#define IOERR_INCOMP_XFER 0x45
#define IOERR_ABORT_TIMEOUT 0xF0
} PARM_ERR;
typedef union
{
struct
{
#ifdef EMLXS_BIG_ENDIAN
uint8_t Rctl;
uint8_t Type;
uint8_t Dfctl;
uint8_t Fctl;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint8_t Fctl;
uint8_t Dfctl;
uint8_t Type;
uint8_t Rctl;
#endif
#define FCP_RTYPE 0x08
#define BC 0x02
#define SI 0x04
#define LA 0x08
#define FSEQ 0x40
#define LSEQ 0x80
} hcsw;
uint32_t reserved;
} WORD5;
typedef struct
{
uint32_t reserved[4];
PARM_ERR perr;
} GENERIC_RSP;
typedef struct
{
ULP_BDE xrsqbde[2];
uint32_t xrsqRo;
WORD5 w5;
} XR_SEQ_FIELDS;
typedef struct
{
ULP_BDE elsReq;
ULP_BDE elsRsp;
#ifdef EMLXS_BIG_ENDIAN
uint32_t word4Rsvd:7;
uint32_t fl:1;
uint32_t myID:24;
uint32_t word5Rsvd:8;
uint32_t remoteID:24;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t myID:24;
uint32_t fl:1;
uint32_t word4Rsvd:7;
uint32_t remoteID:24;
uint32_t word5Rsvd:8;
#endif
} ELS_REQUEST;
typedef struct
{
ULP_BDE elsReq[2];
uint32_t parmRo;
#ifdef EMLXS_BIG_ENDIAN
uint32_t word5Rsvd:8;
uint32_t remoteID:24;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t remoteID:24;
uint32_t word5Rsvd:8;
#endif
} RCV_ELS_REQ;
typedef struct
{
uint32_t rsvd[3];
uint32_t abortType;
#define ABORT_TYPE_ABTX 0x00000000
#define ABORT_TYPE_ABTS 0x00000001
uint32_t parm;
#ifdef EMLXS_BIG_ENDIAN
uint16_t abortContextTag;
uint16_t abortIoTag;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint16_t abortIoTag;
uint16_t abortContextTag;
#endif
} AC_XRI;
typedef struct
{
uint32_t rsvd[4];
uint32_t parmRo;
#ifdef EMLXS_BIG_ENDIAN
uint32_t word5Rsvd:8;
uint32_t remoteID:24;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t remoteID:24;
uint32_t word5Rsvd:8;
#endif
} GET_RPI;
typedef struct
{
ULP_BDE fcpi_cmnd;
ULP_BDE fcpi_rsp;
uint32_t fcpi_parm;
uint32_t fcpi_XRdy;
} FCPI_FIELDS;
typedef struct
{
ULP_BDE fcpt_Buffer[2];
uint32_t fcpt_Offset;
uint32_t fcpt_Length;
} FCPT_FIELDS;
typedef struct
{
ULP_BDL bdl;
uint32_t xrsqRo;
WORD5 w5;
} XMT_SEQ_FIELDS64;
typedef struct
{
ULP_BDE64 rcvBde;
uint32_t rsvd1;
uint32_t xrsqRo;
WORD5 w5;
} RCV_SEQ_FIELDS64;
typedef struct
{
ULP_BDL bdl;
#ifdef EMLXS_BIG_ENDIAN
uint32_t word4Rsvd:7;
uint32_t fl:1;
uint32_t myID:24;
uint32_t word5Rsvd:8;
uint32_t remoteID:24;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t myID:24;
uint32_t fl:1;
uint32_t word4Rsvd:7;
uint32_t remoteID:24;
uint32_t word5Rsvd:8;
#endif
} ELS_REQUEST64;
typedef struct
{
ULP_BDL resv;
uint32_t parameter;
#ifdef EMLXS_BIG_ENDIAN
uint16_t EventCode;
uint16_t SubContext;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint16_t SubContext;
uint16_t EventCode;
#endif
} ASYNC_STATUS;
typedef struct
{
ULP_BDL bdl;
uint32_t rsvd1;
uint32_t rsvd2;
} QUE_RING_LIST64;
typedef struct
{
ULP_BDL bdl;
uint32_t param;
WORD5 w5;
} GEN_REQUEST64;
typedef struct
{
ULP_BDE64 elsReq;
uint32_t rsvd1;
uint32_t parmRo;
#ifdef EMLXS_BIG_ENDIAN
uint32_t word5Rsvd:8;
uint32_t remoteID:24;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t remoteID:24;
uint32_t word5Rsvd:8;
#endif
} RCV_ELS_REQ64;
typedef struct
{
ULP_BDL bdl;
uint32_t fcpi_parm;
uint32_t fcpi_XRdy;
} FCPI_FIELDS64;
typedef struct
{
ULP_BDL bdl;
uint32_t fcpt_Offset;
uint32_t fcpt_Length;
} FCPT_FIELDS64;
typedef struct
{
uint32_t rsp_length;
uint32_t rsvd1;
uint32_t rsvd2;
uint32_t iotag32;
uint32_t status;
#ifdef EMLXS_BIG_ENDIAN
uint32_t rsvd:30;
uint32_t lnk:1;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t lnk:1;
uint32_t rsvd:30;
#endif
} AUTO_TRSP;
typedef struct
{
uint32_t io_tag64_low;
uint32_t io_tag64_high;
#ifdef EMLXS_BIG_ENDIAN
uint32_t cs_ctl:8;
uint32_t cs_en:1;
uint32_t rsv:15;
uint32_t ebde_count:8;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t ebde_count:8;
uint32_t rsv:15;
uint32_t cs_en:1;
uint32_t cs_ctl:8;
#endif
uint32_t rsplen;
ULP_BDE64 ebde1;
ULP_BDE64 ebde2;
ULP_BDE64 ebde3;
ULP_BDE64 ebde4;
ULP_BDE64 ebde5;
ULP_BDE64 ebde6;
} GENERIC_EXT_IOCB;
typedef struct
{
#ifdef EMLXS_BIG_ENDIAN
uint16_t oxid;
uint16_t seq_cnt;
uint16_t vpi;
uint16_t buddy_xri;
uint32_t ccp:8;
uint32_t ccpe:1;
uint32_t rsvd:23;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint16_t seq_cnt;
uint16_t oxid;
uint16_t buddy_xri;
uint16_t vpi;
uint32_t rsvd:23;
uint32_t ccpe:1;
uint32_t ccp:8;
#endif
uint32_t seq_len;
ULP_BDL bde2;
} RCV_SEQ_ELS_64_SLI3_EXT;
typedef volatile struct emlxs_iocb
{
union
{
GENERIC_RSP grsp;
XR_SEQ_FIELDS xrseq;
ULP_BDE cont[3];
ELS_REQUEST elsreq;
RCV_ELS_REQ rcvels;
AC_XRI acxri;
GET_RPI getrpi;
FCPI_FIELDS fcpi;
FCPT_FIELDS fcpt;
ULP_BDE64 cont64[2];
ELS_REQUEST64 elsreq64;
QUE_RING_LIST64 qringlist64;
GEN_REQUEST64 genreq64;
RCV_ELS_REQ64 rcvels64;
XMT_SEQ_FIELDS64 xseq64;
FCPI_FIELDS64 fcpi64;
FCPT_FIELDS64 fcpt64;
AUTO_TRSP atrsp;
RCV_SEQ_FIELDS64 rcvseq64;
ASYNC_STATUS astat;
uint32_t ulpWord[6];
} un;
union
{
struct
{
#ifdef EMLXS_BIG_ENDIAN
uint16_t ulpContext;
uint16_t ulpIoTag;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint16_t ulpIoTag;
uint16_t ulpContext;
#endif
} t1;
struct
{
#ifdef EMLXS_BIG_ENDIAN
uint16_t ulpContext;
uint16_t ulpIoTag1:2;
uint16_t ulpIoTag0:14;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint16_t ulpIoTag0:14;
uint16_t ulpIoTag1:2;
uint16_t ulpContext;
#endif
} t2;
uint32_t ulpWord;
} un1;
#define ULPCONTEXT un1.t1.ulpContext
#define ULPIOTAG un1.t1.ulpIoTag
#define ULPIOTAG0 un1.t2.ulpIoTag0
#define ULPDELAYXMIT un1.t2.ulpIoTag1
#define IOCB_DELAYXMIT_MSK 0x3000
union
{
struct
{
#ifdef EMLXS_BIG_ENDIAN
uint32_t ulpRsvdByte:8;
uint32_t ulpXS:1;
uint32_t ulpFCP2Rcvy:1;
uint32_t ulpPU:2;
uint32_t ulpIr:1;
uint32_t ulpClass:3;
uint32_t ulpCommand:8;
uint32_t ulpStatus:4;
uint32_t ulpBdeCount:2;
uint32_t ulpLe:1;
uint32_t ulpOwner:1;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t ulpOwner:1;
uint32_t ulpLe:1;
uint32_t ulpBdeCount:2;
uint32_t ulpStatus:4;
uint32_t ulpCommand:8;
uint32_t ulpClass:3;
uint32_t ulpIr:1;
uint32_t ulpPU:2;
uint32_t ulpFCP2Rcvy:1;
uint32_t ulpXS:1;
uint32_t ulpRsvdByte:8;
#endif
} t1;
struct
{
#ifdef EMLXS_BIG_ENDIAN
uint32_t ulpRsvdByte:8;
uint32_t ulpCT:2;
uint32_t ulpPU:2;
uint32_t ulpIr:1;
uint32_t ulpClass:3;
uint32_t ulpCommand:8;
uint32_t ulpStatus:4;
uint32_t ulpBdeCount:2;
uint32_t ulpLe:1;
uint32_t ulpOwner:1;
#endif
#ifdef EMLXS_LITTLE_ENDIAN
uint32_t ulpOwner:1;
uint32_t ulpLe:1;
uint32_t ulpBdeCount:2;
uint32_t ulpStatus:4;
uint32_t ulpCommand:8;
uint32_t ulpClass:3;
uint32_t ulpIr:1;
uint32_t ulpPU:2;
uint32_t ulpCT:2;
uint32_t ulpRsvdByte:8;
#endif
} t2;
uint32_t ulpWord;
} un2;
#define ULPCT un2.t2.ulpCT
#define ULPRSVDBYTE un2.t1.ulpRsvdByte
#define ULPXS un2.t1.ulpXS
#define ULPFCP2RCVY un2.t1.ulpFCP2Rcvy
#define ULPPU un2.t1.ulpPU
#define ULPIR un2.t1.ulpIr
#define ULPCLASS un2.t1.ulpClass
#define ULPCOMMAND un2.t1.ulpCommand
#define ULPSTATUS un2.t1.ulpStatus
#define ULPBDECOUNT un2.t1.ulpBdeCount
#define ULPLE un2.t1.ulpLe
#define ULPOWNER un2.t1.ulpOwner
#define RXFCHDR un.ulpWord
#define RXSEQCNT un1.ulpWord
#define RXSEQLEN un2.ulpWord
union
{
GENERIC_EXT_IOCB ext_iocb;
RCV_SEQ_ELS_64_SLI3_EXT ext_rcv;
uint32_t sli3Words[24];
} unsli3;
#define IOCB_FCP 1
#define IOCB_IP 2
#define PARM_UNUSED 0
#define PARM_REL_OFF 1
#define PARM_XFER_CHECK 2
#define CLASS1 0
#define CLASS2 1
#define CLASS3 2
#define CLASS_FCP_INTERMIX 7
#define IOSTAT_SUCCESS 0x0
#define IOSTAT_FCP_RSP_ERROR 0x1
#define IOSTAT_REMOTE_STOP 0x2
#define IOSTAT_LOCAL_REJECT 0x3
#define IOSTAT_NPORT_RJT 0x4
#define IOSTAT_FABRIC_RJT 0x5
#define IOSTAT_NPORT_BSY 0x6
#define IOSTAT_FABRIC_BSY 0x7
#define IOSTAT_INTERMED_RSP 0x8
#define IOSTAT_LS_RJT 0x9
#define IOSTAT_RESERVED_A 0xA
#define IOSTAT_CMD_REJECT 0xB
#define IOSTAT_FCP_TGT_LENCHK 0xC
#define IOSTAT_RESERVED_D 0xD
#define IOSTAT_RESERVED_E 0xE
#define IOSTAT_NEED_BUFF_ENTRY 0xF
#define IOSTAT_DATA_OVERRUN 0x10
#define IOSTAT_DATA_UNDERRUN 0x11
#define IOSTAT_RSP_INVALID 0x12
} emlxs_iocb_t;
typedef emlxs_iocb_t IOCB;
typedef struct emlxs_iocbq
{
emlxs_iocb_t iocb;
emlxs_wqe_t wqe;
struct emlxs_iocbq *next;
void *bp;
void *port;
void *channel;
void *node;
void *sbp;
uint32_t flag;
#define IOCB_POOL_ALLOCATED 0x00000001
#define IOCB_PRIORITY 0x00000002
#define IOCB_SPECIAL 0x00000004
#define IOCB_FCP_CMD 0x00000008
#define IOCB_FCT_DATA 0x00000020
} emlxs_iocbq_t;
typedef emlxs_iocbq_t IOCBQ;
#ifdef __cplusplus
}
#endif
#endif