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