1
2
3
4
5#include <asm/byteorder.h>
6#include <linux/completion.h>
7#include <linux/mutex.h>
8
9
10
11
12
13typedef struct {
14 unsigned device_type :5;
15 unsigned reserved0_765 :3;
16 unsigned reserved1_6t0 :7;
17 unsigned rmb :1;
18 unsigned ansi_version :3;
19 unsigned ecma_version :3;
20 unsigned iso_version :2;
21 unsigned response_format :4;
22 unsigned reserved3_45 :2;
23 unsigned reserved3_6 :1;
24 unsigned reserved3_7 :1;
25 u8 additional_length;
26 u8 rsv5, rsv6, rsv7;
27 u8 vendor_id[8];
28 u8 product_id[16];
29 u8 revision_level[4];
30 u8 vendor_specific[20];
31 u8 reserved56t95[40];
32
33} idetape_inquiry_result_t;
34
35
36
37
38typedef struct {
39 unsigned reserved0_10 :2;
40 unsigned bpu :1;
41 unsigned reserved0_543 :3;
42 unsigned eop :1;
43 unsigned bop :1;
44 u8 partition;
45 u8 reserved2, reserved3;
46 u32 first_block;
47 u32 last_block;
48 u8 reserved12;
49 u8 blocks_in_buffer[3];
50 u32 bytes_in_buffer;
51} idetape_read_position_result_t;
52
53
54
55
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
86
87typedef struct {
88 unsigned error_code :7;
89 unsigned valid :1;
90 u8 reserved1 :8;
91 unsigned sense_key :4;
92 unsigned reserved2_4 :1;
93 unsigned ili :1;
94 unsigned eom :1;
95 unsigned filemark :1;
96 u32 information __attribute__ ((packed));
97 u8 asl;
98 u32 command_specific;
99 u8 asc;
100 u8 ascq;
101 u8 replaceable_unit_code;
102 unsigned sk_specific1 :7;
103 unsigned sksv :1;
104 u8 sk_specific2;
105 u8 sk_specific3;
106 u8 pad[2];
107} idetape_request_sense_result_t;
108
109
110
111
112typedef struct {
113 u8 mode_data_length;
114 u8 medium_type;
115 u8 dsp;
116 u8 bdl;
117} osst_mode_parameter_header_t;
118
119
120
121
122
123
124typedef struct {
125 u8 density_code;
126 u8 blocks[3];
127 u8 reserved4;
128 u8 length[3];
129} osst_parameter_block_descriptor_t;
130
131
132
133
134typedef struct {
135#if defined(__BIG_ENDIAN_BITFIELD)
136 unsigned ps :1;
137 unsigned reserved0 :1;
138 unsigned page_code :6;
139#elif defined(__LITTLE_ENDIAN_BITFIELD)
140 unsigned page_code :6;
141 unsigned reserved0 :1;
142 unsigned ps :1;
143#else
144#error "Please fix <asm/byteorder.h>"
145#endif
146 u8 page_length;
147#if defined(__BIG_ENDIAN_BITFIELD)
148 unsigned dce :1;
149 unsigned dcc :1;
150 unsigned reserved2 :6;
151#elif defined(__LITTLE_ENDIAN_BITFIELD)
152 unsigned reserved2 :6;
153 unsigned dcc :1;
154 unsigned dce :1;
155#else
156#error "Please fix <asm/byteorder.h>"
157#endif
158#if defined(__BIG_ENDIAN_BITFIELD)
159 unsigned dde :1;
160 unsigned red :2;
161 unsigned reserved3 :5;
162#elif defined(__LITTLE_ENDIAN_BITFIELD)
163 unsigned reserved3 :5;
164 unsigned red :2;
165 unsigned dde :1;
166#else
167#error "Please fix <asm/byteorder.h>"
168#endif
169 u32 ca;
170 u32 da;
171 u8 reserved[4];
172} osst_data_compression_page_t;
173
174
175
176
177typedef struct {
178#if defined(__BIG_ENDIAN_BITFIELD)
179 unsigned ps :1;
180 unsigned reserved1_6 :1;
181 unsigned page_code :6;
182#elif defined(__LITTLE_ENDIAN_BITFIELD)
183 unsigned page_code :6;
184 unsigned reserved1_6 :1;
185 unsigned ps :1;
186#else
187#error "Please fix <asm/byteorder.h>"
188#endif
189 u8 page_length;
190 u8 map;
191 u8 apd;
192#if defined(__BIG_ENDIAN_BITFIELD)
193 unsigned fdp :1;
194 unsigned sdp :1;
195 unsigned idp :1;
196 unsigned psum :2;
197 unsigned reserved4_012 :3;
198#elif defined(__LITTLE_ENDIAN_BITFIELD)
199 unsigned reserved4_012 :3;
200 unsigned psum :2;
201 unsigned idp :1;
202 unsigned sdp :1;
203 unsigned fdp :1;
204#else
205#error "Please fix <asm/byteorder.h>"
206#endif
207 u8 mfr;
208 u8 reserved[2];
209} osst_medium_partition_page_t;
210
211
212
213
214typedef struct {
215#if defined(__BIG_ENDIAN_BITFIELD)
216 unsigned reserved1_67 :2;
217 unsigned page_code :6;
218#elif defined(__LITTLE_ENDIAN_BITFIELD)
219 unsigned page_code :6;
220 unsigned reserved1_67 :2;
221#else
222#error "Please fix <asm/byteorder.h>"
223#endif
224 u8 page_length;
225 u8 reserved2, reserved3;
226#if defined(__BIG_ENDIAN_BITFIELD)
227 unsigned reserved4_67 :2;
228 unsigned sprev :1;
229 unsigned reserved4_1234 :4;
230 unsigned ro :1;
231#elif defined(__LITTLE_ENDIAN_BITFIELD)
232 unsigned ro :1;
233 unsigned reserved4_1234 :4;
234 unsigned sprev :1;
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;
242 unsigned reserved5_4 :1;
243 unsigned efmt :1;
244 unsigned reserved5_012 :3;
245#elif defined(__LITTLE_ENDIAN_BITFIELD)
246 unsigned reserved5_012 :3;
247 unsigned efmt :1;
248 unsigned reserved5_4 :1;
249 unsigned qfa :1;
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;
256 unsigned ecc :1;
257 unsigned reserved6_45 :2;
258 unsigned eject :1;
259 unsigned prevent :1;
260 unsigned locked :1;
261 unsigned lock :1;
262#elif defined(__LITTLE_ENDIAN_BITFIELD)
263 unsigned lock :1;
264 unsigned locked :1;
265 unsigned prevent :1;
266 unsigned eject :1;
267 unsigned reserved6_45 :2;
268 unsigned ecc :1;
269 unsigned cmprs :1;
270#else
271#error "Please fix <asm/byteorder.h>"
272#endif
273#if defined(__BIG_ENDIAN_BITFIELD)
274 unsigned blk32768 :1;
275
276
277 unsigned reserved7_3_6 :4;
278 unsigned blk1024 :1;
279 unsigned blk512 :1;
280 unsigned reserved7_0 :1;
281#elif defined(__LITTLE_ENDIAN_BITFIELD)
282 unsigned reserved7_0 :1;
283 unsigned blk512 :1;
284 unsigned blk1024 :1;
285 unsigned reserved7_3_6 :4;
286 unsigned blk32768 :1;
287
288
289#else
290#error "Please fix <asm/byteorder.h>"
291#endif
292 __be16 max_speed;
293 u8 reserved10, reserved11;
294 __be16 ctl;
295 __be16 speed;
296 __be16 buffer_size;
297 u8 reserved18, reserved19;
298} osst_capabilities_page_t;
299
300
301
302
303typedef struct {
304#if defined(__BIG_ENDIAN_BITFIELD)
305 unsigned ps :1;
306 unsigned reserved1_6 :1;
307 unsigned page_code :6;
308#elif defined(__LITTLE_ENDIAN_BITFIELD)
309 unsigned page_code :6;
310 unsigned reserved1_6 :1;
311 unsigned ps :1;
312#else
313#error "Please fix <asm/byteorder.h>"
314#endif
315 u8 page_length;
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
340
341typedef struct {
342#if defined(__BIG_ENDIAN_BITFIELD)
343 unsigned ps :1;
344 unsigned reserved1_6 :1;
345 unsigned page_code :6;
346#elif defined(__LITTLE_ENDIAN_BITFIELD)
347 unsigned page_code :6;
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;
356 __be16 segtrk;
357 __be16 trks;
358 u8 reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
359} osst_tape_paramtr_page_t;
360
361
362
363#define OS_CONFIG_PARTITION (0xff)
364#define OS_DATA_PARTITION (0)
365#define OS_PARTITION_VERSION (1)
366
367
368
369
370typedef struct os_partition_s {
371 __u8 partition_num;
372 __u8 par_desc_ver;
373 __be16 wrt_pass_cntr;
374 __be32 first_frame_ppos;
375 __be32 last_frame_ppos;
376 __be32 eod_frame_ppos;
377} os_partition_t;
378
379
380
381
382typedef struct os_dat_entry_s {
383 __be32 blk_sz;
384 __be16 blk_cnt;
385 __u8 flags;
386 __u8 reserved;
387} os_dat_entry_t;
388
389
390
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
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
414
415typedef struct os_aux_s {
416 __be32 format_id;
417 char application_sig[4];
418 __be32 hdwr;
419 __be32 update_frame_cntr;
420 __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];
425 __be32 frame_seq_num;
426 __be32 logical_blk_num_high;
427 __be32 logical_blk_num;
428 os_dat_t dat;
429 __u8 reserved188_191[4];
430 __be32 filemark_cnt;
431 __be32 phys_fm;
432 __be32 last_mark_ppos;
433 __u8 reserved204_223[20];
434
435
436
437
438
439
440 __be32 next_mark_ppos;
441 __be32 last_mark_lbn;
442 __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;
454 __be16 fm_tab_ent_cnt;
455 __u8 reserved6_15[10];
456 __be32 fm_tab_ent[OS_FM_TAB_MAX];
457} os_fm_tab_t;
458
459typedef struct os_ext_trk_ey_s {
460 __u8 et_part_num;
461 __u8 fmt;
462 __be16 fm_tab_off;
463 __u8 reserved4_7[4];
464 __be32 last_hlb_hi;
465 __be32 last_hlb;
466 __be32 last_pp;
467 __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;
483 __be16 ext_trk_tb_off;
484 __u8 reserved12_15[4];
485 __u8 pt_par_num;
486 __u8 pt_reserved1_3[3];
487 os_partition_t partition[16];
488 __be32 cfg_col_width;
489 __be32 dat_col_width;
490 __be32 qfa_col_width;
491 __u8 cartridge[16];
492 __u8 reserved304_511[208];
493 __be32 old_filemark_list[16680/4];
494 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
504
505#define OS_FRAME_SIZE (32 * 1024 + 512)
506#define OS_DATA_SIZE (32 * 1024)
507#define OS_AUX_SIZE (512)
508
509
510
511struct osst_buffer {
512 unsigned char in_use;
513 unsigned char dma;
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;
521 struct osst_request *last_SRpnt;
522 struct st_cmdstatus cmdstat;
523 struct rq_map_data map_data;
524 unsigned char *b_data;
525 os_aux_t *aux;
526 unsigned short use_sg;
527 unsigned short sg_segs;
528 unsigned short orig_sg_segs;
529 struct scatterlist sg[1];
530} ;
531
532
533struct osst_tape {
534 struct scsi_driver *driver;
535 unsigned capacity;
536 struct scsi_device *device;
537 struct mutex lock;
538 struct completion wait;
539 struct osst_buffer * buffer;
540
541
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;
551 unsigned char pos_unknown;
552 int write_threshold;
553 int timeout;
554 int long_timeout;
555
556
557 struct st_modedef modes[ST_NBR_MODES];
558 int current_mode;
559
560
561 int partition;
562 int new_partition;
563 int nbr_partitions;
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;
582 int abort_count;
583 int write_count;
584 int read_count;
585 int recover_erreg;
586
587
588
589 int os_fw_rev;
590 unsigned char raw;
591 unsigned char poll;
592 unsigned char frame_in_buffer;
593
594 int frame_seq_number;
595 int logical_blk_num;
596 unsigned first_frame_position;
597 unsigned last_frame_position;
598 int cur_frames;
599 int max_frames;
600 char application_sig[5];
601 unsigned char fast_open;
602 unsigned short wrt_pass_cntr;
603 int update_frame_cntr;
604 int onstream_write_error;
605 int header_ok;
606 int linux_media;
607 int linux_media_version;
608 os_header_t * header_cache;
609 int filemark_cnt;
610 int first_mark_ppos;
611 int last_mark_ppos;
612 int last_mark_lbn;
613 int first_data_ppos;
614 int eod_frame_ppos;
615 int eod_frame_lfa;
616 int write_type;
617 int read_error_frame;
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
631
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;
638 struct bio *bio;
639};
640
641
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
650#define OS_WRITING_COMPLETE 3
651