diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/scsi/st.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/scsi/st.h')
-rw-r--r-- | drivers/scsi/st.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h new file mode 100644 index 000000000000..061da111398e --- /dev/null +++ b/drivers/scsi/st.h @@ -0,0 +1,212 @@ + +#ifndef _ST_H +#define _ST_H + +#include <linux/completion.h> + + +/* Descriptor for analyzed sense data */ +struct st_cmdstatus { + int midlevel_result; + struct scsi_sense_hdr sense_hdr; + int have_sense; + u64 uremainder64; + u8 flags; + u8 remainder_valid; + u8 fixed_format; + u8 deferred; +}; + +/* The tape buffer descriptor. */ +struct st_buffer { + unsigned char in_use; + unsigned char dma; /* DMA-able buffer */ + unsigned char do_dio; /* direct i/o set up? */ + int buffer_size; + int buffer_blocks; + int buffer_bytes; + int read_pointer; + int writing; + int syscall_result; + struct scsi_request *last_SRpnt; + struct st_cmdstatus cmdstat; + unsigned char *b_data; + unsigned short use_sg; /* zero or max number of s/g segments for this adapter */ + unsigned short sg_segs; /* number of segments in s/g list */ + unsigned short orig_frp_segs; /* number of segments allocated at first try */ + unsigned short frp_segs; /* number of buffer segments */ + unsigned int frp_sg_current; /* driver buffer length currently in s/g list */ + struct st_buf_fragment *frp; /* the allocated buffer fragment list */ + struct scatterlist sg[1]; /* MUST BE last item */ +}; + +/* The tape buffer fragment descriptor */ +struct st_buf_fragment { + struct page *page; + unsigned int length; +}; + +/* The tape mode definition */ +struct st_modedef { + unsigned char defined; + unsigned char sysv; /* SYS V semantics? */ + unsigned char do_async_writes; + unsigned char do_buffer_writes; + unsigned char do_read_ahead; + unsigned char defaults_for_writes; + unsigned char default_compression; /* 0 = don't touch, etc */ + short default_density; /* Forced density, -1 = no value */ + int default_blksize; /* Forced blocksize, -1 = no value */ + struct cdev *cdevs[2]; /* Auto-rewind and non-rewind devices */ +}; + +/* Number of modes can be changed by changing ST_NBR_MODE_BITS. The maximum + number of modes is 16 (ST_NBR_MODE_BITS 4) */ +#define ST_NBR_MODE_BITS 2 +#define ST_NBR_MODES (1 << ST_NBR_MODE_BITS) +#define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS) +#define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT) + +#define ST_MAX_TAPES 128 +#define ST_MAX_TAPE_ENTRIES (ST_MAX_TAPES << (ST_NBR_MODE_BITS + 1)) + +/* The status related to each partition */ +struct st_partstat { + unsigned char rw; + unsigned char eof; + unsigned char at_sm; + unsigned char last_block_valid; + u32 last_block_visited; + int drv_block; /* The block where the drive head is */ + int drv_file; +}; + +#define ST_NBR_PARTITIONS 4 + +/* The tape drive descriptor */ +struct scsi_tape { + struct scsi_driver *driver; + struct scsi_device *device; + struct semaphore lock; /* For serialization */ + struct completion wait; /* For SCSI commands */ + struct st_buffer *buffer; + + /* Drive characteristics */ + unsigned char omit_blklims; + unsigned char do_auto_lock; + unsigned char can_bsr; + unsigned char can_partitions; + unsigned char two_fm; + unsigned char fast_mteom; + unsigned char immediate; + unsigned char restr_dma; + unsigned char scsi2_logical; + unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ + unsigned char cln_mode; /* 0 = none, otherwise sense byte nbr */ + unsigned char cln_sense_value; + unsigned char cln_sense_mask; + unsigned char use_pf; /* Set Page Format bit in all mode selects? */ + unsigned char try_dio; /* try direct i/o? */ + unsigned char c_algo; /* compression algorithm */ + unsigned char pos_unknown; /* after reset position unknown */ + int tape_type; + int long_timeout; /* timeout for commands known to take long time */ + + unsigned long max_pfn; /* the maximum page number reachable by the HBA */ + + /* Mode characteristics */ + struct st_modedef modes[ST_NBR_MODES]; + int current_mode; + + /* Status variables */ + int partition; + int new_partition; + int nbr_partitions; /* zero until partition support enabled */ + struct st_partstat ps[ST_NBR_PARTITIONS]; + unsigned char dirty; + unsigned char ready; + unsigned char write_prot; + unsigned char drv_write_prot; + unsigned char in_use; + unsigned char blksize_changed; + unsigned char density_changed; + unsigned char compression_changed; + unsigned char drv_buffer; + unsigned char density; + unsigned char door_locked; + unsigned char autorew_dev; /* auto-rewind device */ + unsigned char rew_at_close; /* rewind necessary at close */ + unsigned char inited; + unsigned char cleaning_req; /* cleaning requested? */ + int block_size; + int min_block; + int max_block; + int recover_count; /* From tape opening */ + int recover_reg; /* From last status call */ + +#if DEBUG + unsigned char write_pending; + int nbr_finished; + int nbr_waits; + int nbr_requests; + int nbr_dio; + int nbr_pages; + int nbr_combinable; + unsigned char last_cmnd[6]; + unsigned char last_sense[16]; +#endif + struct gendisk *disk; +}; + +/* Bit masks for use_pf */ +#define USE_PF 1 +#define PF_TESTED 2 + +/* Values of eof */ +#define ST_NOEOF 0 +#define ST_FM_HIT 1 +#define ST_FM 2 +#define ST_EOM_OK 3 +#define ST_EOM_ERROR 4 +#define ST_EOD_1 5 +#define ST_EOD_2 6 +#define ST_EOD 7 +/* EOD hit while reading => ST_EOD_1 => return zero => ST_EOD_2 => + return zero => ST_EOD, return ENOSPC */ +/* When writing: ST_EOM_OK == early warning found, write OK + ST_EOD_1 == allow trying new write after early warning + ST_EOM_ERROR == early warning found, not able to write all */ + +/* Values of rw */ +#define ST_IDLE 0 +#define ST_READING 1 +#define ST_WRITING 2 + +/* Values of ready state */ +#define ST_READY 0 +#define ST_NOT_READY 1 +#define ST_NO_TAPE 2 + +/* Values for door lock state */ +#define ST_UNLOCKED 0 +#define ST_LOCKED_EXPLICIT 1 +#define ST_LOCKED_AUTO 2 +#define ST_LOCK_FAILS 3 + +/* Positioning SCSI-commands for Tandberg, etc. drives */ +#define QFA_REQUEST_BLOCK 0x02 +#define QFA_SEEK_BLOCK 0x0c + +/* Setting the binary options */ +#define ST_DONT_TOUCH 0 +#define ST_NO 1 +#define ST_YES 2 + +#define EXTENDED_SENSE_START 18 + +/* Masks for some conditions in the sense data */ +#define SENSE_FMK 0x80 +#define SENSE_EOM 0x40 +#define SENSE_ILI 0x20 + +#endif |