#ifndef _SYS_SCSI_TARGETS_STDEF_H
#define _SYS_SCSI_TARGETS_STDEF_H
#include <sys/sunddi.h>
#include <sys/note.h>
#include <sys/condvar.h>
#include <sys/kstat.h>
#include <sys/int_limits.h>
#include <sys/scsi/scsi_types.h>
#include <sys/scsi/generic/sense.h>
#include <sys/mtio.h>
#include <sys/taskq.h>
#include <sys/taskq_impl.h>
#ifdef __cplusplus
extern "C" {
#endif
#define ST_MAXRECSIZE_VARIABLE 65535
#define ST_MAXRECSIZE_VARIABLE_LIMIT 65534
#define ST_MAXRECSIZE_FIXED (63<<10)
#define INF 1000000000
#define LASTBLK (-1)
#define ST_TYPE_INVALID 0x00
#define ST_TYPE_SYSGEN1 MT_ISSYSGEN11
#define ST_TYPE_SYSGEN MT_ISSYSGEN
#define ST_TYPE_DEFAULT MT_ISDEFAULT
#define ST_TYPE_EMULEX MT_ISMT02
#define ST_TYPE_ARCHIVE MT_ISVIPER1
#define ST_TYPE_WANGTEK MT_ISWANGTEK1
#define ST_TYPE_CDC MT_ISCDC
#define ST_TYPE_FUJI MT_ISFUJI
#define ST_TYPE_KENNEDY MT_ISKENNEDY
#define ST_TYPE_ANRITSU MT_ISANRITSU
#define ST_TYPE_HP MT_ISHP
#define ST_TYPE_HIC MT_ISCCS23
#define ST_TYPE_REEL MT_ISCCS24
#define ST_TYPE_DAT MT_ISCCS28
#define ST_TYPE_EXABYTE MT_ISEXABYTE
#define ST_TYPE_EXB8500 MT_ISEXB8500
#define ST_TYPE_WANGTHS MT_ISWANGTHS
#define ST_TYPE_WANGDAT MT_ISWANGDAT
#define ST_TYPE_PYTHON MT_ISPYTHON
#define ST_TYPE_STC3490 MT_ISSTC
#define ST_TYPE_TAND25G MT_ISTAND25G
#define ST_TYPE_DLT MT_ISDLT
#define ST_TYPE_STK9840 MT_ISSTK9840
#define ST_TYPE_BMDLT1 MT_ISBMDLT1
#define ST_TYPE_LTO MT_LTO
#define ST_TYPE_AIT MT_ISAIT
#define ST_LAST_TYPE ST_TYPE_AIT
#define ST_DYNAMIC 0x2000
#define ST_VARIABLE 0x001
#define ST_QIC 0x002
#define ST_REEL 0x004
#define ST_BSF 0x008
#define ST_BSR 0x010
#define ST_LONG_ERASE 0x020
#define ST_AUTODEN_OVERRIDE 0x040
#define ST_NOBUF 0x080
#define ST_RESERVED_BIT1 0x100
#define ST_KNOWS_EOD 0x200
#define ST_UNLOADABLE 0x400
#define ST_SOFT_ERROR_REPORTING 0x800
#define ST_LONG_TIMEOUTS 0x1000
#define ST_BUFFERED_WRITES 0x4000
#define ST_NO_RECSIZE_LIMIT 0x8000
#define ST_MODE_SEL_COMP 0x10000
#define ST_NO_RESERVE_RELEASE 0x20000
#define ST_READ_IGNORE_ILI 0x40000
#define ST_READ_IGNORE_EOFS 0x80000
#define ST_SHORT_FILEMARKS 0x100000
#define ST_EJECT_ON_CHANGER_FAILURE 0x200000
#define ST_RETRY_ON_RECOVERED_DEFERRED_ERROR 0x400000
#define ST_KNOWS_MEDIA 0x800000
#define ST_WORMABLE 0x1000000
#define ST_CLN_TYPE_1 0x10000000
#define ST_CLN_TYPE_2 0x20000000
#define ST_CLN_TYPE_3 0x40000000
#define ST_CLN_MASK (ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3)
#define ST_VALID_OPTS (ST_VARIABLE | ST_QIC | ST_REEL | ST_BSF | ST_BSR |\
ST_LONG_ERASE | ST_AUTODEN_OVERRIDE | ST_NOBUF | ST_KNOWS_EOD |\
ST_UNLOADABLE | ST_SOFT_ERROR_REPORTING | ST_LONG_TIMEOUTS |\
ST_NO_RECSIZE_LIMIT | ST_MODE_SEL_COMP | ST_NO_RESERVE_RELEASE |\
ST_READ_IGNORE_ILI | ST_READ_IGNORE_EOFS | ST_SHORT_FILEMARKS |\
ST_EJECT_ON_CHANGER_FAILURE | ST_RETRY_ON_RECOVERED_DEFERRED_ERROR |\
ST_WORMABLE | ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3)
#define NDENSITIES MT_NDENSITIES
#define NSPEEDS MT_NSPEEDS
#define SUPPORTED_LOG_PAGES_PAGE 0x00
#define TAPE_SEQUENTIAL_PAGE 0x0c
#define TAPE_ALERT_PAGE 0x2e
#define CURRENT_THRESHOLD_VALUES 0x00
#define CURRENT_CUMULATIVE_VALUES 0x40
#define DEFAULT_THRESHOLD_VALUES 0x80
#define DEFAULT_CUMULATIVE_VALUES 0xC0
typedef enum {
TAF_READ_WARN = 0x01,
TAF_WRITE_WARN = 0x02,
TAF_HARD_ERR = 0x03,
TAF_MEDIA_ERR = 0x04,
TAF_READ_FAIL = 0x05,
TAF_WRITE_FAIL = 0x06,
TAF_MEDIA_LIFE = 0x07,
TAF_MEDIA_NOT_DATA_GRADE = 0x08,
TAF_WRITE_PROTECTED = 0x09,
TAF_NO_MEDIA_REMOVE = 0x0A,
TAF_CLEANING_MEDIA = 0x0B,
TAF_UNSUPPERTED_FORMAT = 0x0C,
TAF_RECOVERED_TAPE_BREAK = 0x0D,
TAF_TAPE_BREAK_FAUL = 0x0E,
TAF_CART_MEM_FAIL = 0x0F,
TAF_FORCED_EJECT = 0x10,
TAF_READ_ONLY_FORMAT = 0x11,
TAF_TAPE_DIR_CORRUPT = 0x12,
TAF_NEARING_MEDIA_LIFE = 0x13,
TAF_CLEAN_NOW = 0x14,
TAF_CLEAN_PERIODIC = 0x15,
TAF_EXP_CLEAN_CART = 0x16,
TAF_INVALID_CLEAN_MEDIA = 0x17,
TAF_RETENSION_REQUEST = 0x18,
TAF_DUAL_PORT_INTERFACE_ERR = 0x19,
TAF_COOLING_FAN_FAIL = 0x1A,
TAF_POWER_SUPPLY_FAIL = 0x1B,
TAF_POWER_CONSUMPTION = 0x1C,
TAF_DRIVE_MAINT_REQUEST = 0x1D,
TAF_HARDWARE_A = 0x1E,
TAF_HARDWARE_B = 0x1F,
TAF_INTERFACE = 0x20,
TAF_EJECT_MEDIA = 0x21,
TAF_DOWNLOAD_FAIL = 0x22,
TAF_DRIVE_HUMIDITY = 0x23,
TAF_DRIVE_TEMP = 0x24,
TAF_DRIVE_VOLTAGE = 0x25,
TAF_PREDICTIVE_FAIL = 0x26,
TAF_DIAG_REQUIRED = 0x27,
TAF_LOADER_HDWR_A = 0x28,
TAF_LOADER_STRAY_TAPE = 0x29,
TAF_LOADER_HDWR_B = 0x2A,
TAF_LOADER_DOOR = 0x2B,
TAF_LOADER_HDWR_C = 0x2C,
TAF_LOADER_MAGAZINE = 0x2D,
TAF_LOADER_PREDICTIVE_FAIL = 0x2E,
TAF_LOST_STATISTICS = 0x32,
TAF_TAPE_DIR_CURRUPT_UNLOAD = 0x33,
TAF_TAPE_SYS_WRT_FAIL = 0x34,
TAF_TAPE_SYS_RD_FAIL = 0x35,
TAF_NO_START_OF_DATA = 0x36,
TAF_WORM_INTEGRITY = 0x3B,
TAF_WORM_OVRWRT_ATTEMPT = 0x3C
}tape_alert_flags;
#define CLEAN_FOR_ERRORS 0x18
#define TAPE_ALERT_SUPPORT_UNKNOWN 0x00
#define TAPE_ALERT_NOT_SUPPORTED 0x01
#define TAPE_ALERT_SUPPORTED 0x02
#define TAPE_ALERT_STILL_DIRTY 0x04
#define TAPE_SEQUENTIAL_SUPPORTED 0x08
#define TAPE_PREVIOUSLY_DIRTY 0x10
#define TAPE_ALERT_MAX_PARA 64
#define TAPE_SEQUENTIAL_PAGE_PARA 64
#define SEQUENTIAL_NEED_CLN 0x0100
#define ST_NAMESIZE 44
#define VIDLEN 8
#define PIDLEN 16
#define VIDPIDLEN (VIDLEN + PIDLEN)
struct st_drivetype {
char name[ST_NAMESIZE];
char length;
char vid[VIDPIDLEN];
char type;
int bsize;
int options;
int max_rretries;
int max_wretries;
uchar_t densities[NDENSITIES];
uchar_t default_density;
uchar_t mediatype[NDENSITIES];
ushort_t non_motion_timeout;
ushort_t io_timeout;
ushort_t rewind_timeout;
ushort_t space_timeout;
ushort_t load_timeout;
ushort_t unload_timeout;
ushort_t erase_timeout;
};
#define MINUTES(val) ((val) * 60)
struct comp_mode_page {
#if defined(_BIT_FIELDS_LTOH)
uchar_t : 6,
dcc: 1,
dce: 1;
uchar_t : 5,
red: 2,
dde: 1;
uchar_t comp_alg_msb;
uchar_t comp_alg_high;
uchar_t comp_alg_low;
uchar_t comp_alg_lsb;
uchar_t decomp_alg_msb;
uchar_t decomp_alg_high;
uchar_t decomp_alg_low;
uchar_t decomp_alg_lsb;
uchar_t reservered0;
uchar_t reservered1;
uchar_t reservered2;
uchar_t reservered3;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t dce: 1,
dcc: 1,
: 6;
uchar_t dde: 1,
red: 2,
: 5;
uchar_t comp_alg_msb;
uchar_t comp_alg_high;
uchar_t comp_alg_low;
uchar_t comp_alg_lsb;
uchar_t decomp_alg_msb;
uchar_t decomp_alg_high;
uchar_t decomp_alg_low;
uchar_t decomp_alg_lsb;
uchar_t reservered0;
uchar_t reservered1;
uchar_t reservered2;
uchar_t reservered3;
#endif
};
struct dev_mode_page {
#if defined(_BIT_FIELDS_LTOH)
uchar_t act_format: 5,
caf: 1,
cap: 1,
: 1;
uchar_t act_partition;
uchar_t wrt_buf_full_ratio;
uchar_t rd_buf_full_ratio;
uchar_t wrt_delay_time_msb;
uchar_t wrt_delay_time_lsb;
uchar_t rew: 1,
robo: 1,
socf: 2,
avc: 1,
rsmk: 1,
lois: 1,
obr: 1;
uchar_t gap_size;
uchar_t bam: 1,
bmal: 1,
swp: 1,
sew: 1,
eeg: 1,
eod_defined: 3;
uchar_t buf_size_leot_msb;
uchar_t buf_size_leot_mid;
uchar_t buf_size_leot_lsb;
uchar_t comp_alg;
uchar_t prmwp: 1,
perswp: 1,
asocwp: 1,
rew_on_rst: 2,
oir: 1,
wtre: 2;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t : 1,
cap: 1,
caf: 1,
act_format: 5;
uchar_t act_partition;
uchar_t wrt_buf_full_ratio;
uchar_t rd_buf_full_ratio;
uchar_t wrt_delay_time_msb;
uchar_t wrt_delay_time_lsb;
uchar_t obr: 1,
lois: 1,
rsmk: 1,
avc: 1,
socf: 2,
robo: 1,
rew: 1;
uchar_t gap_size;
uchar_t eod_defined: 3,
eeg: 1,
sew: 1,
swp: 1,
bmal: 1,
bam: 1;
uchar_t buf_size_leot_msb;
uchar_t buf_size_leot_mid;
uchar_t buf_size_leot_lsb;
uchar_t comp_alg;
uchar_t wtre: 2,
oir: 1,
rew_on_rst: 2,
asocwp: 1,
perswp: 1,
prmwp: 1;
#endif
};
struct sas_lun_mode {
#if defined(_BIT_FIELDS_HTOL)
uchar_t : 3,
tran_layer_ret: 1,
protocol_id: 4;
uchar_t reserved[5];
#elif defined(_BIT_FIELDS_LTOH)
uchar_t protocol_id: 4,
tran_layer_ret: 1,
: 3;
uchar_t reserved[5];
#endif
};
typedef union {
struct comp_mode_page comp;
struct dev_mode_page dev;
struct sas_lun_mode saslun;
}modepage;
#define MSIZE 0x0c
struct seq_mode {
#if defined(_BIT_FIELDS_LTOH)
uchar_t data_len;
uchar_t media_type;
uchar_t speed :4,
bufm :3,
wp :1;
uchar_t bd_len;
uchar_t density;
uchar_t high_nb;
uchar_t mid_nb;
uchar_t low_nb;
uchar_t reserved;
uchar_t high_bl;
uchar_t mid_bl;
uchar_t low_bl;
uchar_t page_code: 6,
: 1,
ps: 1;
uchar_t page_len;
modepage page;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t data_len;
uchar_t media_type;
uchar_t wp :1,
bufm :3,
speed :4;
uchar_t bd_len;
uchar_t density;
uchar_t high_nb;
uchar_t mid_nb;
uchar_t low_nb;
uchar_t reserved;
uchar_t high_bl;
uchar_t mid_bl;
uchar_t low_bl;
uchar_t ps: 1,
: 1,
page_code: 6;
uchar_t page_len;
modepage page;
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
};
struct one_com_des {
#if defined(_BIT_FIELDS_LTOH)
uchar_t reserved0;
uchar_t support: 3,
reserved1: 4,
ctdp: 1;
ushort_t cdb_size;
uchar_t usage[CDB_GROUP4];
#elif defined(_BIT_FIELDS_HTOL)
uchar_t reserved0;
uchar_t ctdp: 1,
reserved1: 4,
support: 3;
ushort_t cdb_size;
uchar_t usage[CDB_GROUP4];
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
};
struct com_timeout_des {
ushort_t des_len;
uchar_t reserved;
uchar_t com_spe;
uint_t nom_timeout;
uint_t rec_timeout;
};
#define ALL_COMMAND_DATA_FORMAT 0
#define ONE_COMMAND_NO_SERVICE_DATA_FORMAT 1
#define ONE_COMMAND_DATA_FORMAT 2
#define SUPPORT_VALUES_NOT_AVAILABLE 0
#define SUPPORT_VALUES_NOT_SUPPORT 1
#define SUPPORT_VALUES_SUPPORT_SCSI 3
#define SUPPORT_VALUES_SUPPORT_VENDOR 5
struct report_density_header {
ushort_t ava_dens_len;
uchar_t reserved0;
uchar_t reserved1;
};
struct report_density_desc {
#if defined(_BIT_FIELDS_LTOH)
uchar_t pri_den;
uchar_t sec_den;
uchar_t dlv:1;
uchar_t reserved:4;
uchar_t deflt:1;
uchar_t dup:1;
uchar_t wrtok:1;
uchar_t desc_len_hi;
uchar_t desc_len_low;
uchar_t bits_per_mm[3];
uchar_t media_width_hi;
uchar_t media_width_low;
ushort_t tracks;
uint_t capacity;
uchar_t ass_org[8];
uchar_t den_name[8];
uchar_t description[20];
#elif defined(_BIT_FIELDS_HTOL)
uchar_t pri_den;
uchar_t sec_den;
uchar_t wrtok:1;
uchar_t dup:1;
uchar_t deflt:1;
uchar_t reserved:4;
uchar_t dlv:1;
uchar_t desc_len_hi;
uchar_t desc_len_low;
uchar_t bits_per_mm[3];
uchar_t media_width_hi;
uchar_t media_width_low;
ushort_t tracks;
uint_t capacity;
uchar_t ass_org[8];
uchar_t den_name[8];
uchar_t description[20];
#else
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif
};
#define RBLSIZE (sizeof (struct read_blklim))
struct read_blklim {
#if defined(_BIT_FIELDS_HTOL)
uchar_t reserved: 3;
uchar_t granularity: 5;
#elif defined(_BIT_FIELDS_LTOH)
uchar_t granularity: 5;
uchar_t reserved: 3;
#endif
uchar_t max_hi;
uchar_t max_mid;
uchar_t max_lo;
uchar_t min_hi;
uchar_t min_lo;
};
typedef enum {
ST_OP_NIL,
ST_OP_CTL,
ST_OP_READ,
ST_OP_WRITE,
ST_OP_WEOF
}optype;
typedef enum {
ST_NO_EOF,
ST_EOF_PENDING,
ST_EOF,
ST_EOT_PENDING,
ST_EOT,
ST_EOM,
ST_WRITE_AFTER_EOM
}pstatus;
typedef enum { invalid, legacy, logical } posmode;
typedef struct tapepos {
uint64_t lgclblkno;
int32_t fileno;
int32_t blkno;
int32_t partition;
pstatus eof;
posmode pmode;
uint32_t: 32;
}tapepos_t;
typedef enum {
SHORT_POS = 0,
LONG_POS = 6,
EXT_POS = 8,
NO_POS = 0xff
} read_p_types;
typedef struct tape_position {
#if defined(_BIT_FIELDS_HTOL)
uchar_t begin_of_part: 1;
uchar_t end_of_part: 1;
uchar_t blk_cnt_unkwn: 1;
uchar_t byte_cnt_unkwn: 1;
uchar_t reserved0: 1;
uchar_t blk_posi_unkwn: 1;
uchar_t posi_err: 1;
uchar_t reserved1: 1;
#elif defined(_BIT_FIELDS_LTOH)
uchar_t reserved1: 1;
uchar_t posi_err: 1;
uchar_t blk_posi_unkwn: 1;
uchar_t reserved0: 1;
uchar_t byte_cnt_unkwn: 1;
uchar_t blk_cnt_unkwn: 1;
uchar_t end_of_part: 1;
uchar_t begin_of_part: 1;
#endif
uchar_t partition_number;
uchar_t reserved2[2];
uint32_t host_block;
uint32_t media_block;
uchar_t reserved3;
uchar_t block_in_buff[3];
uint32_t byte_in_buff;
}tape_position_t;
typedef struct tape_position_long {
#if defined(_BIT_FIELDS_HTOL)
uint32_t begin_of_part: 1;
uint32_t end_of_part: 1;
uint32_t reserved0: 2;
uint32_t mrk_posi_unkwn:1;
uint32_t blk_posi_unkwn:1;
uint32_t reserved1: 2;
#elif defined(_BIT_FIELDS_LTOH)
uint32_t reserved1: 2;
uint32_t blk_posi_unkwn:1;
uint32_t mrk_posi_unkwn:1;
uint32_t reserved0: 2;
uint32_t end_of_part: 1;
uint32_t begin_of_part: 1;
#endif
uint32_t reserved2: 24;
uint32_t partition;
uint64_t block_number;
uint64_t file_number;
uint64_t set_number;
}tape_position_long_t;
typedef struct tape_position_ext {
#if defined(_BIT_FIELDS_HTOL)
uchar_t begin_of_part: 1;
uchar_t end_of_part: 1;
uchar_t blk_cnt_unkwn: 1;
uchar_t byte_cnt_unkwn: 1;
uchar_t mrk_posi_unkwn: 1;
uchar_t blk_posi_unkwn: 1;
uchar_t posi_err: 1;
uchar_t reserved0: 1;
uchar_t partition;
uint16_t parameter_len;
uint32_t reserved1: 8;
uint32_t blks_in_buf: 24;
#elif defined(_BIT_FIELDS_LTOH)
uchar_t reserved0: 1;
uchar_t posi_err: 1;
uchar_t blk_posi_unkwn: 1;
uchar_t mrk_posi_unkwn: 1;
uchar_t byte_cnt_unkwn: 1;
uchar_t blk_cnt_unkwn: 1;
uchar_t end_of_part: 1;
uchar_t begin_of_part: 1;
uchar_t partition;
uint16_t parameter_len;
uint32_t blks_in_buf: 24;
uint32_t reserved1: 8;
#endif
uint64_t host_block;
uint64_t media_block;
uint64_t byte_in_buf;
}tape_position_ext_t;
typedef union {
tape_position_t srt;
tape_position_ext_t ext;
tape_position_long_t lng;
}read_pos_data_t;
typedef struct {
unsigned char cmd;
unsigned char
requires_reserve: 1,
retriable: 1,
chg_tape_pos: 1,
chg_tape_data: 1,
explicit_cmd_set: 1,
chg_tape_direction: 2;
#define DIR_NONE 0
#define DIR_FORW 1
#define DIR_REVC 2
#define DIR_EITH 3
unsigned char
transfers_data: 2,
#define TRAN_NONE 0
#define TRAN_READ 1
#define TRAN_WRTE 2
recov_pos_type: 1,
#define POS_EXPECTED 0
#define POS_STARTING 1
do_not_recover: 1;
uchar_t reserve_byte;
uint32_t reserve_mask;
uint64_t (*get_cnt)(uchar_t *);
uint64_t (*get_lba)(uchar_t *);
}cmd_attribute;
typedef struct {
buf_t *cmd_bp;
size_t privatelen;
int str_retry_cnt;
int pkt_retry_cnt;
}pkt_info;
typedef struct {
buf_t *cmd_bp;
size_t privatelen;
int str_retry_cnt;
int pkt_retry_cnt;
tapepos_t pos;
const cmd_attribute *cmd_attrib;
}recov_info;
#ifdef _KERNEL
#ifdef __x86
#define ST_MAX_CONTIG_MEM_NUM 3
struct contig_mem {
struct contig_mem *cm_next;
size_t cm_len;
caddr_t cm_addr;
ddi_acc_handle_t cm_acc_hdl;
struct buf *cm_bp;
int cm_use_sbuf;
};
#endif
#endif
typedef enum {
ST_STATE_CLOSED,
ST_STATE_OFFLINE,
ST_STATE_INITIALIZING,
ST_STATE_OPENING,
ST_STATE_OPEN_PENDING_IO,
ST_STATE_APPEND_TESTING,
ST_STATE_OPEN,
ST_STATE_RESOURCE_WAIT,
ST_STATE_CLOSING,
ST_STATE_SENSING,
ST_STATE_CLOSE_PENDING_OPEN
}st_states;
typedef enum { RDWR, RDONLY, WORM, RDWORM, FAILED } writablity;
typedef enum {
TLR_NOT_KNOWN,
TLR_NOT_SUPPORTED,
TLR_SAS_ONE_DEVICE,
TLR_SAS_TWO_DEVICE
}st_tlr_state;
struct scsi_tape {
struct scsi_device *un_sd;
struct scsi_pkt *un_rqs;
struct scsi_pkt *un_mkr_pkt;
kcondvar_t un_sbuf_cv;
kcondvar_t un_queue_cv;
struct buf *un_sbufp;
char *un_srqbufp;
kcondvar_t un_clscv;
struct buf *un_quef;
struct buf *un_quel;
struct buf *un_runqf;
struct buf *un_runql;
struct seq_mode *un_mspl;
struct st_drivetype *un_dp;
uint_t un_dp_size;
caddr_t un_tmpbuf;
tapepos_t un_pos;
int un_oflags;
tapepos_t un_err_pos;
uint_t un_err_resid;
short un_fmneeded;
dev_t un_dev;
uchar_t un_attached;
int un_pwr_mgmt;
uchar_t un_density_known;
uchar_t un_curdens;
optype un_lastop;
st_states un_laststate;
st_states un_state;
uchar_t un_status;
uchar_t un_retry_ct;
writablity un_read_only;
uchar_t un_test_append;
uchar_t un_arq_enabled;
uchar_t un_untagged_qing;
uchar_t un_allow_large_xfer;
uchar_t un_sbuf_busy;
uchar_t un_ncmds;
uchar_t un_throttle;
uchar_t un_last_throttle;
uchar_t un_max_throttle;
uchar_t un_persistence;
uchar_t un_persist_errors;
uchar_t un_flush_on_errors;
uint_t un_kbytes_xferred;
uint_t un_last_resid;
uint_t un_last_count;
struct kstat *un_stats;
struct buf *un_rqs_bp;
struct buf *un_wf;
struct buf *un_wl;
struct read_blklim *un_rbl;
int un_maxdma;
uint_t un_bsize;
int un_maxbsize;
uint_t un_minbsize;
int un_errno;
kcondvar_t un_state_cv;
enum mtio_state un_mediastate;
enum mtio_state un_specified_mediastate;
timeout_id_t un_delay_tid;
timeout_id_t un_hib_tid;
opaque_t un_swr_token;
uchar_t un_comp_page;
uchar_t un_rsvd_status;
kstat_t *un_errstats;
int un_init_options;
int un_save_fileno;
daddr_t un_save_blkno;
uchar_t un_restore_pos;
tapepos_t un_suspend_pos;
uchar_t un_silent_skip;
short un_tids_at_suspend;
kcondvar_t un_tape_busy_cv;
kcondvar_t un_suspend_cv;
uchar_t un_eject_tape_on_failure;
uchar_t un_HeadClean;
uchar_t un_rqs_state;
struct scsi_extended_sense
*un_uscsi_rqs_buf;
uchar_t un_data_mod;
writablity (*un_wormable) (struct scsi_tape *un);
int un_max_cdb_sz;
read_p_types un_read_pos_type;
read_pos_data_t *un_read_pos_data;
struct mterror_entry_stack *un_error_entry_stk;
#ifdef __x86
ddi_dma_handle_t un_contig_mem_hdl;
struct contig_mem *un_contig_mem;
int un_contig_mem_available_num;
int un_contig_mem_total_num;
size_t un_max_contig_mem_len;
kcondvar_t un_contig_mem_cv;
int un_maxdma_arch;
#endif
caddr_t un_media_id;
int un_media_id_len;
int (*un_media_id_method)(struct scsi_tape *, int (*)());
buf_t *un_recov_buf;
kcondvar_t un_recov_buf_cv;
uchar_t un_recov_buf_busy;
#ifdef _KERNEL
ddi_taskq_t *un_recov_taskq;
#else
void *un_recov_taskq;
#endif
tapepos_t un_running;
uchar_t un_unit_attention_flags;
uchar_t un_multipath;
ulong_t un_last_path_instance;
st_tlr_state un_tlr_flag;
};
typedef int (*bufunc_t)(struct scsi_tape *, int, int64_t, int);
typedef int (*ubufunc_t)(struct scsi_tape *, struct uscsi_cmd *, int);
struct st_errstats {
struct kstat_named st_softerrs;
struct kstat_named st_harderrs;
struct kstat_named st_transerrs;
struct kstat_named st_vid;
struct kstat_named st_pid;
struct kstat_named st_revision;
struct kstat_named st_serial;
};
struct log_page {
#if defined(_BIT_FIELDS_LTOH)
uchar_t code :6,
:2;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t :2,
code :6;
#endif
uchar_t reserved;
uchar_t length_hi;
uchar_t length_lo;
};
struct log_param {
uchar_t pc_hi;
uchar_t pc_lo;
#if defined(_BIT_FIELDS_LTOH)
uchar_t lp : 1,
: 1,
tmc : 2,
etc : 1,
tsd : 1,
ds : 1,
du : 1;
#elif defined(_BIT_FIELDS_HTOL)
uchar_t du : 1,
ds : 1,
tsd : 1,
etc : 1,
tmc : 2,
: 1,
lp : 1;
#endif
uchar_t length;
};
struct st_tape_alert_parameter {
struct log_param log_param;
uchar_t param_value;
};
struct st_tape_alert {
struct log_page log_page;
struct st_tape_alert_parameter param[TAPE_ALERT_MAX_PARA];
};
#define TAPE_ALERT_PARAMETER_LENGTH \
(sizeof (struct st_tape_alert_parameter)) * TAPE_ALERT_MAX_PARA
struct log_sequential_page_parameter {
struct log_param log_param;
uchar_t param_value[8];
};
struct log_sequential_page {
struct log_page log_page;
struct log_sequential_page_parameter param[TAPE_SEQUENTIAL_PAGE_PARA];
};
#if !defined(__lint)
_NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, scsi_tape))
_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_dp))
_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_sd))
_NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_tape::un_rqs))
_NOTE(SCHEME_PROTECTS_DATA("protected by cv", scsi_tape::un_sbufp))
_NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_bsize))
_NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_arq_status))
_NOTE(SCHEME_PROTECTS_DATA("save sharing",
scsi_tape::un_allow_large_xfer
scsi_tape::un_maxbsize
scsi_tape::un_maxdma
))
#ifdef __x86
_NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_contig_mem_hdl))
_NOTE(SCHEME_PROTECTS_DATA("not shared", contig_mem))
#endif
#endif
#define ST_PWR_NORMAL 0
#define ST_PWR_SUSPENDED 1
#define IN_EOF(pos) (pos.eof == ST_EOF_PENDING || pos.eof == ST_EOF)
#define ST_RQS_OVR 0x1
#define ST_RQS_VALID 0x2
#define ST_RQS_READ 0x4
#define ST_RQS_ERROR 0x8
typedef enum {
COMMAND_DONE,
COMMAND_DONE_ERROR,
COMMAND_DONE_ERROR_RECOVERED,
QUE_COMMAND,
QUE_BUSY_COMMAND,
QUE_SENSE,
JUST_RETURN,
COMMAND_DONE_EACCES,
QUE_LAST_COMMAND,
COMMAND_TIMEOUT,
PATH_FAILED,
DEVICE_RESET,
DEVICE_TAMPER,
ATTEMPT_RETRY
}errstate;
#ifdef _KERNEL
typedef struct {
struct scsi_arq_status ei_failing_status;
tapepos_t ei_expected_pos;
errstate ei_error_type;
buf_t *ei_failing_bp;
struct scsi_pkt ei_failed_pkt;
} st_err_info;
#define ST_ERR_INFO_SIZE (sizeof (st_err_info) - \
sizeof (struct scsi_pkt) + scsi_pkt_size())
#endif
#define ST_INIT_RESERVE 0x001
#define ST_RELEASE 0x002
#define ST_RESERVE 0x004
#define ST_PRESERVE_RESERVE 0x008
#define ST_RESERVATION_CONFLICT 0x010
#define ST_LOST_RESERVE 0x020
#define ST_APPLICATION_RESERVATIONS 0x040
#define ST_INITIATED_RESET 0x080
#define ST_LOST_RESERVE_BETWEEN_OPENS \
(ST_RESERVE | ST_LOST_RESERVE | ST_PRESERVE_RESERVE)
#define ST_SA_SCSI3_REGISTER 0x00
#define ST_SA_SCSI3_RESERVE 0x01
#define ST_SA_SCSI3_RELEASE 0x02
#define ST_SA_SCSI3_CLEAR 0x03
#define ST_SA_SCSI3_PREEMPT 0x04
#define ST_SA_SCSI3_PREEMPTANDABORT 0x05
#define ST_SA_SCSI3_REGISTERANDIGNOREKEY 0x06
#define ST_SA_MASK 0x1f
#define ST_RESERVATION_DELAY 500000
#define ST_MAX_THROTTLE 4
#define ST_SPACE_TIME MINUTES(60)
#define ST_LONG_SPACE_TIME_X 5
#define ST_IO_TIME MINUTES(2)
#define ST_LONG_TIMEOUT_X 5
#define ST_STATUS_BUSY_TIMEOUT 10*hz
#define ST_TRAN_BUSY_TIMEOUT 4*hz
#define ST_INTERRUPT_CONTEXT 1
#define ST_START_CONTEXT 2
#define ST_RETRY_COUNT 20
#define ST_SEL_RETRY_COUNT 2
#define ST_DEFERRED_ERROR 0x01
#define ST_MAXUNIT 128
#define ST_WAIT_CMDS_COMPLETE 10
#ifndef SECSIZE
#define SECSIZE 512
#endif
#ifndef SECDIV
#define SECDIV 9
#endif
#define ST_SCSI_DEVP (un->un_sd)
#define ST_DEVINFO (ST_SCSI_DEVP->sd_dev)
#define ST_INQUIRY (ST_SCSI_DEVP->sd_inq)
#define ST_RQSENSE (ST_SCSI_DEVP->sd_sense)
#define ST_MUTEX (&ST_SCSI_DEVP->sd_mutex)
#define ROUTE (&ST_SCSI_DEVP->sd_address)
#define BSD_BEHAVIOR (getminor(un->un_dev) & MT_BSD)
#define SVR4_BEHAVIOR ((getminor(un->un_dev) & MT_BSD) == 0)
#define ST_STATUS_MASK (STATUS_MASK | STATUS_TASK_ABORT)
#define SCBP(pkt) ((struct scsi_status *)(pkt)->pkt_scbp)
#define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & ST_STATUS_MASK)
#define CDBP(pkt) ((union scsi_cdb *)(pkt)->pkt_cdbp)
#define BP_PKT(bp) ((struct scsi_pkt *)(bp)->av_back)
#define SET_BP_PKT(bp, pkt) ((bp)->av_back = (struct buf *)(pkt))
#define BP_UCMD(bp) ((struct uscsi_cmd *)(bp)->b_back)
#define USCSI_CMD(bp) (((bp) == un->un_sbufp) && (BP_UCMD(bp)))
#define IS_CLOSING(un) ((un)->un_state == ST_STATE_CLOSING || \
((un)->un_state == ST_STATE_SENSING && \
(un)->un_laststate == ST_STATE_CLOSING))
#define ASYNC_CMD 0
#define SYNC_CMD 1
#define st_bioerror(bp, error) \
{ bioerror(bp, error); \
un->un_errno = error; }
#if (defined(__lock_lint))
#undef UINT64_MAX
#define UINT64_MAX (18446744073709551615UL)
#endif
#if (defined(__lock_lint) || (SIZE_MAX < UINT64_MAX))
#define SP_BLK UINT32_C(0x00000000)
#define SP_FLM UINT32_C(0x20000000)
#define SP_SQFLM UINT32_C(0x40000000)
#define SP_EOD UINT32_C(0x60000000)
#define SP_BACKSP UINT32_C(0x80000000)
#define SP_CMD_MASK UINT32_C(0x60000000)
#define SP_CNT_MASK UINT32_C(0x1fffffff)
#define SPACE_CNT(x) (((x) & SP_BACKSP)? \
(-((x)&(SP_CNT_MASK))):(x)&(SP_CNT_MASK))
#define SPACE_TYPE(x) ((x & SP_CMD_MASK)>>29)
#else
#define SP_BLK UINT64_C(0x0000000000000000)
#define SP_FLM UINT64_C(0x2000000000000000)
#define SP_SQFLM UINT64_C(0x4000000000000000)
#define SP_EOD UINT64_C(0x6000000000000000)
#define SP_BACKSP UINT64_C(0x8000000000000000)
#define SP_CMD_MASK UINT64_C(0x6000000000000000)
#define SP_CNT_MASK UINT64_C(0x1fffffffffffffff)
#define SPACE_CNT(x) (((x) & SP_BACKSP)? \
(-((x)&(SP_CNT_MASK))):(x)&(SP_CNT_MASK))
#define SPACE_TYPE(x) ((x & SP_CMD_MASK)>>61)
#endif
#define SPACE(cmd, cnt) ((cnt < 0) ? (SP_BACKSP | (-(cnt)) | cmd) : (cmd | cnt))
#define Fmk(x) SPACE(SP_FLM, x)
#define Blk(x) SPACE(SP_BLK, x)
#define LD_UNLOAD 0
#define LD_LOAD 1
#define LD_RETEN 2
#define LD_EOT 4
#define LD_HOLD 8
#define MR_UNLOCK 0
#define MR_LOCK 1
#define GET_SOFT_STATE(dev) \
register struct scsi_tape *un; \
register int instance; \
\
instance = MTUNIT(dev); \
if ((un = ddi_get_soft_state(st_state, instance)) == NULL) \
return (ENXIO);
#ifdef DEBUG
#define STDEBUG
#endif
#ifdef STDEBUG
#define DEBUGGING\
((scsi_options & SCSI_DEBUG_TGT) || (st_debug & 0x7))
#define DEBLOCK(d) \
int lev = CE_NOTE; \
mutex_enter(&st_debug_mutex); \
if (d == st_lastdev || d == 0) { \
lev = CE_CONT; \
} \
mutex_exit(&st_debug_mutex);
#define DEBUNLOCK(d) \
mutex_enter(&st_debug_mutex); \
if (d != 0 && d != st_lastdev) { \
st_lastdev = d; \
} \
mutex_exit(&st_debug_mutex);
#define ST_DEBUG1 if ((st_debug & 0x7) >= 1) scsi_log
#define ST_DEBUG ST_DEBUG1
#define ST_DEBUG2 if ((st_debug & 0x7) >= 2) scsi_log
#define ST_DEBUG3 if ((st_debug & 0x7) >= 3) scsi_log
#define ST_DEBUG4 if ((st_debug & 0x7) >= 4) scsi_log
#define ST_DEBUG5 if ((st_debug & 0x7) >= 5) scsi_log
#define ST_DEBUG6 if ((st_debug & 0x7) >= 6) scsi_log
#define ST_RECOV if (st_debug & 0x8) scsi_log
#define ST_ENTR(d, fn) if (st_debug & 0x10) { DEBLOCK(d) \
scsi_log(d, st_label, lev, #fn); DEBUNLOCK(d) }
#define ST_FUNC(d, fn) if (st_debug & 0x20) { DEBLOCK(d) \
scsi_log(d, st_label, lev, #fn); DEBUNLOCK(d) }
#define ST_SPAC if (st_debug & 0x40) scsi_log
#define ST_CDB(d, cmnt, cdb) if (st_debug & 0x180) { DEBLOCK(d) \
st_print_cdb(d, st_label, lev, cmnt, cdb); DEBUNLOCK(d) }
#define ST_SENSE(d, cmnt, sense, size) if (st_debug & 0x200) { DEBLOCK(d) \
st_clean_print(d, st_label, lev, cmnt, sense, size); DEBUNLOCK(d) }
#define ST_POS(d, cmnt, pdata) if (st_debug & 0x400) { DEBLOCK(d) \
st_print_position(d, st_label, lev, cmnt, pdata); DEBUNLOCK(d) }
#else
#define st_debug (0)
#define DEBUGGING (0)
#define ST_DEBUG if (0) scsi_log
#define ST_DEBUG1 if (0) scsi_log
#define ST_DEBUG2 if (0) scsi_log
#define ST_DEBUG3 if (0) scsi_log
#define ST_DEBUG4 if (0) scsi_log
#define ST_DEBUG5 if (0) scsi_log
#define ST_DEBUG6 if (0) scsi_log
#define ST_RECOV if (0) scsi_log
#define ST_ENTR(d, fn)
#define ST_FUNC(d, fn)
#define ST_SPAC if (0) scsi_log
#define ST_CDB(d, cmnt, cdb)
#define ST_SENSE(d, cmnt, sense, size)
#define ST_SENSE(d, cmnt, sense, size)
#define ST_POS(d, cmnt, pdata)
#endif
#define MEDIA_ACCESS_DELAY 5000000
#define ST_DEV_CONFIG_PAGE 0x10
#define ST_DEV_CONFIG_NO_COMP 0x00
#define ST_DEV_CONFIG_DEF_COMP 0x01
#define ST_COMPRESSION_DENSITY 3
#define ST_DEV_DATACOMP_PAGE 0x0F
#define MAXBSIZE_UNKNOWN -2
#define ONE_MEG (1024 * 1024)
#define READ_SOFT_ERROR_WARNING_THRESHOLD (25 * ONE_MEG)
#define WRITE_SOFT_ERROR_WARNING_THRESHOLD (20 * ONE_MEG)
#define TAPE_SENSE_LENGTH 32
#define SENSE_19_BITS \
"\20\10PF\07BPE\06FPE\05ME\04ECO\03TME\02TNP\01LBOT"
#define SENSE_20_BITS \
"\20\10RSVD\07RSVD\06WP\05FMKE\04URE\03WE1\02SSE\01FW"
#define SENSE_21_BITS \
"\20\10RSVD\07RSVD\06RRR\05CLND\04CLN\03PEOT\02WSEB\01WSE0"
#define EXABYTE_WRITE_ERROR_THRESHOLD 6
#define EXABYTE_READ_ERROR_THRESHOLD 3
#define EXABYTE_MIN_TRANSFER (25 * ONE_MEG)
#define CLN 0x8
#define CLND 0x10
#define LOG_SENSE_LENGTH 0xff
#define MIN_LOG_SENSE_LENGTH 0x2b
#define DAT_SMALL_WRITE_ERROR_THRESHOLD 40
#define DAT_LARGE_WRITE_ERROR_THRESHOLD 200
#define DAT_SMALL_READ_ERROR_THRESHOLD 5
#define DAT_LARGE_READ_ERROR_THRESHOLD 3
#define ST_HIB_TID 0x01
#define ST_DELAY_TID 0x02
#ifdef __cplusplus
}
#endif
#endif