#ifndef _SYS_SCSI_GENERIC_SENSE_H
#define _SYS_SCSI_GENERIC_SENSE_H
#ifdef __cplusplus
extern "C" {
#endif
struct scsi_sense {
#if defined(_BIT_FIELDS_LTOH)
uchar_t ns_code : 4,
ns_class : 3,
ns_valid : 1;
uchar_t ns_lba_hi : 5,
ns_vu : 3;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t ns_valid : 1,
ns_class : 3,
ns_code : 4;
uchar_t ns_vu : 3,
ns_lba_hi : 5;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t ns_lba_mid;
uchar_t ns_lba_lo;
};
#define CLASS_EXTENDED_SENSE 0x7
#define ADDL_SENSE_ADJUST 0x8
#define MIN_FIXED_SENSE_LEN 0xE
struct scsi_extended_sense {
#if defined(_BIT_FIELDS_LTOH)
uchar_t es_code : 4,
es_class : 3,
es_valid : 1;
uchar_t es_segnum;
uchar_t es_key : 4,
: 1,
es_ili : 1,
es_eom : 1,
es_filmk : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t es_valid : 1,
es_class : 3,
es_code : 4;
uchar_t es_segnum;
uchar_t es_filmk : 1,
es_eom : 1,
es_ili : 1,
: 1,
es_key : 4;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t es_info_1;
uchar_t es_info_2;
uchar_t es_info_3;
uchar_t es_info_4;
uchar_t es_add_len;
uchar_t es_cmd_info[4];
uchar_t es_add_code;
uchar_t es_qual_code;
uchar_t es_fru_code;
uchar_t es_skey_specific[3];
uchar_t es_add_info[2];
};
#define CODE_FMT_FIXED_CURRENT 0x0
#define CODE_FMT_FIXED_DEFERRED 0x1
#define CODE_FMT_DESCR_CURRENT 0x2
#define CODE_FMT_DESCR_DEFERRED 0x3
#define CODE_FMT_VENDOR_SPECIFIC 0xF
#define SCSI_IS_DESCR_SENSE(sns_ptr) \
(((((struct scsi_extended_sense *)(sns_ptr))->es_code) == \
CODE_FMT_DESCR_CURRENT) || \
((((struct scsi_extended_sense *)(sns_ptr))->es_code) == \
CODE_FMT_DESCR_DEFERRED))
#define KEY_NO_SENSE 0x00
#define KEY_RECOVERABLE_ERROR 0x01
#define KEY_NOT_READY 0x02
#define KEY_MEDIUM_ERROR 0x03
#define KEY_HARDWARE_ERROR 0x04
#define KEY_ILLEGAL_REQUEST 0x05
#define KEY_UNIT_ATTENTION 0x06
#define KEY_WRITE_PROTECT 0x07
#define KEY_DATA_PROTECT KEY_WRITE_PROTECT
#define KEY_BLANK_CHECK 0x08
#define KEY_VENDOR_UNIQUE 0x09
#define KEY_COPY_ABORTED 0x0A
#define KEY_ABORTED_COMMAND 0x0B
#define KEY_EQUAL 0x0C
#define KEY_VOLUME_OVERFLOW 0x0D
#define KEY_MISCOMPARE 0x0E
#define KEY_RESERVED 0x0F
struct scsi_descr_sense_hdr {
#if defined(_BIT_FIELDS_LTOH)
uchar_t ds_code : 4,
ds_class : 3,
ds_reserved : 1;
uchar_t ds_key : 4,
ds_reserved2 : 4;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t ds_reserved : 1,
ds_class : 3,
ds_code : 4;
uchar_t ds_reserved2 : 4,
ds_key : 4;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t ds_add_code;
uchar_t ds_qual_code;
uchar_t ds_reserved3[3];
uchar_t ds_addl_sense_length;
};
struct scsi_information_sense_descr {
uchar_t isd_descr_type;
uchar_t isd_addl_length;
#if defined(_BIT_FIELDS_LTOH)
uchar_t isd_reserved1 : 7,
isd_valid : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t isd_valid : 1,
isd_reserved1 : 7;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t isd_reserved2;
uchar_t isd_information[8];
};
struct scsi_cmd_specific_sense_descr {
uchar_t css_descr_type;
uchar_t css_addl_length;
uchar_t css_reserved[2];
uchar_t css_cmd_specific_info[8];
};
union scsi_sk_specific_data {
struct {
#if defined(_BIT_FIELDS_LTOH)
uchar_t bit_pointer : 3,
bpv : 1,
reserved : 2,
cd : 1,
sksv : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t sksv : 1,
cd : 1,
reserved : 2,
bpv : 1,
bit_pointer : 3;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t field_pointer[2];
} fp;
struct {
uchar_t sksv;
uchar_t actual_retry_count[2];
} arc;
struct {
uchar_t sksv;
uchar_t progress_indication[2];
} pi;
struct {
#if defined(_BIT_FIELDS_LTOH)
uchar_t bit_pointer : 3,
bpv : 1,
reserved : 1,
sd : 1,
reserved2 : 1,
sksv : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t sksv : 1,
reserved2 : 1,
sd : 1,
reserved : 1,
bpv : 1,
bit_pointer : 3;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t field_pointer[2];
} sp;
};
struct scsi_sk_specific_sense_descr {
uchar_t sss_descr_type;
uchar_t sss_addl_length;
uchar_t sss_reserved[2];
union scsi_sk_specific_data sss_data;
uchar_t sss_reserved2;
};
struct scsi_fru_sense_descr {
uchar_t fs_descr_type;
uchar_t fs_addl_length;
uchar_t fs_reserved;
uchar_t fs_fru_code;
};
struct scsi_stream_cmd_data {
#if defined(_BIT_FIELDS_LTOH)
uchar_t scs_reserved2 : 5,
scs_ili : 1,
scs_eom : 1,
scs_filemark : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t scs_filemark : 1,
scs_eom : 1,
scs_ili : 1,
scs_reserved2 : 5;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
};
struct scsi_stream_cmd_sense_descr {
uchar_t scs_descr_type;
uchar_t scs_addl_length;
uchar_t scs_reserved;
struct scsi_stream_cmd_data scs_data;
};
struct scsi_block_cmd_sense_descr {
uchar_t bcs_descr_type;
uchar_t bcs_addl_length;
uchar_t bcs_reserved;
#if defined(_BIT_FIELDS_LTOH)
uchar_t bcs_reserved2 : 5,
bcs_ili : 1,
bcs_reserved3 : 2;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t bcs_reserved3 : 2,
bcs_ili : 1,
bcs_reserved2 : 5;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
};
struct scsi_ata_status_ret_sense_descr {
uchar_t ars_descr_type;
uchar_t ars_addl_length;
#if defined(_BIT_FIELDS_LTOH)
uchar_t ars_extend : 1,
ars_reserved1 : 7;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t ars_reserved1 : 7,
ars_extend : 1;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
uchar_t ars_error;
uchar_t ars_sec_count_msb;
uchar_t ars_sec_count_lsb;
uchar_t ars_lba_low_msb;
uchar_t ars_lba_low_lsb;
uchar_t ars_lba_mid_msb;
uchar_t ars_lba_mid_lsb;
uchar_t ars_lba_high_msb;
uchar_t ars_lba_high_lsb;
uchar_t ars_device;
uchar_t ars_status;
};
struct scsi_vendor_specific_sense_descr {
uchar_t vss_descr_type;
uchar_t vss_addl_length;
uchar_t vss_vendor_specific_info[1];
};
#define DESCR_INFORMATION 0x00
#define DESCR_COMMAND_SPECIFIC 0x01
#define DESCR_SENSE_KEY_SPECIFIC 0x02
#define DESCR_FRU 0x03
#define DESCR_STREAM_COMMANDS 0x04
#define DESCR_BLOCK_COMMANDS 0x05
#define DESCR_OSD_OID 0x06
#define DESCR_OSD_RESP_INTEGRITY 0x07
#define DESCR_OSD_ATTR_ID 0x08
#define DESCR_ATA_STATUS_RETURN 0x09
#ifdef __cplusplus
}
#endif
#include <sys/scsi/impl/sense.h>
#endif