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