diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
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 @@ | |||
1 | |||
2 | #ifndef _ST_H | ||
3 | #define _ST_H | ||
4 | |||
5 | #include <linux/completion.h> | ||
6 | |||
7 | |||
8 | /* Descriptor for analyzed sense data */ | ||
9 | struct st_cmdstatus { | ||
10 | int midlevel_result; | ||
11 | struct scsi_sense_hdr sense_hdr; | ||
12 | int have_sense; | ||
13 | u64 uremainder64; | ||
14 | u8 flags; | ||
15 | u8 remainder_valid; | ||
16 | u8 fixed_format; | ||
17 | u8 deferred; | ||
18 | }; | ||
19 | |||
20 | /* The tape buffer descriptor. */ | ||
21 | struct st_buffer { | ||
22 | unsigned char in_use; | ||
23 | unsigned char dma; /* DMA-able buffer */ | ||
24 | unsigned char do_dio; /* direct i/o set up? */ | ||
25 | int buffer_size; | ||
26 | int buffer_blocks; | ||
27 | int buffer_bytes; | ||
28 | int read_pointer; | ||
29 | int writing; | ||
30 | int syscall_result; | ||
31 | struct scsi_request *last_SRpnt; | ||
32 | struct st_cmdstatus cmdstat; | ||
33 | unsigned char *b_data; | ||
34 | unsigned short use_sg; /* zero or max number of s/g segments for this adapter */ | ||
35 | unsigned short sg_segs; /* number of segments in s/g list */ | ||
36 | unsigned short orig_frp_segs; /* number of segments allocated at first try */ | ||
37 | unsigned short frp_segs; /* number of buffer segments */ | ||
38 | unsigned int frp_sg_current; /* driver buffer length currently in s/g list */ | ||
39 | struct st_buf_fragment *frp; /* the allocated buffer fragment list */ | ||
40 | struct scatterlist sg[1]; /* MUST BE last item */ | ||
41 | }; | ||
42 | |||
43 | /* The tape buffer fragment descriptor */ | ||
44 | struct st_buf_fragment { | ||
45 | struct page *page; | ||
46 | unsigned int length; | ||
47 | }; | ||
48 | |||
49 | /* The tape mode definition */ | ||
50 | struct st_modedef { | ||
51 | unsigned char defined; | ||
52 | unsigned char sysv; /* SYS V semantics? */ | ||
53 | unsigned char do_async_writes; | ||
54 | unsigned char do_buffer_writes; | ||
55 | unsigned char do_read_ahead; | ||
56 | unsigned char defaults_for_writes; | ||
57 | unsigned char default_compression; /* 0 = don't touch, etc */ | ||
58 | short default_density; /* Forced density, -1 = no value */ | ||
59 | int default_blksize; /* Forced blocksize, -1 = no value */ | ||
60 | struct cdev *cdevs[2]; /* Auto-rewind and non-rewind devices */ | ||
61 | }; | ||
62 | |||
63 | /* Number of modes can be changed by changing ST_NBR_MODE_BITS. The maximum | ||
64 | number of modes is 16 (ST_NBR_MODE_BITS 4) */ | ||
65 | #define ST_NBR_MODE_BITS 2 | ||
66 | #define ST_NBR_MODES (1 << ST_NBR_MODE_BITS) | ||
67 | #define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS) | ||
68 | #define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT) | ||
69 | |||
70 | #define ST_MAX_TAPES 128 | ||
71 | #define ST_MAX_TAPE_ENTRIES (ST_MAX_TAPES << (ST_NBR_MODE_BITS + 1)) | ||
72 | |||
73 | /* The status related to each partition */ | ||
74 | struct st_partstat { | ||
75 | unsigned char rw; | ||
76 | unsigned char eof; | ||
77 | unsigned char at_sm; | ||
78 | unsigned char last_block_valid; | ||
79 | u32 last_block_visited; | ||
80 | int drv_block; /* The block where the drive head is */ | ||
81 | int drv_file; | ||
82 | }; | ||
83 | |||
84 | #define ST_NBR_PARTITIONS 4 | ||
85 | |||
86 | /* The tape drive descriptor */ | ||
87 | struct scsi_tape { | ||
88 | struct scsi_driver *driver; | ||
89 | struct scsi_device *device; | ||
90 | struct semaphore lock; /* For serialization */ | ||
91 | struct completion wait; /* For SCSI commands */ | ||
92 | struct st_buffer *buffer; | ||
93 | |||
94 | /* Drive characteristics */ | ||
95 | unsigned char omit_blklims; | ||
96 | unsigned char do_auto_lock; | ||
97 | unsigned char can_bsr; | ||
98 | unsigned char can_partitions; | ||
99 | unsigned char two_fm; | ||
100 | unsigned char fast_mteom; | ||
101 | unsigned char immediate; | ||
102 | unsigned char restr_dma; | ||
103 | unsigned char scsi2_logical; | ||
104 | unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ | ||
105 | unsigned char cln_mode; /* 0 = none, otherwise sense byte nbr */ | ||
106 | unsigned char cln_sense_value; | ||
107 | unsigned char cln_sense_mask; | ||
108 | unsigned char use_pf; /* Set Page Format bit in all mode selects? */ | ||
109 | unsigned char try_dio; /* try direct i/o? */ | ||
110 | unsigned char c_algo; /* compression algorithm */ | ||
111 | unsigned char pos_unknown; /* after reset position unknown */ | ||
112 | int tape_type; | ||
113 | int long_timeout; /* timeout for commands known to take long time */ | ||
114 | |||
115 | unsigned long max_pfn; /* the maximum page number reachable by the HBA */ | ||
116 | |||
117 | /* Mode characteristics */ | ||
118 | struct st_modedef modes[ST_NBR_MODES]; | ||
119 | int current_mode; | ||
120 | |||
121 | /* Status variables */ | ||
122 | int partition; | ||
123 | int new_partition; | ||
124 | int nbr_partitions; /* zero until partition support enabled */ | ||
125 | struct st_partstat ps[ST_NBR_PARTITIONS]; | ||
126 | unsigned char dirty; | ||
127 | unsigned char ready; | ||
128 | unsigned char write_prot; | ||
129 | unsigned char drv_write_prot; | ||
130 | unsigned char in_use; | ||
131 | unsigned char blksize_changed; | ||
132 | unsigned char density_changed; | ||
133 | unsigned char compression_changed; | ||
134 | unsigned char drv_buffer; | ||
135 | unsigned char density; | ||
136 | unsigned char door_locked; | ||
137 | unsigned char autorew_dev; /* auto-rewind device */ | ||
138 | unsigned char rew_at_close; /* rewind necessary at close */ | ||
139 | unsigned char inited; | ||
140 | unsigned char cleaning_req; /* cleaning requested? */ | ||
141 | int block_size; | ||
142 | int min_block; | ||
143 | int max_block; | ||
144 | int recover_count; /* From tape opening */ | ||
145 | int recover_reg; /* From last status call */ | ||
146 | |||
147 | #if DEBUG | ||
148 | unsigned char write_pending; | ||
149 | int nbr_finished; | ||
150 | int nbr_waits; | ||
151 | int nbr_requests; | ||
152 | int nbr_dio; | ||
153 | int nbr_pages; | ||
154 | int nbr_combinable; | ||
155 | unsigned char last_cmnd[6]; | ||
156 | unsigned char last_sense[16]; | ||
157 | #endif | ||
158 | struct gendisk *disk; | ||
159 | }; | ||
160 | |||
161 | /* Bit masks for use_pf */ | ||
162 | #define USE_PF 1 | ||
163 | #define PF_TESTED 2 | ||
164 | |||
165 | /* Values of eof */ | ||
166 | #define ST_NOEOF 0 | ||
167 | #define ST_FM_HIT 1 | ||
168 | #define ST_FM 2 | ||
169 | #define ST_EOM_OK 3 | ||
170 | #define ST_EOM_ERROR 4 | ||
171 | #define ST_EOD_1 5 | ||
172 | #define ST_EOD_2 6 | ||
173 | #define ST_EOD 7 | ||
174 | /* EOD hit while reading => ST_EOD_1 => return zero => ST_EOD_2 => | ||
175 | return zero => ST_EOD, return ENOSPC */ | ||
176 | /* When writing: ST_EOM_OK == early warning found, write OK | ||
177 | ST_EOD_1 == allow trying new write after early warning | ||
178 | ST_EOM_ERROR == early warning found, not able to write all */ | ||
179 | |||
180 | /* Values of rw */ | ||
181 | #define ST_IDLE 0 | ||
182 | #define ST_READING 1 | ||
183 | #define ST_WRITING 2 | ||
184 | |||
185 | /* Values of ready state */ | ||
186 | #define ST_READY 0 | ||
187 | #define ST_NOT_READY 1 | ||
188 | #define ST_NO_TAPE 2 | ||
189 | |||
190 | /* Values for door lock state */ | ||
191 | #define ST_UNLOCKED 0 | ||
192 | #define ST_LOCKED_EXPLICIT 1 | ||
193 | #define ST_LOCKED_AUTO 2 | ||
194 | #define ST_LOCK_FAILS 3 | ||
195 | |||
196 | /* Positioning SCSI-commands for Tandberg, etc. drives */ | ||
197 | #define QFA_REQUEST_BLOCK 0x02 | ||
198 | #define QFA_SEEK_BLOCK 0x0c | ||
199 | |||
200 | /* Setting the binary options */ | ||
201 | #define ST_DONT_TOUCH 0 | ||
202 | #define ST_NO 1 | ||
203 | #define ST_YES 2 | ||
204 | |||
205 | #define EXTENDED_SENSE_START 18 | ||
206 | |||
207 | /* Masks for some conditions in the sense data */ | ||
208 | #define SENSE_FMK 0x80 | ||
209 | #define SENSE_EOM 0x40 | ||
210 | #define SENSE_ILI 0x20 | ||
211 | |||
212 | #endif | ||