1
2
3
4
5#include <asm/byteorder.h>
6#include <linux/config.h>
7#include <linux/completion.h>
8#ifdef CONFIG_DEVFS_FS
9#include <linux/devfs_fs_kernel.h>
10#endif
11
12
13
14
15
16typedef struct {
17 unsigned device_type :5;
18 unsigned reserved0_765 :3;
19 unsigned reserved1_6t0 :7;
20 unsigned rmb :1;
21 unsigned ansi_version :3;
22 unsigned ecma_version :3;
23 unsigned iso_version :2;
24 unsigned response_format :4;
25 unsigned reserved3_45 :2;
26 unsigned reserved3_6 :1;
27 unsigned reserved3_7 :1;
28 u8 additional_length;
29 u8 rsv5, rsv6, rsv7;
30 u8 vendor_id[8];
31 u8 product_id[16];
32 u8 revision_level[4];
33 u8 vendor_specific[20];
34 u8 reserved56t95[40];
35
36} idetape_inquiry_result_t;
37
38
39
40
41typedef struct {
42 unsigned reserved0_10 :2;
43 unsigned bpu :1;
44 unsigned reserved0_543 :3;
45 unsigned eop :1;
46 unsigned bop :1;
47 u8 partition;
48 u8 reserved2, reserved3;
49 u32 first_block;
50 u32 last_block;
51 u8 reserved12;
52 u8 blocks_in_buffer[3];
53 u32 bytes_in_buffer;
54} idetape_read_position_result_t;
55
56
57
58
59
60#define COMPRESSION_PAGE 0x0f
61#define COMPRESSION_PAGE_LENGTH 16
62
63#define CAPABILITIES_PAGE 0x2a
64#define CAPABILITIES_PAGE_LENGTH 20
65
66#define TAPE_PARAMTR_PAGE 0x2b
67#define TAPE_PARAMTR_PAGE_LENGTH 16
68
69#define NUMBER_RETRIES_PAGE 0x2f
70#define NUMBER_RETRIES_PAGE_LENGTH 4
71
72#define BLOCK_SIZE_PAGE 0x30
73#define BLOCK_SIZE_PAGE_LENGTH 4
74
75#define BUFFER_FILLING_PAGE 0x33
76#define BUFFER_FILLING_PAGE_LENGTH
77
78#define VENDOR_IDENT_PAGE 0x36
79#define VENDOR_IDENT_PAGE_LENGTH 8
80
81#define LOCATE_STATUS_PAGE 0x37
82#define LOCATE_STATUS_PAGE_LENGTH 0
83
84#define MODE_HEADER_LENGTH 4
85
86
87
88
89
90typedef struct {
91 unsigned error_code :7;
92 unsigned valid :1;
93 u8 reserved1 :8;
94 unsigned sense_key :4;
95 unsigned reserved2_4 :1;
96 unsigned ili :1;
97 unsigned eom :1;
98 unsigned filemark :1;
99 u32 information __attribute__ ((packed));
100 u8 asl;
101 u32 command_specific;
102 u8 asc;
103 u8 ascq;
104 u8 replaceable_unit_code;
105 unsigned sk_specific1 :7;
106 unsigned sksv :1;
107 u8 sk_specific2;
108 u8 sk_specific3;
109 u8 pad[2];
110} idetape_request_sense_result_t;
111
112
113
114
115typedef struct {
116 u8 mode_data_length;
117 u8 medium_type;
118 u8 dsp;
119 u8 bdl;
120} osst_mode_parameter_header_t;
121
122
123
124
125
126
127typedef struct {
128 u8 density_code;
129 u8 blocks[3];
130 u8 reserved4;
131 u8 length[3];
132} osst_parameter_block_descriptor_t;
133
134
135
136
137typedef struct {
138#if defined(__BIG_ENDIAN_BITFIELD)
139 unsigned ps :1;
140 unsigned reserved0 :1;
141 unsigned page_code :6;
142#elif defined(__LITTLE_ENDIAN_BITFIELD)
143 unsigned page_code :6;
144 unsigned reserved0 :1;
145 unsigned ps :1;
146#else
147#error "Please fix <asm/byteorder.h>"
148#endif
149 u8 page_length;
150#if defined(__BIG_ENDIAN_BITFIELD)
151 unsigned dce :1;
152 unsigned dcc :1;
153 unsigned reserved2 :6;
154#elif defined(__LITTLE_ENDIAN_BITFIELD)
155 unsigned reserved2 :6;
156 unsigned dcc :1;
157 unsigned dce :1;
158#else
159#error "Please fix <asm/byteorder.h>"
160#endif
161#if defined(__BIG_ENDIAN_BITFIELD)
162 unsigned dde :1;
163 unsigned red :2;
164 unsigned reserved3 :5;
165#elif defined(__LITTLE_ENDIAN_BITFIELD)
166 unsigned reserved3 :5;
167 unsigned red :2;
168 unsigned dde :1;
169#else
170#error "Please fix <asm/byteorder.h>"
171#endif
172 u32 ca;
173 u32 da;
174 u8 reserved[4];
175} osst_data_compression_page_t;
176
177
178
179
180typedef struct {
181#if defined(__BIG_ENDIAN_BITFIELD)
182 unsigned ps :1;
183 unsigned reserved1_6 :1;
184 unsigned page_code :6;
185#elif defined(__LITTLE_ENDIAN_BITFIELD)
186 unsigned page_code :6;
187 unsigned reserved1_6 :1;
188 unsigned ps :1;
189#else
190#error "Please fix <asm/byteorder.h>"
191#endif
192 u8 page_length;
193 u8 map;
194 u8 apd;
195#if defined(__BIG_ENDIAN_BITFIELD)
196 unsigned fdp :1;
197 unsigned sdp :1;
198 unsigned idp :1;
199 unsigned psum :2;
200 unsigned reserved4_012 :3;
201#elif defined(__LITTLE_ENDIAN_BITFIELD)
202 unsigned reserved4_012 :3;
203 unsigned psum :2;
204 unsigned idp :1;
205 unsigned sdp :1;
206 unsigned fdp :1;
207#else
208#error "Please fix <asm/byteorder.h>"
209#endif
210 u8 mfr;
211 u8 reserved[2];
212} osst_medium_partition_page_t;
213
214
215
216
217typedef struct {
218#if defined(__BIG_ENDIAN_BITFIELD)
219 unsigned reserved1_67 :2;
220 unsigned page_code :6;
221#elif defined(__LITTLE_ENDIAN_BITFIELD)
222 unsigned page_code :6;
223 unsigned reserved1_67 :2;
224#else
225#error "Please fix <asm/byteorder.h>"
226#endif
227 u8 page_length;
228 u8 reserved2, reserved3;
229#if defined(__BIG_ENDIAN_BITFIELD)
230 unsigned reserved4_67 :2;
231 unsigned sprev :1;
232 unsigned reserved4_1234 :4;
233 unsigned ro :1;
234#elif defined(__LITTLE_ENDIAN_BITFIELD)
235 unsigned ro :1;
236 unsigned reserved4_1234 :4;
237 unsigned sprev :1;
238 unsigned reserved4_67 :2;
239#else
240#error "Please fix <asm/byteorder.h>"
241#endif
242#if defined(__BIG_ENDIAN_BITFIELD)
243 unsigned reserved5_67 :2;
244 unsigned qfa :1;
245 unsigned reserved5_4 :1;
246 unsigned efmt :1;
247 unsigned reserved5_012 :3;
248#elif defined(__LITTLE_ENDIAN_BITFIELD)
249 unsigned reserved5_012 :3;
250 unsigned efmt :1;
251 unsigned reserved5_4 :1;
252 unsigned qfa :1;
253 unsigned reserved5_67 :2;
254#else
255#error "Please fix <asm/byteorder.h>"
256#endif
257#if defined(__BIG_ENDIAN_BITFIELD)
258 unsigned cmprs :1;
259 unsigned ecc :1;
260 unsigned reserved6_45 :2;
261 unsigned eject :1;
262 unsigned prevent :1;
263 unsigned locked :1;
264 unsigned lock :1;
265#elif defined(__LITTLE_ENDIAN_BITFIELD)
266 unsigned lock :1;
267 unsigned locked :1;
268 unsigned prevent :1;
269 unsigned eject :1;
270 unsigned reserved6_45 :2;
271 unsigned ecc :1;
272 unsigned cmprs :1;
273#else
274#error "Please fix <asm/byteorder.h>"
275#endif
276#if defined(__BIG_ENDIAN_BITFIELD)
277 unsigned blk32768 :1;
278
279
280 unsigned reserved7_3_6 :4;
281 unsigned blk1024 :1;
282 unsigned blk512 :1;
283 unsigned reserved7_0 :1;
284#elif defined(__LITTLE_ENDIAN_BITFIELD)
285 unsigned reserved7_0 :1;
286 unsigned blk512 :1;
287 unsigned blk1024 :1;
288 unsigned reserved7_3_6 :4;
289 unsigned blk32768 :1;
290
291
292#else
293#error "Please fix <asm/byteorder.h>"
294#endif
295 u16 max_speed;
296 u8 reserved10, reserved11;
297 u16 ctl;
298 u16 speed;
299 u16 buffer_size;
300 u8 reserved18, reserved19;
301} osst_capabilities_page_t;
302
303
304
305
306typedef struct {
307#if defined(__BIG_ENDIAN_BITFIELD)
308 unsigned ps :1;
309 unsigned reserved1_6 :1;
310 unsigned page_code :6;
311#elif defined(__LITTLE_ENDIAN_BITFIELD)
312 unsigned page_code :6;
313 unsigned reserved1_6 :1;
314 unsigned ps :1;
315#else
316#error "Please fix <asm/byteorder.h>"
317#endif
318 u8 page_length;
319 u8 reserved2;
320#if defined(__BIG_ENDIAN_BITFIELD)
321 unsigned one :1;
322 unsigned reserved2_6 :1;
323 unsigned record32_5 :1;
324 unsigned record32 :1;
325 unsigned reserved2_23 :2;
326 unsigned play32_5 :1;
327 unsigned play32 :1;
328#elif defined(__LITTLE_ENDIAN_BITFIELD)
329 unsigned play32 :1;
330 unsigned play32_5 :1;
331 unsigned reserved2_23 :2;
332 unsigned record32 :1;
333 unsigned record32_5 :1;
334 unsigned reserved2_6 :1;
335 unsigned one :1;
336#else
337#error "Please fix <asm/byteorder.h>"
338#endif
339} osst_block_size_page_t;
340
341
342
343
344typedef struct {
345#if defined(__BIG_ENDIAN_BITFIELD)
346 unsigned ps :1;
347 unsigned reserved1_6 :1;
348 unsigned page_code :6;
349#elif defined(__LITTLE_ENDIAN_BITFIELD)
350 unsigned page_code :6;
351 unsigned reserved1_6 :1;
352 unsigned ps :1;
353#else
354#error "Please fix <asm/byteorder.h>"
355#endif
356 u8 reserved2;
357 u8 density;
358 u8 reserved3,reserved4;
359 u16 segtrk;
360 u16 trks;
361 u8 reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
362} osst_tape_paramtr_page_t;
363
364
365
366#define OS_CONFIG_PARTITION (0xff)
367#define OS_DATA_PARTITION (0)
368#define OS_PARTITION_VERSION (1)
369
370
371
372
373typedef struct os_partition_s {
374 __u8 partition_num;
375 __u8 par_desc_ver;
376 __u16 wrt_pass_cntr;
377 __u32 first_frame_ppos;
378 __u32 last_frame_ppos;
379 __u32 eod_frame_ppos;
380} os_partition_t;
381
382
383
384
385typedef struct os_dat_entry_s {
386 __u32 blk_sz;
387 __u16 blk_cnt;
388 __u8 flags;
389 __u8 reserved;
390} os_dat_entry_t;
391
392
393
394
395#define OS_DAT_FLAGS_DATA (0xc)
396#define OS_DAT_FLAGS_MARK (0x1)
397
398typedef struct os_dat_s {
399 __u8 dat_sz;
400 __u8 reserved1;
401 __u8 entry_cnt;
402 __u8 reserved3;
403 os_dat_entry_t dat_list[16];
404} os_dat_t;
405
406
407
408
409#define OS_FRAME_TYPE_FILL (0)
410#define OS_FRAME_TYPE_EOD (1 << 0)
411#define OS_FRAME_TYPE_MARKER (1 << 1)
412#define OS_FRAME_TYPE_HEADER (1 << 3)
413#define OS_FRAME_TYPE_DATA (1 << 7)
414
415
416
417
418typedef struct os_aux_s {
419 __u32 format_id;
420 char application_sig[4];
421 __u32 hdwr;
422 __u32 update_frame_cntr;
423 __u8 frame_type;
424 __u8 frame_type_reserved;
425 __u8 reserved_18_19[2];
426 os_partition_t partition;
427 __u8 reserved_36_43[8];
428 __u32 frame_seq_num;
429 __u32 logical_blk_num_high;
430 __u32 logical_blk_num;
431 os_dat_t dat;
432 __u8 reserved188_191[4];
433 __u32 filemark_cnt;
434 __u32 phys_fm;
435 __u32 last_mark_ppos;
436 __u8 reserved204_223[20];
437
438
439
440
441
442
443 __u32 next_mark_ppos;
444 __u32 last_mark_lbn;
445 __u8 linux_specific[24];
446
447 __u8 reserved_256_511[256];
448} os_aux_t;
449
450#define OS_FM_TAB_MAX 1024
451
452typedef struct os_fm_tab_s {
453 __u8 fm_part_num;
454 __u8 reserved_1;
455 __u8 fm_tab_ent_sz;
456 __u8 reserved_3;
457 __u16 fm_tab_ent_cnt;
458 __u8 reserved6_15[10];
459 __u32 fm_tab_ent[OS_FM_TAB_MAX];
460} os_fm_tab_t;
461
462typedef struct os_ext_trk_ey_s {
463 __u8 et_part_num;
464 __u8 fmt;
465 __u16 fm_tab_off;
466 __u8 reserved4_7[4];
467 __u32 last_hlb_hi;
468 __u32 last_hlb;
469 __u32 last_pp;
470 __u8 reserved20_31[12];
471} os_ext_trk_ey_t;
472
473typedef struct os_ext_trk_tb_s {
474 __u8 nr_stream_part;
475 __u8 reserved_1;
476 __u8 et_ent_sz;
477 __u8 reserved3_15[13];
478 os_ext_trk_ey_t dat_ext_trk_ey;
479 os_ext_trk_ey_t qfa_ext_trk_ey;
480} os_ext_trk_tb_t;
481
482typedef struct os_header_s {
483 char ident_str[8];
484 __u8 major_rev;
485 __u8 minor_rev;
486 __u16 ext_trk_tb_off;
487 __u8 reserved12_15[4];
488 __u8 pt_par_num;
489 __u8 pt_reserved1_3[3];
490 os_partition_t partition[16];
491 __u32 cfg_col_width;
492 __u32 dat_col_width;
493 __u32 qfa_col_width;
494 __u8 cartridge[16];
495 __u8 reserved304_511[208];
496 __u32 old_filemark_list[16680/4];
497 os_ext_trk_tb_t ext_track_tb;
498 __u8 reserved17272_17735[464];
499 os_fm_tab_t dat_fm_tab;
500 os_fm_tab_t qfa_fm_tab;
501 __u8 reserved25960_32767[6808];
502} os_header_t;
503
504
505
506
507
508#define OS_FRAME_SIZE (32 * 1024 + 512)
509#define OS_DATA_SIZE (32 * 1024)
510#define OS_AUX_SIZE (512)
511
512
513
514typedef struct {
515 unsigned char in_use;
516 unsigned char dma;
517 int buffer_size;
518 int buffer_blocks;
519 int buffer_bytes;
520 int read_pointer;
521 int writing;
522 int midlevel_result;
523 int syscall_result;
524 Scsi_Request *last_SRpnt;
525 unsigned char *b_data;
526 os_aux_t *aux;
527 unsigned short use_sg;
528 unsigned short sg_segs;
529 unsigned short orig_sg_segs;
530 struct scatterlist sg[1];
531} OSST_buffer;
532
533
534typedef struct {
535 kdev_t devt;
536 unsigned capacity;
537 Scsi_Device* device;
538 struct semaphore lock;
539 struct completion wait;
540 OSST_buffer * buffer;
541
542
543 unsigned char omit_blklims;
544 unsigned char do_auto_lock;
545 unsigned char can_bsr;
546 unsigned char can_partitions;
547 unsigned char two_fm;
548 unsigned char fast_mteom;
549 unsigned char restr_dma;
550 unsigned char scsi2_logical;
551 unsigned char default_drvbuffer;
552 int write_threshold;
553 int timeout;
554 int long_timeout;
555
556
557 ST_mode modes[ST_NBR_MODES];
558 int current_mode;
559#ifdef CONFIG_DEVFS_FS
560 devfs_handle_t de_r[ST_NBR_MODES];
561 devfs_handle_t de_n[ST_NBR_MODES];
562#endif
563
564
565 int partition;
566 int new_partition;
567 int nbr_partitions;
568 ST_partstat ps[ST_NBR_PARTITIONS];
569 unsigned char dirty;
570 unsigned char ready;
571 unsigned char write_prot;
572 unsigned char drv_write_prot;
573 unsigned char in_use;
574 unsigned char blksize_changed;
575 unsigned char density_changed;
576 unsigned char compression_changed;
577 unsigned char drv_buffer;
578 unsigned char density;
579 unsigned char door_locked;
580 unsigned char rew_at_close;
581 unsigned char inited;
582 int block_size;
583 int min_block;
584 int max_block;
585 int recover_count;
586 int write_count;
587 int read_count;
588 int recover_erreg;
589
590
591
592 int os_fw_rev;
593 unsigned char raw;
594 unsigned char poll;
595 unsigned char frame_in_buffer;
596
597 int frame_seq_number;
598 int logical_blk_num;
599 unsigned first_frame_position;
600 unsigned last_frame_position;
601 int cur_frames;
602 int max_frames;
603 char application_sig[5];
604 unsigned char fast_open;
605 unsigned short wrt_pass_cntr;
606 int update_frame_cntr;
607 int onstream_write_error;
608 int header_ok;
609 int linux_media;
610 int linux_media_version;
611 os_header_t * header_cache;
612 int filemark_cnt;
613 int first_mark_ppos;
614 int last_mark_ppos;
615 int last_mark_lbn;
616 int first_data_ppos;
617 int eod_frame_ppos;
618 int eod_frame_lfa;
619 int write_type;
620 int read_error_frame;
621 unsigned long cmd_start_time;
622 unsigned long max_cmd_time;
623
624#if DEBUG
625 unsigned char write_pending;
626 int nbr_finished;
627 int nbr_waits;
628 unsigned char last_cmnd[6];
629 unsigned char last_sense[16];
630#endif
631} OS_Scsi_Tape;
632
633
634#define OS_WRITE_DATA 0
635#define OS_WRITE_EOD 1
636#define OS_WRITE_NEW_MARK 2
637#define OS_WRITE_LAST_MARK 3
638#define OS_WRITE_HEADER 4
639#define OS_WRITE_FILLER 5
640
641
642#define OS_WRITING_COMPLETE 3
643