#ifndef _FCP_H
#define _FCP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#define FCP_SCSI_DATA 0x01
#define FCP_SCSI_CMD 0x02
#define FCP_SCSI_RSP 0x03
#define FCP_SCSI_XFER_RDY 0x05
typedef struct fcp_cntl {
uchar_t cntl_reserved_0;
#if defined(_BIT_FIELDS_HTOL)
uchar_t cntl_reserved_1 : 5,
cntl_qtype : 3;
uchar_t cntl_kill_tsk : 1,
cntl_clr_aca : 1,
cntl_reset_tgt : 1,
cntl_reset_lun : 1,
cntl_reserved_2 : 1,
cntl_clr_tsk : 1,
cntl_abort_tsk : 1,
cntl_reserved_3 : 1;
uchar_t cntl_reserved_4 : 6,
cntl_read_data : 1,
cntl_write_data : 1;
#elif defined(_BIT_FIELDS_LTOH)
uchar_t cntl_qtype : 3,
cntl_reserved_1 : 5;
uchar_t cntl_reserved_3 : 1,
cntl_abort_tsk : 1,
cntl_clr_tsk : 1,
cntl_reserved_2 : 1,
cntl_reset_lun : 1,
cntl_reset_tgt : 1,
cntl_clr_aca : 1,
cntl_kill_tsk : 1;
uchar_t cntl_write_data : 1,
cntl_read_data : 1,
cntl_reserved_4 : 6;
#else
#error one of _BIT_FIELDS_HTOL or _BIT_FIELDS_LTOH must be defined
#endif
} fcp_cntl_t;
#define FCP_QTYPE_SIMPLE 0
#define FCP_QTYPE_HEAD_OF_Q 1
#define FCP_QTYPE_ORDERED 2
#define FCP_QTYPE_ACA_Q_TAG 4
#define FCP_QTYPE_UNTAGGED 5
typedef struct fcp_ent_addr {
ushort_t ent_addr_0;
ushort_t ent_addr_1;
ushort_t ent_addr_2;
ushort_t ent_addr_3;
} fcp_ent_addr_t;
#define FCP_CDB_SIZE 16
#define FCP_LUN_SIZE 8
#define FCP_LUN_HEADER 8
typedef struct fcp_cmd {
fcp_ent_addr_t fcp_ent_addr;
fcp_cntl_t fcp_cntl;
uchar_t fcp_cdb[FCP_CDB_SIZE];
int fcp_data_len;
} fcp_cmd_t;
typedef struct fcp_status {
ushort_t reserved_0;
#if defined(_BIT_FIELDS_HTOL)
uchar_t reserved_1 : 4,
resid_under : 1,
resid_over : 1,
sense_len_set : 1,
rsp_len_set : 1;
#elif defined(_BIT_FIELDS_LTOH)
uchar_t rsp_len_set : 1,
sense_len_set : 1,
resid_over : 1,
resid_under : 1,
reserved_1 : 4;
#endif
uchar_t scsi_status;
} fcp_status_t;
typedef struct fcp_rsp {
uint32_t reserved_0;
uint32_t reserved_1;
union {
fcp_status_t fcp_status;
uint32_t i_fcp_status;
} fcp_u;
uint32_t fcp_resid;
uint32_t fcp_sense_len;
uint32_t fcp_response_len;
} fcp_rsp_t;
#define FCP_MAX_RSP_IU_SIZE 256
struct fcp_rsp_info {
uchar_t resvd1;
uchar_t resvd2;
uchar_t resvd3;
uchar_t rsp_code;
uchar_t resvd4;
uchar_t resvd5;
uchar_t resvd6;
uchar_t resvd7;
};
#define FCP_NO_FAILURE 0x0
#define FCP_DL_LEN_MISMATCH 0x1
#define FCP_CMND_INVALID 0x2
#define FCP_DATA_RO_MISMATCH 0x3
#define FCP_TASK_MGMT_NOT_SUPPTD 0x4
#define FCP_TASK_MGMT_FAILED 0x5
#ifdef THIS_NEEDED_YET
typedef struct fcp_xfer_rdy {
ulong64_t fcp_seq_offset;
ulong64_t fcp_burst_len;
ulong64_t reserved;
} fcp_xfer_rdy_t;
#endif
struct fcp_prli {
uchar_t type;
uchar_t resvd1;
#if defined(_BIT_FIELDS_HTOL)
uint16_t orig_process_assoc_valid : 1,
resp_process_assoc_valid : 1,
establish_image_pair : 1,
resvd2 : 13;
#elif defined(_BIT_FIELDS_LTOH)
uint16_t resvd2 : 13,
establish_image_pair : 1,
resp_process_assoc_valid : 1,
orig_process_assoc_valid : 1;
#endif
uint32_t orig_process_associator;
uint32_t resp_process_associator;
#if defined(_BIT_FIELDS_HTOL)
uint32_t resvd3 : 23,
retry : 1,
confirmed_compl_allowed : 1,
data_overlay_allowed : 1,
initiator_fn : 1,
target_fn : 1,
obsolete_2 : 1,
obsolete_1 : 1,
read_xfer_rdy_disabled : 1,
write_xfer_rdy_disabled : 1;
#elif defined(_BIT_FIELDS_LTOH)
uint32_t write_xfer_rdy_disabled : 1,
read_xfer_rdy_disabled : 1,
obsolete_1 : 1,
obsolete_2 : 1,
target_fn : 1,
initiator_fn : 1,
data_overlay_allowed : 1,
confirmed_compl_allowed : 1,
retry : 1,
resvd3 : 23;
#endif
};
struct fcp_prli_acc {
uchar_t type;
uchar_t resvd1;
#if defined(_BIT_FIELDS_HTOL)
uint16_t orig_process_assoc_valid : 1,
resp_process_assoc_valid : 1,
image_pair_established : 1,
resvd2 : 1,
accept_response_code : 4,
resvd3 : 8;
#elif defined(_BIT_FIELDS_LTOH)
uint16_t resvd3 : 8,
accept_response_code : 4,
resvd2 : 1,
image_pair_established : 1,
resp_process_assoc_valid : 1,
orig_process_assoc_valid : 1;
#endif
uint32_t orig_process_associator;
uint32_t resp_process_associator;
#if defined(_BIT_FIELDS_HTOL)
uint32_t resvd4 : 26,
initiator_fn : 1,
target_fn : 1,
cmd_data_mixed : 1,
data_resp_mixed : 1,
read_xfer_rdy_disabled : 1,
write_xfer_rdy_disabled : 1;
#elif defined(_BIT_FIELDS_LTOH)
uint32_t write_xfer_rdy_disabled : 1,
read_xfer_rdy_disabled : 1,
data_resp_mixed : 1,
cmd_data_mixed : 1,
target_fn : 1,
initiator_fn : 1,
resvd4 : 26;
#endif
};
#define FC_UB_FCP_CDB_FLAG 0x0001
#define FC_UB_FCP_PORT_LOGOUT 0x0002
#define FC_UB_FCP_ABORT_TASK 0x0004
#define FC_UB_FCP_BUS_RESET 0x0008
#define FC_UB_FCP_CMD_DONE 0x8000
#define FC_UB_FCP_OOB_CMD (FC_UB_FCP_PORT_LOGOUT | FC_UB_FCP_ABORT_TASK \
| FC_UB_FCP_BUS_RESET)
#if !defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("Unshared Data",
fcp_cmd
fcp_rsp
fcp_prli))
#endif
#define FC4_TYPE_WORD_POS(x) ((uchar_t)(x) >> 5)
#define FC4_TYPE_BIT_POS(x) ((uchar_t)(x) & 0x1F)
#ifdef __cplusplus
}
#endif
#endif