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