1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds 31da177e4SLinus Torvalds #ifndef _ST_H 41da177e4SLinus Torvalds #define _ST_H 51da177e4SLinus Torvalds 61da177e4SLinus Torvalds #include <linux/completion.h> 728f85009SMatthias Kaehlcke #include <linux/mutex.h> 8f03a5670SKai Makisara #include <linux/kref.h> 98b05b773SMike Christie #include <scsi/scsi_cmnd.h> 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds /* Descriptor for analyzed sense data */ 121da177e4SLinus Torvalds struct st_cmdstatus { 131da177e4SLinus Torvalds int midlevel_result; 141da177e4SLinus Torvalds struct scsi_sense_hdr sense_hdr; 151da177e4SLinus Torvalds int have_sense; 1640f6b36cSKai Makisara int residual; 171da177e4SLinus Torvalds u64 uremainder64; 181da177e4SLinus Torvalds u8 flags; 191da177e4SLinus Torvalds u8 remainder_valid; 201da177e4SLinus Torvalds u8 fixed_format; 211da177e4SLinus Torvalds u8 deferred; 221da177e4SLinus Torvalds }; 231da177e4SLinus Torvalds 248b05b773SMike Christie struct scsi_tape; 258b05b773SMike Christie 268b05b773SMike Christie /* scsi tape command */ 278b05b773SMike Christie struct st_request { 288b05b773SMike Christie unsigned char cmd[MAX_COMMAND_SIZE]; 298b05b773SMike Christie unsigned char sense[SCSI_SENSE_BUFFERSIZE]; 308b05b773SMike Christie int result; 318b05b773SMike Christie struct scsi_tape *stp; 328b05b773SMike Christie struct completion *waiting; 3313b53b44SFUJITA Tomonori struct bio *bio; 348b05b773SMike Christie }; 358b05b773SMike Christie 361da177e4SLinus Torvalds /* The tape buffer descriptor. */ 371da177e4SLinus Torvalds struct st_buffer { 3840f6b36cSKai Makisara unsigned char cleared; /* internal buffer cleared after open? */ 397c018a90SDavid Jeffery unsigned short do_dio; /* direct i/o set up? */ 401da177e4SLinus Torvalds int buffer_size; 411da177e4SLinus Torvalds int buffer_blocks; 421da177e4SLinus Torvalds int buffer_bytes; 431da177e4SLinus Torvalds int read_pointer; 441da177e4SLinus Torvalds int writing; 451da177e4SLinus Torvalds int syscall_result; 468b05b773SMike Christie struct st_request *last_SRpnt; 471da177e4SLinus Torvalds struct st_cmdstatus cmdstat; 48d0e1ae31SFUJITA Tomonori struct page **reserved_pages; 49c982c368SFUJITA Tomonori int reserved_page_order; 506620742fSFUJITA Tomonori struct page **mapped_pages; 51d0e1ae31SFUJITA Tomonori struct rq_map_data map_data; 521da177e4SLinus Torvalds unsigned char *b_data; 531da177e4SLinus Torvalds unsigned short use_sg; /* zero or max number of s/g segments for this adapter */ 541da177e4SLinus Torvalds unsigned short sg_segs; /* number of segments in s/g list */ 551da177e4SLinus Torvalds unsigned short frp_segs; /* number of buffer segments */ 561da177e4SLinus Torvalds }; 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds /* The tape mode definition */ 591da177e4SLinus Torvalds struct st_modedef { 601da177e4SLinus Torvalds unsigned char defined; 611da177e4SLinus Torvalds unsigned char sysv; /* SYS V semantics? */ 621da177e4SLinus Torvalds unsigned char do_async_writes; 631da177e4SLinus Torvalds unsigned char do_buffer_writes; 641da177e4SLinus Torvalds unsigned char do_read_ahead; 651da177e4SLinus Torvalds unsigned char defaults_for_writes; 661da177e4SLinus Torvalds unsigned char default_compression; /* 0 = don't touch, etc */ 671da177e4SLinus Torvalds short default_density; /* Forced density, -1 = no value */ 681da177e4SLinus Torvalds int default_blksize; /* Forced blocksize, -1 = no value */ 696c648d95SJeff Mahoney struct scsi_tape *tape; 7026898afdSJeff Mahoney struct device *devs[2]; /* Auto-rewind and non-rewind devices */ 711da177e4SLinus Torvalds struct cdev *cdevs[2]; /* Auto-rewind and non-rewind devices */ 721da177e4SLinus Torvalds }; 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds /* Number of modes can be changed by changing ST_NBR_MODE_BITS. The maximum 751da177e4SLinus Torvalds number of modes is 16 (ST_NBR_MODE_BITS 4) */ 761da177e4SLinus Torvalds #define ST_NBR_MODE_BITS 2 771da177e4SLinus Torvalds #define ST_NBR_MODES (1 << ST_NBR_MODE_BITS) 781da177e4SLinus Torvalds #define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS) 791da177e4SLinus Torvalds #define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT) 801da177e4SLinus Torvalds 816ed33a4aSJeff Mahoney #define ST_MAX_TAPES (1 << (20 - (ST_NBR_MODE_BITS + 1))) 821da177e4SLinus Torvalds #define ST_MAX_TAPE_ENTRIES (ST_MAX_TAPES << (ST_NBR_MODE_BITS + 1)) 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds /* The status related to each partition */ 851da177e4SLinus Torvalds struct st_partstat { 861da177e4SLinus Torvalds unsigned char rw; 871da177e4SLinus Torvalds unsigned char eof; 881da177e4SLinus Torvalds unsigned char at_sm; 891da177e4SLinus Torvalds unsigned char last_block_valid; 901da177e4SLinus Torvalds u32 last_block_visited; 911da177e4SLinus Torvalds int drv_block; /* The block where the drive head is */ 921da177e4SLinus Torvalds int drv_file; 931da177e4SLinus Torvalds }; 941da177e4SLinus Torvalds 9505545c92SSeymour, Shane M /* Tape statistics */ 9605545c92SSeymour, Shane M struct scsi_tape_stats { 9705545c92SSeymour, Shane M atomic64_t read_byte_cnt; /* bytes read */ 9805545c92SSeymour, Shane M atomic64_t write_byte_cnt; /* bytes written */ 9905545c92SSeymour, Shane M atomic64_t in_flight; /* Number of I/Os in flight */ 10005545c92SSeymour, Shane M atomic64_t read_cnt; /* Count of read requests */ 10105545c92SSeymour, Shane M atomic64_t write_cnt; /* Count of write requests */ 10205545c92SSeymour, Shane M atomic64_t other_cnt; /* Count of other requests either 10305545c92SSeymour, Shane M * implicit or from user space 10405545c92SSeymour, Shane M * ioctl. */ 10505545c92SSeymour, Shane M atomic64_t resid_cnt; /* Count of resid_len > 0 */ 10605545c92SSeymour, Shane M atomic64_t tot_read_time; /* ktime spent completing reads */ 10705545c92SSeymour, Shane M atomic64_t tot_write_time; /* ktime spent completing writes */ 10805545c92SSeymour, Shane M atomic64_t tot_io_time; /* ktime spent doing any I/O */ 10905545c92SSeymour, Shane M ktime_t read_time; /* holds ktime request was queued */ 11005545c92SSeymour, Shane M ktime_t write_time; /* holds ktime request was queued */ 11105545c92SSeymour, Shane M ktime_t other_time; /* holds ktime request was queued */ 11205545c92SSeymour, Shane M atomic_t last_read_size; /* Number of bytes issued for last read */ 11305545c92SSeymour, Shane M atomic_t last_write_size; /* Number of bytes issued for last write */ 11405545c92SSeymour, Shane M }; 11505545c92SSeymour, Shane M 1161da177e4SLinus Torvalds #define ST_NBR_PARTITIONS 4 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds /* The tape drive descriptor */ 1191da177e4SLinus Torvalds struct scsi_tape { 1201da177e4SLinus Torvalds struct scsi_device *device; 12128f85009SMatthias Kaehlcke struct mutex lock; /* For serialization */ 1221da177e4SLinus Torvalds struct completion wait; /* For SCSI commands */ 1231da177e4SLinus Torvalds struct st_buffer *buffer; 1246c648d95SJeff Mahoney int index; 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds /* Drive characteristics */ 1271da177e4SLinus Torvalds unsigned char omit_blklims; 1281da177e4SLinus Torvalds unsigned char do_auto_lock; 1291da177e4SLinus Torvalds unsigned char can_bsr; 1301da177e4SLinus Torvalds unsigned char can_partitions; 1311da177e4SLinus Torvalds unsigned char two_fm; 1321da177e4SLinus Torvalds unsigned char fast_mteom; 1331da177e4SLinus Torvalds unsigned char immediate; 1341da177e4SLinus Torvalds unsigned char scsi2_logical; 1351da177e4SLinus Torvalds unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ 1361da177e4SLinus Torvalds unsigned char cln_mode; /* 0 = none, otherwise sense byte nbr */ 1371da177e4SLinus Torvalds unsigned char cln_sense_value; 1381da177e4SLinus Torvalds unsigned char cln_sense_mask; 1391da177e4SLinus Torvalds unsigned char use_pf; /* Set Page Format bit in all mode selects? */ 1409abe16c6SKai Makisara unsigned char try_dio; /* try direct i/o in general? */ 1419abe16c6SKai Makisara unsigned char try_dio_now; /* try direct i/o before next close? */ 1421da177e4SLinus Torvalds unsigned char c_algo; /* compression algorithm */ 1431da177e4SLinus Torvalds unsigned char pos_unknown; /* after reset position unknown */ 14440f6b36cSKai Makisara unsigned char sili; /* use SILI when reading in variable b mode */ 145c743e44fSLee Duncan unsigned char immediate_filemark; /* write filemark immediately */ 1461da177e4SLinus Torvalds int tape_type; 1471da177e4SLinus Torvalds int long_timeout; /* timeout for commands known to take long time */ 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds /* Mode characteristics */ 1501da177e4SLinus Torvalds struct st_modedef modes[ST_NBR_MODES]; 1511da177e4SLinus Torvalds int current_mode; 1521da177e4SLinus Torvalds 1531da177e4SLinus Torvalds /* Status variables */ 1541da177e4SLinus Torvalds int partition; 1551da177e4SLinus Torvalds int new_partition; 1561da177e4SLinus Torvalds int nbr_partitions; /* zero until partition support enabled */ 1571da177e4SLinus Torvalds struct st_partstat ps[ST_NBR_PARTITIONS]; 1581da177e4SLinus Torvalds unsigned char dirty; 1591da177e4SLinus Torvalds unsigned char ready; 1601da177e4SLinus Torvalds unsigned char write_prot; 1611da177e4SLinus Torvalds unsigned char drv_write_prot; 1621da177e4SLinus Torvalds unsigned char in_use; 1631da177e4SLinus Torvalds unsigned char blksize_changed; 1641da177e4SLinus Torvalds unsigned char density_changed; 1651da177e4SLinus Torvalds unsigned char compression_changed; 1661da177e4SLinus Torvalds unsigned char drv_buffer; 1671da177e4SLinus Torvalds unsigned char density; 1681da177e4SLinus Torvalds unsigned char door_locked; 1691da177e4SLinus Torvalds unsigned char autorew_dev; /* auto-rewind device */ 1701da177e4SLinus Torvalds unsigned char rew_at_close; /* rewind necessary at close */ 1711da177e4SLinus Torvalds unsigned char inited; 1721da177e4SLinus Torvalds unsigned char cleaning_req; /* cleaning requested? */ 173*7bfa83eeSKai Mäkisara unsigned char first_tur; /* first TEST UNIT READY */ 1741da177e4SLinus Torvalds int block_size; 1751da177e4SLinus Torvalds int min_block; 1761da177e4SLinus Torvalds int max_block; 1771da177e4SLinus Torvalds int recover_count; /* From tape opening */ 1781da177e4SLinus Torvalds int recover_reg; /* From last status call */ 1791da177e4SLinus Torvalds 1801da177e4SLinus Torvalds #if DEBUG 1811da177e4SLinus Torvalds unsigned char write_pending; 1821da177e4SLinus Torvalds int nbr_finished; 1831da177e4SLinus Torvalds int nbr_waits; 1841da177e4SLinus Torvalds int nbr_requests; 1851da177e4SLinus Torvalds int nbr_dio; 1861da177e4SLinus Torvalds int nbr_pages; 1871da177e4SLinus Torvalds unsigned char last_cmnd[6]; 1881da177e4SLinus Torvalds unsigned char last_sense[16]; 1891da177e4SLinus Torvalds #endif 19045938335SChristoph Hellwig char name[DISK_NAME_LEN]; 191f03a5670SKai Makisara struct kref kref; 19205545c92SSeymour, Shane M struct scsi_tape_stats *stats; 1931da177e4SLinus Torvalds }; 1941da177e4SLinus Torvalds 1951da177e4SLinus Torvalds /* Bit masks for use_pf */ 1961da177e4SLinus Torvalds #define USE_PF 1 1971da177e4SLinus Torvalds #define PF_TESTED 2 1981da177e4SLinus Torvalds 1991da177e4SLinus Torvalds /* Values of eof */ 2001da177e4SLinus Torvalds #define ST_NOEOF 0 2011da177e4SLinus Torvalds #define ST_FM_HIT 1 2021da177e4SLinus Torvalds #define ST_FM 2 2031da177e4SLinus Torvalds #define ST_EOM_OK 3 2041da177e4SLinus Torvalds #define ST_EOM_ERROR 4 2051da177e4SLinus Torvalds #define ST_EOD_1 5 2061da177e4SLinus Torvalds #define ST_EOD_2 6 2071da177e4SLinus Torvalds #define ST_EOD 7 2081da177e4SLinus Torvalds /* EOD hit while reading => ST_EOD_1 => return zero => ST_EOD_2 => 2091da177e4SLinus Torvalds return zero => ST_EOD, return ENOSPC */ 2101da177e4SLinus Torvalds /* When writing: ST_EOM_OK == early warning found, write OK 2111da177e4SLinus Torvalds ST_EOD_1 == allow trying new write after early warning 2121da177e4SLinus Torvalds ST_EOM_ERROR == early warning found, not able to write all */ 2131da177e4SLinus Torvalds 2141da177e4SLinus Torvalds /* Values of rw */ 2151da177e4SLinus Torvalds #define ST_IDLE 0 2161da177e4SLinus Torvalds #define ST_READING 1 2171da177e4SLinus Torvalds #define ST_WRITING 2 2181da177e4SLinus Torvalds 2191da177e4SLinus Torvalds /* Values of ready state */ 2201da177e4SLinus Torvalds #define ST_READY 0 2211da177e4SLinus Torvalds #define ST_NOT_READY 1 2221da177e4SLinus Torvalds #define ST_NO_TAPE 2 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds /* Values for door lock state */ 2251da177e4SLinus Torvalds #define ST_UNLOCKED 0 2261da177e4SLinus Torvalds #define ST_LOCKED_EXPLICIT 1 2271da177e4SLinus Torvalds #define ST_LOCKED_AUTO 2 2281da177e4SLinus Torvalds #define ST_LOCK_FAILS 3 2291da177e4SLinus Torvalds 2301da177e4SLinus Torvalds /* Positioning SCSI-commands for Tandberg, etc. drives */ 2311da177e4SLinus Torvalds #define QFA_REQUEST_BLOCK 0x02 2321da177e4SLinus Torvalds #define QFA_SEEK_BLOCK 0x0c 2331da177e4SLinus Torvalds 2341da177e4SLinus Torvalds /* Setting the binary options */ 2351da177e4SLinus Torvalds #define ST_DONT_TOUCH 0 2361da177e4SLinus Torvalds #define ST_NO 1 2371da177e4SLinus Torvalds #define ST_YES 2 2381da177e4SLinus Torvalds 2391da177e4SLinus Torvalds #define EXTENDED_SENSE_START 18 2401da177e4SLinus Torvalds 2411da177e4SLinus Torvalds /* Masks for some conditions in the sense data */ 2421da177e4SLinus Torvalds #define SENSE_FMK 0x80 2431da177e4SLinus Torvalds #define SENSE_EOM 0x40 2441da177e4SLinus Torvalds #define SENSE_ILI 0x20 2451da177e4SLinus Torvalds 2461da177e4SLinus Torvalds #endif 247