linux-old/drivers/scsi/osst.h
<<
>>
Prefs
   1/*
   2 *      $Header: /cvsroot/osst/Driver/osst.h,v 1.12 2001/10/11 00:30:15 riede Exp $
   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/*      FIXME - rename and use the following two types or delete them!
  13 *              and the types really should go to st.h anyway...
  14 *      INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
  15 */
  16typedef struct {
  17        unsigned        device_type     :5;     /* Peripheral Device Type */
  18        unsigned        reserved0_765   :3;     /* Peripheral Qualifier - Reserved */
  19        unsigned        reserved1_6t0   :7;     /* Reserved */
  20        unsigned        rmb             :1;     /* Removable Medium Bit */
  21        unsigned        ansi_version    :3;     /* ANSI Version */
  22        unsigned        ecma_version    :3;     /* ECMA Version */
  23        unsigned        iso_version     :2;     /* ISO Version */
  24        unsigned        response_format :4;     /* Response Data Format */
  25        unsigned        reserved3_45    :2;     /* Reserved */
  26        unsigned        reserved3_6     :1;     /* TrmIOP - Reserved */
  27        unsigned        reserved3_7     :1;     /* AENC - Reserved */
  28        u8              additional_length;      /* Additional Length (total_length-4) */
  29        u8              rsv5, rsv6, rsv7;       /* Reserved */
  30        u8              vendor_id[8];           /* Vendor Identification */
  31        u8              product_id[16];         /* Product Identification */
  32        u8              revision_level[4];      /* Revision Level */
  33        u8              vendor_specific[20];    /* Vendor Specific - Optional */
  34        u8              reserved56t95[40];      /* Reserved - Optional */
  35                                                /* Additional information may be returned */
  36} idetape_inquiry_result_t;
  37
  38/*
  39 *      READ POSITION packet command - Data Format (From Table 6-57)
  40 */
  41typedef struct {
  42        unsigned        reserved0_10    :2;     /* Reserved */
  43        unsigned        bpu             :1;     /* Block Position Unknown */    
  44        unsigned        reserved0_543   :3;     /* Reserved */
  45        unsigned        eop             :1;     /* End Of Partition */
  46        unsigned        bop             :1;     /* Beginning Of Partition */
  47        u8              partition;              /* Partition Number */
  48        u8              reserved2, reserved3;   /* Reserved */
  49        u32             first_block;            /* First Block Location */
  50        u32             last_block;             /* Last Block Location (Optional) */
  51        u8              reserved12;             /* Reserved */
  52        u8              blocks_in_buffer[3];    /* Blocks In Buffer - (Optional) */
  53        u32             bytes_in_buffer;        /* Bytes In Buffer (Optional) */
  54} idetape_read_position_result_t;
  55
  56/*
  57 *      Follows structures which are related to the SELECT SENSE / MODE SENSE
  58 *      packet commands. 
  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 *      REQUEST SENSE packet command result - Data Format.
  89 */
  90typedef struct {
  91        unsigned        error_code      :7;     /* Current of deferred errors */
  92        unsigned        valid           :1;     /* The information field conforms to QIC-157C */
  93        u8              reserved1       :8;     /* Segment Number - Reserved */
  94        unsigned        sense_key       :4;     /* Sense Key */
  95        unsigned        reserved2_4     :1;     /* Reserved */
  96        unsigned        ili             :1;     /* Incorrect Length Indicator */
  97        unsigned        eom             :1;     /* End Of Medium */
  98        unsigned        filemark        :1;     /* Filemark */
  99        u32             information __attribute__ ((packed));
 100        u8              asl;                    /* Additional sense length (n-7) */
 101        u32             command_specific;       /* Additional command specific information */
 102        u8              asc;                    /* Additional Sense Code */
 103        u8              ascq;                   /* Additional Sense Code Qualifier */
 104        u8              replaceable_unit_code;  /* Field Replaceable Unit Code */
 105        unsigned        sk_specific1    :7;     /* Sense Key Specific */
 106        unsigned        sksv            :1;     /* Sense Key Specific information is valid */
 107        u8              sk_specific2;           /* Sense Key Specific */
 108        u8              sk_specific3;           /* Sense Key Specific */
 109        u8              pad[2];                 /* Padding to 20 bytes */
 110} idetape_request_sense_result_t;
 111
 112/*
 113 *      Mode Parameter Header for the MODE SENSE packet command
 114 */
 115typedef struct {
 116        u8              mode_data_length;       /* Length of the following data transfer */
 117        u8              medium_type;            /* Medium Type */
 118        u8              dsp;                    /* Device Specific Parameter */
 119        u8              bdl;                    /* Block Descriptor Length */
 120} osst_mode_parameter_header_t;
 121
 122/*
 123 *      Mode Parameter Block Descriptor the MODE SENSE packet command
 124 *
 125 *      Support for block descriptors is optional.
 126 */
 127typedef struct {
 128        u8              density_code;           /* Medium density code */
 129        u8              blocks[3];              /* Number of blocks */
 130        u8              reserved4;              /* Reserved */
 131        u8              length[3];              /* Block Length */
 132} osst_parameter_block_descriptor_t;
 133
 134/*
 135 *      The Data Compression Page, as returned by the MODE SENSE packet command.
 136 */
 137typedef struct {
 138#if   defined(__BIG_ENDIAN_BITFIELD)
 139        unsigned        ps              :1;
 140        unsigned        reserved0       :1;     /* Reserved */
 141        unsigned        page_code       :6;     /* Page Code - Should be 0xf */
 142#elif defined(__LITTLE_ENDIAN_BITFIELD)
 143        unsigned        page_code       :6;     /* Page Code - Should be 0xf */
 144        unsigned        reserved0       :1;     /* Reserved */
 145        unsigned        ps              :1;
 146#else
 147#error "Please fix <asm/byteorder.h>"
 148#endif
 149        u8              page_length;            /* Page Length - Should be 14 */
 150#if   defined(__BIG_ENDIAN_BITFIELD)
 151        unsigned        dce             :1;     /* Data Compression Enable */
 152        unsigned        dcc             :1;     /* Data Compression Capable */
 153        unsigned        reserved2       :6;     /* Reserved */
 154#elif defined(__LITTLE_ENDIAN_BITFIELD)
 155        unsigned        reserved2       :6;     /* Reserved */
 156        unsigned        dcc             :1;     /* Data Compression Capable */
 157        unsigned        dce             :1;     /* Data Compression Enable */
 158#else
 159#error "Please fix <asm/byteorder.h>"
 160#endif
 161#if   defined(__BIG_ENDIAN_BITFIELD)
 162        unsigned        dde             :1;     /* Data Decompression Enable */
 163        unsigned        red             :2;     /* Report Exception on Decompression */
 164        unsigned        reserved3       :5;     /* Reserved */
 165#elif defined(__LITTLE_ENDIAN_BITFIELD)
 166        unsigned        reserved3       :5;     /* Reserved */
 167        unsigned        red             :2;     /* Report Exception on Decompression */
 168        unsigned        dde             :1;     /* Data Decompression Enable */
 169#else
 170#error "Please fix <asm/byteorder.h>"
 171#endif
 172        u32             ca;                     /* Compression Algorithm */
 173        u32             da;                     /* Decompression Algorithm */
 174        u8              reserved[4];            /* Reserved */
 175} osst_data_compression_page_t;
 176
 177/*
 178 *      The Medium Partition Page, as returned by the MODE SENSE packet command.
 179 */
 180typedef struct {
 181#if   defined(__BIG_ENDIAN_BITFIELD)
 182        unsigned        ps              :1;
 183        unsigned        reserved1_6     :1;     /* Reserved */
 184        unsigned        page_code       :6;     /* Page Code - Should be 0x11 */
 185#elif defined(__LITTLE_ENDIAN_BITFIELD)
 186        unsigned        page_code       :6;     /* Page Code - Should be 0x11 */
 187        unsigned        reserved1_6     :1;     /* Reserved */
 188        unsigned        ps              :1;
 189#else
 190#error "Please fix <asm/byteorder.h>"
 191#endif
 192        u8              page_length;            /* Page Length - Should be 6 */
 193        u8              map;                    /* Maximum Additional Partitions - Should be 0 */
 194        u8              apd;                    /* Additional Partitions Defined - Should be 0 */
 195#if   defined(__BIG_ENDIAN_BITFIELD)
 196        unsigned        fdp             :1;     /* Fixed Data Partitions */
 197        unsigned        sdp             :1;     /* Should be 0 */
 198        unsigned        idp             :1;     /* Should be 0 */
 199        unsigned        psum            :2;     /* Should be 0 */
 200        unsigned        reserved4_012   :3;     /* Reserved */
 201#elif defined(__LITTLE_ENDIAN_BITFIELD)
 202        unsigned        reserved4_012   :3;     /* Reserved */
 203        unsigned        psum            :2;     /* Should be 0 */
 204        unsigned        idp             :1;     /* Should be 0 */
 205        unsigned        sdp             :1;     /* Should be 0 */
 206        unsigned        fdp             :1;     /* Fixed Data Partitions */
 207#else
 208#error "Please fix <asm/byteorder.h>"
 209#endif
 210        u8              mfr;                    /* Medium Format Recognition */
 211        u8              reserved[2];            /* Reserved */
 212} osst_medium_partition_page_t;
 213
 214/*
 215 *      Capabilities and Mechanical Status Page
 216 */
 217typedef struct {
 218#if   defined(__BIG_ENDIAN_BITFIELD)
 219        unsigned        reserved1_67    :2;
 220        unsigned        page_code       :6;     /* Page code - Should be 0x2a */
 221#elif defined(__LITTLE_ENDIAN_BITFIELD)
 222        unsigned        page_code       :6;     /* Page code - Should be 0x2a */
 223        unsigned        reserved1_67    :2;
 224#else
 225#error "Please fix <asm/byteorder.h>"
 226#endif
 227        u8              page_length;            /* Page Length - Should be 0x12 */
 228        u8              reserved2, reserved3;
 229#if   defined(__BIG_ENDIAN_BITFIELD)
 230        unsigned        reserved4_67    :2;
 231        unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */
 232        unsigned        reserved4_1234  :4;
 233        unsigned        ro              :1;     /* Read Only Mode */
 234#elif defined(__LITTLE_ENDIAN_BITFIELD)
 235        unsigned        ro              :1;     /* Read Only Mode */
 236        unsigned        reserved4_1234  :4;
 237        unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */
 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;     /* Supports the QFA two partition formats */
 245        unsigned        reserved5_4     :1;
 246        unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */
 247        unsigned        reserved5_012   :3;
 248#elif defined(__LITTLE_ENDIAN_BITFIELD)
 249        unsigned        reserved5_012   :3;
 250        unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */
 251        unsigned        reserved5_4     :1;
 252        unsigned        qfa             :1;     /* Supports the QFA two partition formats */
 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;     /* Supports data compression */
 259        unsigned        ecc             :1;     /* Supports error correction */
 260        unsigned        reserved6_45    :2;     /* Reserved */  
 261        unsigned        eject           :1;     /* The device can eject the volume */
 262        unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */
 263        unsigned        locked          :1;     /* The volume is locked */
 264        unsigned        lock            :1;     /* Supports locking the volume */
 265#elif defined(__LITTLE_ENDIAN_BITFIELD)
 266        unsigned        lock            :1;     /* Supports locking the volume */
 267        unsigned        locked          :1;     /* The volume is locked */
 268        unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */
 269        unsigned        eject           :1;     /* The device can eject the volume */
 270        unsigned        reserved6_45    :2;     /* Reserved */  
 271        unsigned        ecc             :1;     /* Supports error correction */
 272        unsigned        cmprs           :1;     /* Supports data compression */
 273#else
 274#error "Please fix <asm/byteorder.h>"
 275#endif
 276#if   defined(__BIG_ENDIAN_BITFIELD)
 277        unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */
 278                                                /* transfers for slow buffer memory ??? */
 279                                                /* Also 32768 block size in some cases */
 280        unsigned        reserved7_3_6   :4;
 281        unsigned        blk1024         :1;     /* Supports 1024 bytes block size */
 282        unsigned        blk512          :1;     /* Supports 512 bytes block size */
 283        unsigned        reserved7_0     :1;
 284#elif defined(__LITTLE_ENDIAN_BITFIELD)
 285        unsigned        reserved7_0     :1;
 286        unsigned        blk512          :1;     /* Supports 512 bytes block size */
 287        unsigned        blk1024         :1;     /* Supports 1024 bytes block size */
 288        unsigned        reserved7_3_6   :4;
 289        unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */
 290                                                /* transfers for slow buffer memory ??? */
 291                                                /* Also 32768 block size in some cases */
 292#else
 293#error "Please fix <asm/byteorder.h>"
 294#endif
 295        u16             max_speed;              /* Maximum speed supported in KBps */
 296        u8              reserved10, reserved11;
 297        u16             ctl;                    /* Continuous Transfer Limit in blocks */
 298        u16             speed;                  /* Current Speed, in KBps */
 299        u16             buffer_size;            /* Buffer Size, in 512 bytes */
 300        u8              reserved18, reserved19;
 301} osst_capabilities_page_t;
 302
 303/*
 304 *      Block Size Page
 305 */
 306typedef struct {
 307#if   defined(__BIG_ENDIAN_BITFIELD)
 308        unsigned        ps              :1;
 309        unsigned        reserved1_6     :1;
 310        unsigned        page_code       :6;     /* Page code - Should be 0x30 */
 311#elif defined(__LITTLE_ENDIAN_BITFIELD)
 312        unsigned        page_code       :6;     /* Page code - Should be 0x30 */
 313        unsigned        reserved1_6     :1;
 314        unsigned        ps              :1;
 315#else
 316#error "Please fix <asm/byteorder.h>"
 317#endif
 318        u8              page_length;            /* Page Length - Should be 2 */
 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 *      Tape Parameters Page
 343 */
 344typedef struct {
 345#if   defined(__BIG_ENDIAN_BITFIELD)
 346        unsigned        ps              :1;
 347        unsigned        reserved1_6     :1;
 348        unsigned        page_code       :6;     /* Page code - Should be 0x2b */
 349#elif defined(__LITTLE_ENDIAN_BITFIELD)
 350        unsigned        page_code       :6;     /* Page code - Should be 0x2b */
 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/* OnStream definitions */
 365
 366#define OS_CONFIG_PARTITION     (0xff)
 367#define OS_DATA_PARTITION       (0)
 368#define OS_PARTITION_VERSION    (1)
 369
 370/*
 371 * partition
 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 * DAT entry
 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 * DAT
 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 * Frame types
 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 * AUX
 417 */
 418typedef struct os_aux_s {
 419        __u32           format_id;              /* hardware compability AUX is based on */
 420        char            application_sig[4];     /* driver used to write this media */
 421        __u32           hdwr;                   /* reserved */
 422        __u32           update_frame_cntr;      /* for configuration frame */
 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         * __u8         app_specific[32];
 440         *
 441         * Linux specific fields:
 442         */
 443         __u32          next_mark_ppos;         /* when known, points to next marker */
 444         __u32          last_mark_lbn;          /* storing log_blk_num of last mark is extends ADR spec */
 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];             /* in ADR 1.4 __u8 track_table[16680] */
 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 * OnStream ADRL frame
 507 */
 508#define OS_FRAME_SIZE   (32 * 1024 + 512)
 509#define OS_DATA_SIZE    (32 * 1024)
 510#define OS_AUX_SIZE     (512)
 511//#define OSST_MAX_SG      2
 512
 513/* The tape buffer descriptor. */
 514typedef struct {
 515  unsigned char in_use;
 516  unsigned char dma;    /* DMA-able buffer */
 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;               /* onstream AUX structure at end of each block */
 527  unsigned short use_sg;       /* zero or number of segments for this adapter */
 528  unsigned short sg_segs;      /* total number of allocated segments */
 529  unsigned short orig_sg_segs; /* number of segments allocated at first try */
 530  struct scatterlist sg[1];    /* MUST BE last item */
 531} OSST_buffer;
 532
 533/* The tape drive descriptor */
 534typedef struct {
 535  kdev_t devt;
 536  unsigned capacity;
 537  Scsi_Device* device;
 538  struct semaphore lock;       /* for serialization */
 539  struct completion wait;      /* for SCSI commands */
 540  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  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  ST_mode modes[ST_NBR_MODES];
 558  int current_mode;
 559#ifdef CONFIG_DEVFS_FS
 560  devfs_handle_t de_r[ST_NBR_MODES];  /*  Rewind entries     */
 561  devfs_handle_t de_n[ST_NBR_MODES];  /*  No-rewind entries  */
 562#endif
 563
 564  /* Status variables */
 565  int partition;
 566  int new_partition;
 567  int nbr_partitions;    /* zero until partition support enabled */
 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;            /* from tape opening */
 586  int write_count;
 587  int read_count;
 588  int recover_erreg;            /* from last status call */
 589  /*
 590   * OnStream specific data
 591   */
 592  int      os_fw_rev;                          /* the firmware revision * 10000 */
 593  unsigned char  raw;                          /* flag OnStream raw access (32.5KB block size) */
 594  unsigned char  poll;                         /* flag that this drive needs polling (IDE|firmware) */
 595  unsigned char  frame_in_buffer;              /* flag that the frame as per frame_seq_number
 596                                                * has been read into STp->buffer and is valid */
 597  int      frame_seq_number;                   /* logical frame number */
 598  int      logical_blk_num;                    /* logical block number */
 599  unsigned first_frame_position;               /* physical frame to be transferred to/from host */
 600  unsigned last_frame_position;                /* physical frame to be transferd to/from tape */
 601  int      cur_frames;                         /* current number of frames in internal buffer */
 602  int      max_frames;                         /* max number of frames in internal buffer */
 603  char     application_sig[5];                 /* application signature */
 604  unsigned char  fast_open;                    /* flag that reminds us we didn't check headers at open */
 605  unsigned short wrt_pass_cntr;                /* write pass counter */
 606  int      update_frame_cntr;                  /* update frame counter */
 607  int      onstream_write_error;               /* write error recovery active */
 608  int      header_ok;                          /* header frame verified ok */
 609  int      linux_media;                        /* reading linux-specifc media */
 610  int      linux_media_version;
 611  os_header_t * header_cache;                  /* cache is kept for filemark positions */
 612  int      filemark_cnt;
 613  int      first_mark_ppos;
 614  int      last_mark_ppos;
 615  int      last_mark_lbn;                       /* storing log_blk_num of last mark is extends ADR spec */
 616  int      first_data_ppos;
 617  int      eod_frame_ppos;
 618  int      eod_frame_lfa;
 619  int      write_type;                          /* used in write error recovery */
 620  int      read_error_frame;                    /* used in read error recovery */
 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/* Values of write_type */
 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/* Additional rw state */
 642#define OS_WRITING_COMPLETE 3
 643
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.