#ifndef _SYS_SCSI_GENERIC_PERSIST_H
#define _SYS_SCSI_GENERIC_PERSIST_H
#ifdef __cplusplus
extern "C" {
#endif
#define PR_IN_READ_KEYS 0x0
#define PR_IN_READ_RESERVATION 0x1
#define PR_IN_REPORT_CAPABILITIES 0x2
#define PR_IN_READ_FULL_STATUS 0x3
#define PR_LU_SCOPE 0x0
#define PGR_TYPE_WR_EX 0x1
#define PGR_TYPE_EX_AC 0x3
#define PGR_TYPE_WR_EX_RO 0x5
#define PGR_TYPE_EX_AC_RO 0x6
#define PGR_TYPE_WR_EX_AR 0x7
#define PGR_TYPE_EX_AC_AR 0x8
#define PR_OUT_REGISTER 0x0
#define PR_OUT_RESERVE 0x1
#define PR_OUT_RELEASE 0x2
#define PR_OUT_CLEAR 0x3
#define PR_OUT_PREEMPT 0x4
#define PR_OUT_PREEMPT_ABORT 0x5
#define PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY 0x06
#define PR_OUT_REGISTER_MOVE 0x7
#define iSCSI_PROTOCOL_ID 0x5
#define WW_UID_DEVICE_NAME 0x0
#define SCSI_TPTID_SIZE 24
#define SCSI_TPTID_FC_PORT_NAME_SIZE 8
#define SCSI_TPTID_SPI_ADDRESS_LEN 2
#define SCSI_TPTID_SPI_REL_TGTPTID_LEN 2
#define SCSI_TPTID_SBP_PORT_NAME_LEN 8
#define SCSI_TPTID_SRP_PORT_NAME_LEN 16
#define SCSI_TPTID_ISCSI_ISID_SEPERATOR ",i,0x"
#if defined(_BIT_FIELDS_LTOH)
typedef struct scsi_cdb_prin {
uint8_t cmd;
uint8_t action : 5,
resbits : 3;
uint8_t resbytes[5];
uint8_t alloc_len[2];
uint8_t control;
} scsi_cdb_prin_t;
typedef struct scsi_prin_rsrvdesc {
uint8_t reservation_key[8];
uint8_t obsolete1[4];
uint8_t resbytes;
uint8_t type : 4,
scope : 4;
uint8_t obsolete2[2];
} scsi_prin_rsrvdesc_t;
typedef struct scsi_prin_readrsrv {
uint8_t PRgeneration[4];
uint8_t add_len[4];
union {
uint64_t service_key[1];
scsi_prin_rsrvdesc_t res_key_list[1];
} key_list;
} scsi_prin_readrsrv_t;
typedef struct scsi_per_res_type {
uint8_t resbits1 : 1,
wr_ex : 1,
resbits2 : 1,
ex_ac : 1,
resbits3 : 1,
wr_ex_ro : 1,
ex_ac_ro : 1,
wr_ex_ar : 1;
uint8_t ex_ac_ar : 1,
resbits4 : 7;
} scsi_per_res_type_t;
typedef struct scsi_prin_rpt_cap {
uint8_t length[2];
uint8_t ptpl_c : 1,
resbits1 : 1,
atp_c : 1,
sip_c : 1,
crh : 1,
resbits2 : 3;
uint8_t ptpl_a : 1,
resbits3 : 6,
tmv : 1;
scsi_per_res_type_t pr_type;
uint8_t resbytes[2];
} scsi_prin_rpt_cap_t;
typedef struct scsi_transport_id {
uint8_t protocol_id : 4,
resbits : 2,
format_code : 2;
uint8_t protocol_data[1];
} scsi_transport_id_t;
typedef struct scsi_fc_transport_id {
uint8_t protocol_id : 4,
resbits : 2,
format_code : 2;
uint8_t rsvbytes1[7];
uint8_t port_name[8];
uint8_t rsvbytes2[8];
} scsi_fc_transport_id_t;
typedef struct iscsi_transport_id {
uint8_t protocol_id : 4,
resbits : 2,
format_code : 2;
uint8_t rsvbyte1;
uint8_t add_len[2];
char iscsi_name[1];
} iscsi_transport_id_t;
typedef struct scsi_srp_transport_id {
uint8_t protocol_id : 4,
resbits : 2,
format_code : 2;
uint8_t rsvbytes1[7];
uint8_t srp_name[16];
} scsi_srp_transport_id_t;
typedef struct scsi_prin_status_t {
uint8_t reservation_key[8];
uint8_t resbytes1[4];
uint8_t r_holder : 1,
all_tg_pt : 1,
resbits : 6;
uint8_t type : 4,
scope : 4;
uint8_t resbytes2[4];
uint8_t rel_tgt_port_id[2];
uint8_t add_len[4];
scsi_transport_id_t trans_id;
} scsi_prin_status_t;
typedef struct scsi_prin_full_status {
uint8_t PRgeneration[4];
uint8_t add_len[4];
scsi_prin_status_t full_desc[1];
} scsi_prin_full_status_t;
typedef struct scsi_cdb_prout {
uint8_t cmd;
uint8_t action : 5,
resbits : 3;
uint8_t type : 4,
scope : 4;
uint8_t resbytes[2];
uint8_t param_len[4];
uint8_t control;
} scsi_cdb_prout_t;
typedef struct scsi_prout_plist {
uint8_t reservation_key[8];
uint8_t service_key[8];
uint8_t obsolete1[4];
uint8_t aptpl : 1,
resbits1 : 1,
all_tg_pt : 1,
spec_i_pt : 1,
resbits2 : 4;
uint8_t resbytes1;
uint8_t obsolete2[2];
uint8_t apd[1];
} scsi_prout_plist_t;
typedef struct scsi_prout_reg_move_plist {
uint8_t reservation_key[8];
uint8_t service_key[8];
uint8_t resbytes1;
uint8_t aptpl : 1,
unreg : 1,
resbits1 : 6;
uint8_t rel_tgt_port_id[2];
uint8_t tptid_len[4];
uint8_t tptid[1];
} scsi_prout_reg_move_plist_t;
#elif defined(_BIT_FIELDS_HTOL)
typedef struct scsi_cdb_prin {
uint8_t cmd;
uint8_t resbits : 3,
action : 5;
uint8_t resbytes[5];
uint8_t alloc_len[2];
uint8_t control;
} scsi_cdb_prin_t;
typedef struct scsi_prin_rsrvdesc {
uint8_t reservation_key[8];
uint8_t obsolete1[4];
uint8_t resbytes;
uint8_t scope : 4,
type : 4;
uint8_t obsolete2[2];
} scsi_prin_rsrvdesc_t;
typedef struct scsi_prin_readrsrv {
uint8_t PRgeneration[4];
uint8_t add_len[4];
union {
uint64_t service_key[1];
scsi_prin_rsrvdesc_t res_key_list[1];
} key_list;
} scsi_prin_readrsrv_t;
typedef struct scsi_per_res_type {
uint8_t wr_ex_ar : 1,
ex_ac_ro : 1,
wr_ex_ro : 1,
resbits3 : 1,
ex_ac : 1,
resbits2 : 1,
wr_ex : 1,
resbits1 : 1;
uint8_t resbits4 : 7,
ex_ac_ar : 1;
} scsi_per_res_type_t;
typedef struct scsi_prin_rpt_cap {
uint8_t length[2];
uint8_t resbits2 : 3,
crh : 1,
sip_c : 1,
atp_c : 1,
resbits1 : 1,
ptpl_c : 1;
uint8_t tmv : 1,
resbits3 : 6,
ptpl_a : 1;
scsi_per_res_type_t pr_type;
uint8_t resbytes[2];
} scsi_prin_rpt_cap_t;
typedef struct scsi_transport_id {
uint8_t format_code : 2,
resbits : 2,
protocol_id : 4;
uint8_t protocol_data[1];
} scsi_transport_id_t;
typedef struct scsi_fc_transport_id {
uint8_t format_code : 2,
resbits : 2,
protocol_id : 4;
uint8_t rsvbytes1[7];
uint8_t port_name[8];
uint8_t rsvbytes2[8];
} scsi_fc_transport_id_t;
typedef struct iscsi_transport_id {
uint8_t format_code : 2,
resbits : 2,
protocol_id : 4;
uint8_t rsvbyte1;
uint8_t add_len[2];
char iscsi_name[1];
} iscsi_transport_id_t;
typedef struct scsi_srp_transport_id {
uint8_t format_code : 2,
resbits : 2,
protocol_id : 4;
uint8_t rsvbytes1[7];
uint8_t srp_name[16];
} scsi_srp_transport_id_t;
typedef struct scsi_prin_status_t {
uint8_t reservation_key[8];
uint8_t resbytes1[4];
uint8_t resbits : 6,
all_tg_pt : 1,
r_holder : 1;
uint8_t scope : 4,
type : 4;
uint8_t resbytes2[4];
uint8_t rel_tgt_port_id[2];
uint8_t add_len[4];
scsi_transport_id_t trans_id;
} scsi_prin_status_t;
typedef struct scsi_prin_full_status {
uint8_t PRgeneration[4];
uint8_t add_len[4];
scsi_prin_status_t full_desc[1];
} scsi_prin_full_status_t;
typedef struct scsi_cdb_prout {
uint8_t cmd;
uint8_t resbits : 3,
action : 5;
uint8_t scope : 4,
type : 4;
uint8_t resbytes[2];
uint8_t param_len[4];
uint8_t control;
} scsi_cdb_prout_t;
typedef struct scsi_prout_plist {
uint8_t reservation_key[8];
uint8_t service_key[8];
uint8_t obsolete1[4];
uint8_t resbits1 : 4,
spec_i_pt : 1,
all_tg_pt : 1,
resbits2 : 1,
aptpl : 1;
uint8_t resbytes1;
uint8_t obsolete2[2];
uint8_t apd[1];
} scsi_prout_plist_t;
typedef struct scsi_prout_reg_move_plist {
uint8_t reservation_key[8];
uint8_t service_key[8];
uint8_t resbytes1;
uint8_t resbits1 : 6,
unreg : 1,
aptpl : 1;
uint8_t rel_tgt_port_id[2];
uint8_t tptid_len[4];
uint8_t tptid[1];
} scsi_prout_reg_move_plist_t;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
#ifdef __cplusplus
}
#endif
#endif