1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #ifndef _ST_H 4*4882a593Smuzhiyun #define _ST_H 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #include <linux/completion.h> 7*4882a593Smuzhiyun #include <linux/mutex.h> 8*4882a593Smuzhiyun #include <linux/kref.h> 9*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Descriptor for analyzed sense data */ 12*4882a593Smuzhiyun struct st_cmdstatus { 13*4882a593Smuzhiyun int midlevel_result; 14*4882a593Smuzhiyun struct scsi_sense_hdr sense_hdr; 15*4882a593Smuzhiyun int have_sense; 16*4882a593Smuzhiyun int residual; 17*4882a593Smuzhiyun u64 uremainder64; 18*4882a593Smuzhiyun u8 flags; 19*4882a593Smuzhiyun u8 remainder_valid; 20*4882a593Smuzhiyun u8 fixed_format; 21*4882a593Smuzhiyun u8 deferred; 22*4882a593Smuzhiyun }; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct scsi_tape; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* scsi tape command */ 27*4882a593Smuzhiyun struct st_request { 28*4882a593Smuzhiyun unsigned char cmd[MAX_COMMAND_SIZE]; 29*4882a593Smuzhiyun unsigned char sense[SCSI_SENSE_BUFFERSIZE]; 30*4882a593Smuzhiyun int result; 31*4882a593Smuzhiyun struct scsi_tape *stp; 32*4882a593Smuzhiyun struct completion *waiting; 33*4882a593Smuzhiyun struct bio *bio; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* The tape buffer descriptor. */ 37*4882a593Smuzhiyun struct st_buffer { 38*4882a593Smuzhiyun unsigned char dma; /* DMA-able buffer */ 39*4882a593Smuzhiyun unsigned char cleared; /* internal buffer cleared after open? */ 40*4882a593Smuzhiyun unsigned short do_dio; /* direct i/o set up? */ 41*4882a593Smuzhiyun int buffer_size; 42*4882a593Smuzhiyun int buffer_blocks; 43*4882a593Smuzhiyun int buffer_bytes; 44*4882a593Smuzhiyun int read_pointer; 45*4882a593Smuzhiyun int writing; 46*4882a593Smuzhiyun int syscall_result; 47*4882a593Smuzhiyun struct st_request *last_SRpnt; 48*4882a593Smuzhiyun struct st_cmdstatus cmdstat; 49*4882a593Smuzhiyun struct page **reserved_pages; 50*4882a593Smuzhiyun int reserved_page_order; 51*4882a593Smuzhiyun struct page **mapped_pages; 52*4882a593Smuzhiyun struct rq_map_data map_data; 53*4882a593Smuzhiyun unsigned char *b_data; 54*4882a593Smuzhiyun unsigned short use_sg; /* zero or max number of s/g segments for this adapter */ 55*4882a593Smuzhiyun unsigned short sg_segs; /* number of segments in s/g list */ 56*4882a593Smuzhiyun unsigned short frp_segs; /* number of buffer segments */ 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* The tape mode definition */ 60*4882a593Smuzhiyun struct st_modedef { 61*4882a593Smuzhiyun unsigned char defined; 62*4882a593Smuzhiyun unsigned char sysv; /* SYS V semantics? */ 63*4882a593Smuzhiyun unsigned char do_async_writes; 64*4882a593Smuzhiyun unsigned char do_buffer_writes; 65*4882a593Smuzhiyun unsigned char do_read_ahead; 66*4882a593Smuzhiyun unsigned char defaults_for_writes; 67*4882a593Smuzhiyun unsigned char default_compression; /* 0 = don't touch, etc */ 68*4882a593Smuzhiyun short default_density; /* Forced density, -1 = no value */ 69*4882a593Smuzhiyun int default_blksize; /* Forced blocksize, -1 = no value */ 70*4882a593Smuzhiyun struct scsi_tape *tape; 71*4882a593Smuzhiyun struct device *devs[2]; /* Auto-rewind and non-rewind devices */ 72*4882a593Smuzhiyun struct cdev *cdevs[2]; /* Auto-rewind and non-rewind devices */ 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Number of modes can be changed by changing ST_NBR_MODE_BITS. The maximum 76*4882a593Smuzhiyun number of modes is 16 (ST_NBR_MODE_BITS 4) */ 77*4882a593Smuzhiyun #define ST_NBR_MODE_BITS 2 78*4882a593Smuzhiyun #define ST_NBR_MODES (1 << ST_NBR_MODE_BITS) 79*4882a593Smuzhiyun #define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS) 80*4882a593Smuzhiyun #define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define ST_MAX_TAPES (1 << (20 - (ST_NBR_MODE_BITS + 1))) 83*4882a593Smuzhiyun #define ST_MAX_TAPE_ENTRIES (ST_MAX_TAPES << (ST_NBR_MODE_BITS + 1)) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* The status related to each partition */ 86*4882a593Smuzhiyun struct st_partstat { 87*4882a593Smuzhiyun unsigned char rw; 88*4882a593Smuzhiyun unsigned char eof; 89*4882a593Smuzhiyun unsigned char at_sm; 90*4882a593Smuzhiyun unsigned char last_block_valid; 91*4882a593Smuzhiyun u32 last_block_visited; 92*4882a593Smuzhiyun int drv_block; /* The block where the drive head is */ 93*4882a593Smuzhiyun int drv_file; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Tape statistics */ 97*4882a593Smuzhiyun struct scsi_tape_stats { 98*4882a593Smuzhiyun atomic64_t read_byte_cnt; /* bytes read */ 99*4882a593Smuzhiyun atomic64_t write_byte_cnt; /* bytes written */ 100*4882a593Smuzhiyun atomic64_t in_flight; /* Number of I/Os in flight */ 101*4882a593Smuzhiyun atomic64_t read_cnt; /* Count of read requests */ 102*4882a593Smuzhiyun atomic64_t write_cnt; /* Count of write requests */ 103*4882a593Smuzhiyun atomic64_t other_cnt; /* Count of other requests either 104*4882a593Smuzhiyun * implicit or from user space 105*4882a593Smuzhiyun * ioctl. */ 106*4882a593Smuzhiyun atomic64_t resid_cnt; /* Count of resid_len > 0 */ 107*4882a593Smuzhiyun atomic64_t tot_read_time; /* ktime spent completing reads */ 108*4882a593Smuzhiyun atomic64_t tot_write_time; /* ktime spent completing writes */ 109*4882a593Smuzhiyun atomic64_t tot_io_time; /* ktime spent doing any I/O */ 110*4882a593Smuzhiyun ktime_t read_time; /* holds ktime request was queued */ 111*4882a593Smuzhiyun ktime_t write_time; /* holds ktime request was queued */ 112*4882a593Smuzhiyun ktime_t other_time; /* holds ktime request was queued */ 113*4882a593Smuzhiyun atomic_t last_read_size; /* Number of bytes issued for last read */ 114*4882a593Smuzhiyun atomic_t last_write_size; /* Number of bytes issued for last write */ 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #define ST_NBR_PARTITIONS 4 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* The tape drive descriptor */ 120*4882a593Smuzhiyun struct scsi_tape { 121*4882a593Smuzhiyun struct scsi_driver *driver; 122*4882a593Smuzhiyun struct scsi_device *device; 123*4882a593Smuzhiyun struct mutex lock; /* For serialization */ 124*4882a593Smuzhiyun struct completion wait; /* For SCSI commands */ 125*4882a593Smuzhiyun struct st_buffer *buffer; 126*4882a593Smuzhiyun int index; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* Drive characteristics */ 129*4882a593Smuzhiyun unsigned char omit_blklims; 130*4882a593Smuzhiyun unsigned char do_auto_lock; 131*4882a593Smuzhiyun unsigned char can_bsr; 132*4882a593Smuzhiyun unsigned char can_partitions; 133*4882a593Smuzhiyun unsigned char two_fm; 134*4882a593Smuzhiyun unsigned char fast_mteom; 135*4882a593Smuzhiyun unsigned char immediate; 136*4882a593Smuzhiyun unsigned char restr_dma; 137*4882a593Smuzhiyun unsigned char scsi2_logical; 138*4882a593Smuzhiyun unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ 139*4882a593Smuzhiyun unsigned char cln_mode; /* 0 = none, otherwise sense byte nbr */ 140*4882a593Smuzhiyun unsigned char cln_sense_value; 141*4882a593Smuzhiyun unsigned char cln_sense_mask; 142*4882a593Smuzhiyun unsigned char use_pf; /* Set Page Format bit in all mode selects? */ 143*4882a593Smuzhiyun unsigned char try_dio; /* try direct i/o in general? */ 144*4882a593Smuzhiyun unsigned char try_dio_now; /* try direct i/o before next close? */ 145*4882a593Smuzhiyun unsigned char c_algo; /* compression algorithm */ 146*4882a593Smuzhiyun unsigned char pos_unknown; /* after reset position unknown */ 147*4882a593Smuzhiyun unsigned char sili; /* use SILI when reading in variable b mode */ 148*4882a593Smuzhiyun unsigned char immediate_filemark; /* write filemark immediately */ 149*4882a593Smuzhiyun int tape_type; 150*4882a593Smuzhiyun int long_timeout; /* timeout for commands known to take long time */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun /* Mode characteristics */ 153*4882a593Smuzhiyun struct st_modedef modes[ST_NBR_MODES]; 154*4882a593Smuzhiyun int current_mode; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* Status variables */ 157*4882a593Smuzhiyun int partition; 158*4882a593Smuzhiyun int new_partition; 159*4882a593Smuzhiyun int nbr_partitions; /* zero until partition support enabled */ 160*4882a593Smuzhiyun struct st_partstat ps[ST_NBR_PARTITIONS]; 161*4882a593Smuzhiyun unsigned char dirty; 162*4882a593Smuzhiyun unsigned char ready; 163*4882a593Smuzhiyun unsigned char write_prot; 164*4882a593Smuzhiyun unsigned char drv_write_prot; 165*4882a593Smuzhiyun unsigned char in_use; 166*4882a593Smuzhiyun unsigned char blksize_changed; 167*4882a593Smuzhiyun unsigned char density_changed; 168*4882a593Smuzhiyun unsigned char compression_changed; 169*4882a593Smuzhiyun unsigned char drv_buffer; 170*4882a593Smuzhiyun unsigned char density; 171*4882a593Smuzhiyun unsigned char door_locked; 172*4882a593Smuzhiyun unsigned char autorew_dev; /* auto-rewind device */ 173*4882a593Smuzhiyun unsigned char rew_at_close; /* rewind necessary at close */ 174*4882a593Smuzhiyun unsigned char inited; 175*4882a593Smuzhiyun unsigned char cleaning_req; /* cleaning requested? */ 176*4882a593Smuzhiyun int block_size; 177*4882a593Smuzhiyun int min_block; 178*4882a593Smuzhiyun int max_block; 179*4882a593Smuzhiyun int recover_count; /* From tape opening */ 180*4882a593Smuzhiyun int recover_reg; /* From last status call */ 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #if DEBUG 183*4882a593Smuzhiyun unsigned char write_pending; 184*4882a593Smuzhiyun int nbr_finished; 185*4882a593Smuzhiyun int nbr_waits; 186*4882a593Smuzhiyun int nbr_requests; 187*4882a593Smuzhiyun int nbr_dio; 188*4882a593Smuzhiyun int nbr_pages; 189*4882a593Smuzhiyun unsigned char last_cmnd[6]; 190*4882a593Smuzhiyun unsigned char last_sense[16]; 191*4882a593Smuzhiyun #endif 192*4882a593Smuzhiyun struct gendisk *disk; 193*4882a593Smuzhiyun struct kref kref; 194*4882a593Smuzhiyun struct scsi_tape_stats *stats; 195*4882a593Smuzhiyun }; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* Bit masks for use_pf */ 198*4882a593Smuzhiyun #define USE_PF 1 199*4882a593Smuzhiyun #define PF_TESTED 2 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* Values of eof */ 202*4882a593Smuzhiyun #define ST_NOEOF 0 203*4882a593Smuzhiyun #define ST_FM_HIT 1 204*4882a593Smuzhiyun #define ST_FM 2 205*4882a593Smuzhiyun #define ST_EOM_OK 3 206*4882a593Smuzhiyun #define ST_EOM_ERROR 4 207*4882a593Smuzhiyun #define ST_EOD_1 5 208*4882a593Smuzhiyun #define ST_EOD_2 6 209*4882a593Smuzhiyun #define ST_EOD 7 210*4882a593Smuzhiyun /* EOD hit while reading => ST_EOD_1 => return zero => ST_EOD_2 => 211*4882a593Smuzhiyun return zero => ST_EOD, return ENOSPC */ 212*4882a593Smuzhiyun /* When writing: ST_EOM_OK == early warning found, write OK 213*4882a593Smuzhiyun ST_EOD_1 == allow trying new write after early warning 214*4882a593Smuzhiyun ST_EOM_ERROR == early warning found, not able to write all */ 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* Values of rw */ 217*4882a593Smuzhiyun #define ST_IDLE 0 218*4882a593Smuzhiyun #define ST_READING 1 219*4882a593Smuzhiyun #define ST_WRITING 2 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* Values of ready state */ 222*4882a593Smuzhiyun #define ST_READY 0 223*4882a593Smuzhiyun #define ST_NOT_READY 1 224*4882a593Smuzhiyun #define ST_NO_TAPE 2 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* Values for door lock state */ 227*4882a593Smuzhiyun #define ST_UNLOCKED 0 228*4882a593Smuzhiyun #define ST_LOCKED_EXPLICIT 1 229*4882a593Smuzhiyun #define ST_LOCKED_AUTO 2 230*4882a593Smuzhiyun #define ST_LOCK_FAILS 3 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* Positioning SCSI-commands for Tandberg, etc. drives */ 233*4882a593Smuzhiyun #define QFA_REQUEST_BLOCK 0x02 234*4882a593Smuzhiyun #define QFA_SEEK_BLOCK 0x0c 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun /* Setting the binary options */ 237*4882a593Smuzhiyun #define ST_DONT_TOUCH 0 238*4882a593Smuzhiyun #define ST_NO 1 239*4882a593Smuzhiyun #define ST_YES 2 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun #define EXTENDED_SENSE_START 18 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* Masks for some conditions in the sense data */ 244*4882a593Smuzhiyun #define SENSE_FMK 0x80 245*4882a593Smuzhiyun #define SENSE_EOM 0x40 246*4882a593Smuzhiyun #define SENSE_ILI 0x20 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun #endif 249