blob: 2cc7b5a1606a089b0346d0e8d53a914929bdde8e [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * $Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
3 */
4
5#include <asm/byteorder.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07006#include <linux/completion.h>
7
8/* FIXME - rename and use the following two types or delete them!
9 * and the types really should go to st.h anyway...
10 * INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
11 */
12typedef struct {
13 unsigned device_type :5; /* Peripheral Device Type */
14 unsigned reserved0_765 :3; /* Peripheral Qualifier - Reserved */
15 unsigned reserved1_6t0 :7; /* Reserved */
16 unsigned rmb :1; /* Removable Medium Bit */
17 unsigned ansi_version :3; /* ANSI Version */
18 unsigned ecma_version :3; /* ECMA Version */
19 unsigned iso_version :2; /* ISO Version */
20 unsigned response_format :4; /* Response Data Format */
21 unsigned reserved3_45 :2; /* Reserved */
22 unsigned reserved3_6 :1; /* TrmIOP - Reserved */
23 unsigned reserved3_7 :1; /* AENC - Reserved */
24 u8 additional_length; /* Additional Length (total_length-4) */
25 u8 rsv5, rsv6, rsv7; /* Reserved */
26 u8 vendor_id[8]; /* Vendor Identification */
27 u8 product_id[16]; /* Product Identification */
28 u8 revision_level[4]; /* Revision Level */
29 u8 vendor_specific[20]; /* Vendor Specific - Optional */
30 u8 reserved56t95[40]; /* Reserved - Optional */
31 /* Additional information may be returned */
32} idetape_inquiry_result_t;
33
34/*
35 * READ POSITION packet command - Data Format (From Table 6-57)
36 */
37typedef struct {
38 unsigned reserved0_10 :2; /* Reserved */
39 unsigned bpu :1; /* Block Position Unknown */
40 unsigned reserved0_543 :3; /* Reserved */
41 unsigned eop :1; /* End Of Partition */
42 unsigned bop :1; /* Beginning Of Partition */
43 u8 partition; /* Partition Number */
44 u8 reserved2, reserved3; /* Reserved */
45 u32 first_block; /* First Block Location */
46 u32 last_block; /* Last Block Location (Optional) */
47 u8 reserved12; /* Reserved */
48 u8 blocks_in_buffer[3]; /* Blocks In Buffer - (Optional) */
49 u32 bytes_in_buffer; /* Bytes In Buffer (Optional) */
50} idetape_read_position_result_t;
51
52/*
53 * Follows structures which are related to the SELECT SENSE / MODE SENSE
54 * packet commands.
55 */
56#define COMPRESSION_PAGE 0x0f
57#define COMPRESSION_PAGE_LENGTH 16
58
59#define CAPABILITIES_PAGE 0x2a
60#define CAPABILITIES_PAGE_LENGTH 20
61
62#define TAPE_PARAMTR_PAGE 0x2b
63#define TAPE_PARAMTR_PAGE_LENGTH 16
64
65#define NUMBER_RETRIES_PAGE 0x2f
66#define NUMBER_RETRIES_PAGE_LENGTH 4
67
68#define BLOCK_SIZE_PAGE 0x30
69#define BLOCK_SIZE_PAGE_LENGTH 4
70
71#define BUFFER_FILLING_PAGE 0x33
72#define BUFFER_FILLING_PAGE_LENGTH 4
73
74#define VENDOR_IDENT_PAGE 0x36
75#define VENDOR_IDENT_PAGE_LENGTH 8
76
77#define LOCATE_STATUS_PAGE 0x37
78#define LOCATE_STATUS_PAGE_LENGTH 0
79
80#define MODE_HEADER_LENGTH 4
81
82
83/*
84 * REQUEST SENSE packet command result - Data Format.
85 */
86typedef struct {
87 unsigned error_code :7; /* Current of deferred errors */
88 unsigned valid :1; /* The information field conforms to QIC-157C */
89 u8 reserved1 :8; /* Segment Number - Reserved */
90 unsigned sense_key :4; /* Sense Key */
91 unsigned reserved2_4 :1; /* Reserved */
92 unsigned ili :1; /* Incorrect Length Indicator */
93 unsigned eom :1; /* End Of Medium */
94 unsigned filemark :1; /* Filemark */
95 u32 information __attribute__ ((packed));
96 u8 asl; /* Additional sense length (n-7) */
97 u32 command_specific; /* Additional command specific information */
98 u8 asc; /* Additional Sense Code */
99 u8 ascq; /* Additional Sense Code Qualifier */
100 u8 replaceable_unit_code; /* Field Replaceable Unit Code */
101 unsigned sk_specific1 :7; /* Sense Key Specific */
102 unsigned sksv :1; /* Sense Key Specific information is valid */
103 u8 sk_specific2; /* Sense Key Specific */
104 u8 sk_specific3; /* Sense Key Specific */
105 u8 pad[2]; /* Padding to 20 bytes */
106} idetape_request_sense_result_t;
107
108/*
109 * Mode Parameter Header for the MODE SENSE packet command
110 */
111typedef struct {
112 u8 mode_data_length; /* Length of the following data transfer */
113 u8 medium_type; /* Medium Type */
114 u8 dsp; /* Device Specific Parameter */
115 u8 bdl; /* Block Descriptor Length */
116} osst_mode_parameter_header_t;
117
118/*
119 * Mode Parameter Block Descriptor the MODE SENSE packet command
120 *
121 * Support for block descriptors is optional.
122 */
123typedef struct {
124 u8 density_code; /* Medium density code */
125 u8 blocks[3]; /* Number of blocks */
126 u8 reserved4; /* Reserved */
127 u8 length[3]; /* Block Length */
128} osst_parameter_block_descriptor_t;
129
130/*
131 * The Data Compression Page, as returned by the MODE SENSE packet command.
132 */
133typedef struct {
134#if defined(__BIG_ENDIAN_BITFIELD)
135 unsigned ps :1;
136 unsigned reserved0 :1; /* Reserved */
137 unsigned page_code :6; /* Page Code - Should be 0xf */
138#elif defined(__LITTLE_ENDIAN_BITFIELD)
139 unsigned page_code :6; /* Page Code - Should be 0xf */
140 unsigned reserved0 :1; /* Reserved */
141 unsigned ps :1;
142#else
143#error "Please fix <asm/byteorder.h>"
144#endif
145 u8 page_length; /* Page Length - Should be 14 */
146#if defined(__BIG_ENDIAN_BITFIELD)
147 unsigned dce :1; /* Data Compression Enable */
148 unsigned dcc :1; /* Data Compression Capable */
149 unsigned reserved2 :6; /* Reserved */
150#elif defined(__LITTLE_ENDIAN_BITFIELD)
151 unsigned reserved2 :6; /* Reserved */
152 unsigned dcc :1; /* Data Compression Capable */
153 unsigned dce :1; /* Data Compression Enable */
154#else
155#error "Please fix <asm/byteorder.h>"
156#endif
157#if defined(__BIG_ENDIAN_BITFIELD)
158 unsigned dde :1; /* Data Decompression Enable */
159 unsigned red :2; /* Report Exception on Decompression */
160 unsigned reserved3 :5; /* Reserved */
161#elif defined(__LITTLE_ENDIAN_BITFIELD)
162 unsigned reserved3 :5; /* Reserved */
163 unsigned red :2; /* Report Exception on Decompression */
164 unsigned dde :1; /* Data Decompression Enable */
165#else
166#error "Please fix <asm/byteorder.h>"
167#endif
168 u32 ca; /* Compression Algorithm */
169 u32 da; /* Decompression Algorithm */
170 u8 reserved[4]; /* Reserved */
171} osst_data_compression_page_t;
172
173/*
174 * The Medium Partition Page, as returned by the MODE SENSE packet command.
175 */
176typedef struct {
177#if defined(__BIG_ENDIAN_BITFIELD)
178 unsigned ps :1;
179 unsigned reserved1_6 :1; /* Reserved */
180 unsigned page_code :6; /* Page Code - Should be 0x11 */
181#elif defined(__LITTLE_ENDIAN_BITFIELD)
182 unsigned page_code :6; /* Page Code - Should be 0x11 */
183 unsigned reserved1_6 :1; /* Reserved */
184 unsigned ps :1;
185#else
186#error "Please fix <asm/byteorder.h>"
187#endif
188 u8 page_length; /* Page Length - Should be 6 */
189 u8 map; /* Maximum Additional Partitions - Should be 0 */
190 u8 apd; /* Additional Partitions Defined - Should be 0 */
191#if defined(__BIG_ENDIAN_BITFIELD)
192 unsigned fdp :1; /* Fixed Data Partitions */
193 unsigned sdp :1; /* Should be 0 */
194 unsigned idp :1; /* Should be 0 */
195 unsigned psum :2; /* Should be 0 */
196 unsigned reserved4_012 :3; /* Reserved */
197#elif defined(__LITTLE_ENDIAN_BITFIELD)
198 unsigned reserved4_012 :3; /* Reserved */
199 unsigned psum :2; /* Should be 0 */
200 unsigned idp :1; /* Should be 0 */
201 unsigned sdp :1; /* Should be 0 */
202 unsigned fdp :1; /* Fixed Data Partitions */
203#else
204#error "Please fix <asm/byteorder.h>"
205#endif
206 u8 mfr; /* Medium Format Recognition */
207 u8 reserved[2]; /* Reserved */
208} osst_medium_partition_page_t;
209
210/*
211 * Capabilities and Mechanical Status Page
212 */
213typedef struct {
214#if defined(__BIG_ENDIAN_BITFIELD)
215 unsigned reserved1_67 :2;
216 unsigned page_code :6; /* Page code - Should be 0x2a */
217#elif defined(__LITTLE_ENDIAN_BITFIELD)
218 unsigned page_code :6; /* Page code - Should be 0x2a */
219 unsigned reserved1_67 :2;
220#else
221#error "Please fix <asm/byteorder.h>"
222#endif
223 u8 page_length; /* Page Length - Should be 0x12 */
224 u8 reserved2, reserved3;
225#if defined(__BIG_ENDIAN_BITFIELD)
226 unsigned reserved4_67 :2;
227 unsigned sprev :1; /* Supports SPACE in the reverse direction */
228 unsigned reserved4_1234 :4;
229 unsigned ro :1; /* Read Only Mode */
230#elif defined(__LITTLE_ENDIAN_BITFIELD)
231 unsigned ro :1; /* Read Only Mode */
232 unsigned reserved4_1234 :4;
233 unsigned sprev :1; /* Supports SPACE in the reverse direction */
234 unsigned reserved4_67 :2;
235#else
236#error "Please fix <asm/byteorder.h>"
237#endif
238#if defined(__BIG_ENDIAN_BITFIELD)
239 unsigned reserved5_67 :2;
240 unsigned qfa :1; /* Supports the QFA two partition formats */
241 unsigned reserved5_4 :1;
242 unsigned efmt :1; /* Supports ERASE command initiated formatting */
243 unsigned reserved5_012 :3;
244#elif defined(__LITTLE_ENDIAN_BITFIELD)
245 unsigned reserved5_012 :3;
246 unsigned efmt :1; /* Supports ERASE command initiated formatting */
247 unsigned reserved5_4 :1;
248 unsigned qfa :1; /* Supports the QFA two partition formats */
249 unsigned reserved5_67 :2;
250#else
251#error "Please fix <asm/byteorder.h>"
252#endif
253#if defined(__BIG_ENDIAN_BITFIELD)
254 unsigned cmprs :1; /* Supports data compression */
255 unsigned ecc :1; /* Supports error correction */
256 unsigned reserved6_45 :2; /* Reserved */
257 unsigned eject :1; /* The device can eject the volume */
258 unsigned prevent :1; /* The device defaults in the prevent state after power up */
259 unsigned locked :1; /* The volume is locked */
260 unsigned lock :1; /* Supports locking the volume */
261#elif defined(__LITTLE_ENDIAN_BITFIELD)
262 unsigned lock :1; /* Supports locking the volume */
263 unsigned locked :1; /* The volume is locked */
264 unsigned prevent :1; /* The device defaults in the prevent state after power up */
265 unsigned eject :1; /* The device can eject the volume */
266 unsigned reserved6_45 :2; /* Reserved */
267 unsigned ecc :1; /* Supports error correction */
268 unsigned cmprs :1; /* Supports data compression */
269#else
270#error "Please fix <asm/byteorder.h>"
271#endif
272#if defined(__BIG_ENDIAN_BITFIELD)
273 unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
274 /* transfers for slow buffer memory ??? */
275 /* Also 32768 block size in some cases */
276 unsigned reserved7_3_6 :4;
277 unsigned blk1024 :1; /* Supports 1024 bytes block size */
278 unsigned blk512 :1; /* Supports 512 bytes block size */
279 unsigned reserved7_0 :1;
280#elif defined(__LITTLE_ENDIAN_BITFIELD)
281 unsigned reserved7_0 :1;
282 unsigned blk512 :1; /* Supports 512 bytes block size */
283 unsigned blk1024 :1; /* Supports 1024 bytes block size */
284 unsigned reserved7_3_6 :4;
285 unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
286 /* transfers for slow buffer memory ??? */
287 /* Also 32768 block size in some cases */
288#else
289#error "Please fix <asm/byteorder.h>"
290#endif
Al Viro95389b82007-02-09 16:39:45 +0000291 __be16 max_speed; /* Maximum speed supported in KBps */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292 u8 reserved10, reserved11;
Al Viro95389b82007-02-09 16:39:45 +0000293 __be16 ctl; /* Continuous Transfer Limit in blocks */
294 __be16 speed; /* Current Speed, in KBps */
295 __be16 buffer_size; /* Buffer Size, in 512 bytes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 u8 reserved18, reserved19;
297} osst_capabilities_page_t;
298
299/*
300 * Block Size Page
301 */
302typedef struct {
303#if defined(__BIG_ENDIAN_BITFIELD)
304 unsigned ps :1;
305 unsigned reserved1_6 :1;
306 unsigned page_code :6; /* Page code - Should be 0x30 */
307#elif defined(__LITTLE_ENDIAN_BITFIELD)
308 unsigned page_code :6; /* Page code - Should be 0x30 */
309 unsigned reserved1_6 :1;
310 unsigned ps :1;
311#else
312#error "Please fix <asm/byteorder.h>"
313#endif
314 u8 page_length; /* Page Length - Should be 2 */
315 u8 reserved2;
316#if defined(__BIG_ENDIAN_BITFIELD)
317 unsigned one :1;
318 unsigned reserved2_6 :1;
319 unsigned record32_5 :1;
320 unsigned record32 :1;
321 unsigned reserved2_23 :2;
322 unsigned play32_5 :1;
323 unsigned play32 :1;
324#elif defined(__LITTLE_ENDIAN_BITFIELD)
325 unsigned play32 :1;
326 unsigned play32_5 :1;
327 unsigned reserved2_23 :2;
328 unsigned record32 :1;
329 unsigned record32_5 :1;
330 unsigned reserved2_6 :1;
331 unsigned one :1;
332#else
333#error "Please fix <asm/byteorder.h>"
334#endif
335} osst_block_size_page_t;
336
337/*
338 * Tape Parameters Page
339 */
340typedef struct {
341#if defined(__BIG_ENDIAN_BITFIELD)
342 unsigned ps :1;
343 unsigned reserved1_6 :1;
344 unsigned page_code :6; /* Page code - Should be 0x2b */
345#elif defined(__LITTLE_ENDIAN_BITFIELD)
346 unsigned page_code :6; /* Page code - Should be 0x2b */
347 unsigned reserved1_6 :1;
348 unsigned ps :1;
349#else
350#error "Please fix <asm/byteorder.h>"
351#endif
352 u8 reserved2;
353 u8 density;
354 u8 reserved3,reserved4;
Al Viro95389b82007-02-09 16:39:45 +0000355 __be16 segtrk;
356 __be16 trks;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 u8 reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
358} osst_tape_paramtr_page_t;
359
360/* OnStream definitions */
361
362#define OS_CONFIG_PARTITION (0xff)
363#define OS_DATA_PARTITION (0)
364#define OS_PARTITION_VERSION (1)
365
366/*
367 * partition
368 */
369typedef struct os_partition_s {
370 __u8 partition_num;
371 __u8 par_desc_ver;
Al Viro95389b82007-02-09 16:39:45 +0000372 __be16 wrt_pass_cntr;
373 __be32 first_frame_ppos;
374 __be32 last_frame_ppos;
375 __be32 eod_frame_ppos;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376} os_partition_t;
377
378/*
379 * DAT entry
380 */
381typedef struct os_dat_entry_s {
Al Viro95389b82007-02-09 16:39:45 +0000382 __be32 blk_sz;
383 __be16 blk_cnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 __u8 flags;
385 __u8 reserved;
386} os_dat_entry_t;
387
388/*
389 * DAT
390 */
391#define OS_DAT_FLAGS_DATA (0xc)
392#define OS_DAT_FLAGS_MARK (0x1)
393
394typedef struct os_dat_s {
395 __u8 dat_sz;
396 __u8 reserved1;
397 __u8 entry_cnt;
398 __u8 reserved3;
399 os_dat_entry_t dat_list[16];
400} os_dat_t;
401
402/*
403 * Frame types
404 */
405#define OS_FRAME_TYPE_FILL (0)
406#define OS_FRAME_TYPE_EOD (1 << 0)
407#define OS_FRAME_TYPE_MARKER (1 << 1)
408#define OS_FRAME_TYPE_HEADER (1 << 3)
409#define OS_FRAME_TYPE_DATA (1 << 7)
410
411/*
412 * AUX
413 */
414typedef struct os_aux_s {
Al Viro95389b82007-02-09 16:39:45 +0000415 __be32 format_id; /* hardware compability AUX is based on */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416 char application_sig[4]; /* driver used to write this media */
Al Viro95389b82007-02-09 16:39:45 +0000417 __be32 hdwr; /* reserved */
418 __be32 update_frame_cntr; /* for configuration frame */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 __u8 frame_type;
420 __u8 frame_type_reserved;
421 __u8 reserved_18_19[2];
422 os_partition_t partition;
423 __u8 reserved_36_43[8];
Al Viro95389b82007-02-09 16:39:45 +0000424 __be32 frame_seq_num;
425 __be32 logical_blk_num_high;
426 __be32 logical_blk_num;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 os_dat_t dat;
428 __u8 reserved188_191[4];
Al Viro95389b82007-02-09 16:39:45 +0000429 __be32 filemark_cnt;
430 __be32 phys_fm;
431 __be32 last_mark_ppos;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 __u8 reserved204_223[20];
433
434 /*
435 * __u8 app_specific[32];
436 *
437 * Linux specific fields:
438 */
Al Viro95389b82007-02-09 16:39:45 +0000439 __be32 next_mark_ppos; /* when known, points to next marker */
440 __be32 last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441 __u8 linux_specific[24];
442
443 __u8 reserved_256_511[256];
444} os_aux_t;
445
446#define OS_FM_TAB_MAX 1024
447
448typedef struct os_fm_tab_s {
449 __u8 fm_part_num;
450 __u8 reserved_1;
451 __u8 fm_tab_ent_sz;
452 __u8 reserved_3;
Al Viro95389b82007-02-09 16:39:45 +0000453 __be16 fm_tab_ent_cnt;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 __u8 reserved6_15[10];
Al Viro95389b82007-02-09 16:39:45 +0000455 __be32 fm_tab_ent[OS_FM_TAB_MAX];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456} os_fm_tab_t;
457
458typedef struct os_ext_trk_ey_s {
459 __u8 et_part_num;
460 __u8 fmt;
Al Viro95389b82007-02-09 16:39:45 +0000461 __be16 fm_tab_off;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462 __u8 reserved4_7[4];
Al Viro95389b82007-02-09 16:39:45 +0000463 __be32 last_hlb_hi;
464 __be32 last_hlb;
465 __be32 last_pp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466 __u8 reserved20_31[12];
467} os_ext_trk_ey_t;
468
469typedef struct os_ext_trk_tb_s {
470 __u8 nr_stream_part;
471 __u8 reserved_1;
472 __u8 et_ent_sz;
473 __u8 reserved3_15[13];
474 os_ext_trk_ey_t dat_ext_trk_ey;
475 os_ext_trk_ey_t qfa_ext_trk_ey;
476} os_ext_trk_tb_t;
477
478typedef struct os_header_s {
479 char ident_str[8];
480 __u8 major_rev;
481 __u8 minor_rev;
Al Viro95389b82007-02-09 16:39:45 +0000482 __be16 ext_trk_tb_off;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 __u8 reserved12_15[4];
484 __u8 pt_par_num;
485 __u8 pt_reserved1_3[3];
486 os_partition_t partition[16];
Al Viro95389b82007-02-09 16:39:45 +0000487 __be32 cfg_col_width;
488 __be32 dat_col_width;
489 __be32 qfa_col_width;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 __u8 cartridge[16];
491 __u8 reserved304_511[208];
Al Viro95389b82007-02-09 16:39:45 +0000492 __be32 old_filemark_list[16680/4]; /* in ADR 1.4 __u8 track_table[16680] */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 os_ext_trk_tb_t ext_track_tb;
494 __u8 reserved17272_17735[464];
495 os_fm_tab_t dat_fm_tab;
496 os_fm_tab_t qfa_fm_tab;
497 __u8 reserved25960_32767[6808];
498} os_header_t;
499
500
501/*
502 * OnStream ADRL frame
503 */
504#define OS_FRAME_SIZE (32 * 1024 + 512)
505#define OS_DATA_SIZE (32 * 1024)
506#define OS_AUX_SIZE (512)
507//#define OSST_MAX_SG 2
508
509/* The OnStream tape buffer descriptor. */
510struct osst_buffer {
511 unsigned char in_use;
512 unsigned char dma; /* DMA-able buffer */
513 int buffer_size;
514 int buffer_blocks;
515 int buffer_bytes;
516 int read_pointer;
517 int writing;
518 int midlevel_result;
519 int syscall_result;
Willem Riede5e6575c2006-02-11 14:46:56 -0500520 struct osst_request *last_SRpnt;
521 struct st_cmdstatus cmdstat;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 unsigned char *b_data;
523 os_aux_t *aux; /* onstream AUX structure at end of each block */
524 unsigned short use_sg; /* zero or number of s/g segments for this adapter */
525 unsigned short sg_segs; /* number of segments in s/g list */
526 unsigned short orig_sg_segs; /* number of segments allocated at first try */
527 struct scatterlist sg[1]; /* MUST BE last item */
528} ;
529
530/* The OnStream tape drive descriptor */
531struct osst_tape {
532 struct scsi_driver *driver;
533 unsigned capacity;
534 struct scsi_device *device;
535 struct semaphore lock; /* for serialization */
536 struct completion wait; /* for SCSI commands */
537 struct osst_buffer * buffer;
538
539 /* Drive characteristics */
540 unsigned char omit_blklims;
541 unsigned char do_auto_lock;
542 unsigned char can_bsr;
543 unsigned char can_partitions;
544 unsigned char two_fm;
545 unsigned char fast_mteom;
546 unsigned char restr_dma;
547 unsigned char scsi2_logical;
548 unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */
549 unsigned char pos_unknown; /* after reset position unknown */
550 int write_threshold;
551 int timeout; /* timeout for normal commands */
552 int long_timeout; /* timeout for commands known to take long time*/
553
554 /* Mode characteristics */
555 struct st_modedef modes[ST_NBR_MODES];
556 int current_mode;
557
558 /* Status variables */
559 int partition;
560 int new_partition;
561 int nbr_partitions; /* zero until partition support enabled */
562 struct st_partstat ps[ST_NBR_PARTITIONS];
563 unsigned char dirty;
564 unsigned char ready;
565 unsigned char write_prot;
566 unsigned char drv_write_prot;
567 unsigned char in_use;
568 unsigned char blksize_changed;
569 unsigned char density_changed;
570 unsigned char compression_changed;
571 unsigned char drv_buffer;
572 unsigned char density;
573 unsigned char door_locked;
574 unsigned char rew_at_close;
575 unsigned char inited;
576 int block_size;
577 int min_block;
578 int max_block;
579 int recover_count; /* from tape opening */
580 int abort_count;
581 int write_count;
582 int read_count;
583 int recover_erreg; /* from last status call */
584 /*
585 * OnStream specific data
586 */
587 int os_fw_rev; /* the firmware revision * 10000 */
588 unsigned char raw; /* flag OnStream raw access (32.5KB block size) */
589 unsigned char poll; /* flag that this drive needs polling (IDE|firmware) */
590 unsigned char frame_in_buffer; /* flag that the frame as per frame_seq_number
591 * has been read into STp->buffer and is valid */
592 int frame_seq_number; /* logical frame number */
593 int logical_blk_num; /* logical block number */
594 unsigned first_frame_position; /* physical frame to be transferred to/from host */
595 unsigned last_frame_position; /* physical frame to be transferd to/from tape */
596 int cur_frames; /* current number of frames in internal buffer */
597 int max_frames; /* max number of frames in internal buffer */
598 char application_sig[5]; /* application signature */
599 unsigned char fast_open; /* flag that reminds us we didn't check headers at open */
600 unsigned short wrt_pass_cntr; /* write pass counter */
601 int update_frame_cntr; /* update frame counter */
602 int onstream_write_error; /* write error recovery active */
603 int header_ok; /* header frame verified ok */
604 int linux_media; /* reading linux-specifc media */
605 int linux_media_version;
606 os_header_t * header_cache; /* cache is kept for filemark positions */
607 int filemark_cnt;
608 int first_mark_ppos;
609 int last_mark_ppos;
610 int last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
611 int first_data_ppos;
612 int eod_frame_ppos;
613 int eod_frame_lfa;
614 int write_type; /* used in write error recovery */
615 int read_error_frame; /* used in read error recovery */
616 unsigned long cmd_start_time;
617 unsigned long max_cmd_time;
618
619#if DEBUG
620 unsigned char write_pending;
621 int nbr_finished;
622 int nbr_waits;
623 unsigned char last_cmnd[6];
624 unsigned char last_sense[16];
625#endif
626 struct gendisk *drive;
627} ;
628
Willem Riede5e6575c2006-02-11 14:46:56 -0500629/* scsi tape command */
630struct osst_request {
631 unsigned char cmd[MAX_COMMAND_SIZE];
632 unsigned char sense[SCSI_SENSE_BUFFERSIZE];
633 int result;
634 struct osst_tape *stp;
635 struct completion *waiting;
636};
637
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638/* Values of write_type */
639#define OS_WRITE_DATA 0
640#define OS_WRITE_EOD 1
641#define OS_WRITE_NEW_MARK 2
642#define OS_WRITE_LAST_MARK 3
643#define OS_WRITE_HEADER 4
644#define OS_WRITE_FILLER 5
645
646/* Additional rw state */
647#define OS_WRITING_COMPLETE 3