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 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 */ 13 typedef 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 */ 38 typedef 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 */ 87 typedef 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 */ 112 typedef 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 */ 124 typedef 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 */ 134 typedef 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 */ 177 typedef 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 */ 214 typedef 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 292 __be16 max_speed; /* Maximum speed supported in KBps */ 293 u8 reserved10, reserved11; 294 __be16 ctl; /* Continuous Transfer Limit in blocks */ 295 __be16 speed; /* Current Speed, in KBps */ 296 __be16 buffer_size; /* Buffer Size, in 512 bytes */ 297 u8 reserved18, reserved19; 298 } osst_capabilities_page_t; 299 300 /* 301 * Block Size Page 302 */ 303 typedef 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 */ 341 typedef 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; 356 __be16 segtrk; 357 __be16 trks; 358 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 */ 370 typedef 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 * DAT entry 381 */ 382 typedef 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 * DAT 391 */ 392 #define OS_DAT_FLAGS_DATA (0xc) 393 #define OS_DAT_FLAGS_MARK (0x1) 394 395 typedef 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 */ 415 typedef struct os_aux_s { 416 __be32 format_id; /* hardware compatibility AUX is based on */ 417 char application_sig[4]; /* driver used to write this media */ 418 __be32 hdwr; /* reserved */ 419 __be32 update_frame_cntr; /* for configuration frame */ 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 * __u8 app_specific[32]; 437 * 438 * Linux specific fields: 439 */ 440 __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 */ 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 449 typedef 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 459 typedef 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 470 typedef 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 479 typedef 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]; /* in ADR 1.4 __u8 track_table[16680] */ 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 * 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. */ 511 struct 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; 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; /* 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 */ 533 struct osst_tape { 534 struct scsi_driver *driver; 535 unsigned capacity; 536 struct scsi_device *device; 537 struct mutex lock; /* for serialization */ 538 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 631 /* scsi tape command */ 632 struct 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 /* 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 651