|  | /* | 
|  | *	$Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $ | 
|  | */ | 
|  |  | 
|  | #include <asm/byteorder.h> | 
|  | #include <linux/completion.h> | 
|  | #include <linux/mutex.h> | 
|  |  | 
|  | /*	FIXME - rename and use the following two types or delete them! | 
|  | *              and the types really should go to st.h anyway... | 
|  | *	INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C) | 
|  | */ | 
|  | typedef struct { | 
|  | unsigned	device_type	:5;	/* Peripheral Device Type */ | 
|  | unsigned	reserved0_765	:3;	/* Peripheral Qualifier - Reserved */ | 
|  | unsigned	reserved1_6t0	:7;	/* Reserved */ | 
|  | unsigned	rmb		:1;	/* Removable Medium Bit */ | 
|  | unsigned	ansi_version	:3;	/* ANSI Version */ | 
|  | unsigned	ecma_version	:3;	/* ECMA Version */ | 
|  | unsigned	iso_version	:2;	/* ISO Version */ | 
|  | unsigned	response_format :4;	/* Response Data Format */ | 
|  | unsigned	reserved3_45	:2;	/* Reserved */ | 
|  | unsigned	reserved3_6	:1;	/* TrmIOP - Reserved */ | 
|  | unsigned	reserved3_7	:1;	/* AENC - Reserved */ | 
|  | u8		additional_length;	/* Additional Length (total_length-4) */ | 
|  | u8		rsv5, rsv6, rsv7;	/* Reserved */ | 
|  | u8		vendor_id[8];		/* Vendor Identification */ | 
|  | u8		product_id[16];		/* Product Identification */ | 
|  | u8		revision_level[4];	/* Revision Level */ | 
|  | u8		vendor_specific[20];	/* Vendor Specific - Optional */ | 
|  | u8		reserved56t95[40];	/* Reserved - Optional */ | 
|  | /* Additional information may be returned */ | 
|  | } idetape_inquiry_result_t; | 
|  |  | 
|  | /* | 
|  | *	READ POSITION packet command - Data Format (From Table 6-57) | 
|  | */ | 
|  | typedef struct { | 
|  | unsigned	reserved0_10	:2;	/* Reserved */ | 
|  | unsigned	bpu		:1;	/* Block Position Unknown */ | 
|  | unsigned	reserved0_543	:3;	/* Reserved */ | 
|  | unsigned	eop		:1;	/* End Of Partition */ | 
|  | unsigned	bop		:1;	/* Beginning Of Partition */ | 
|  | u8		partition;		/* Partition Number */ | 
|  | u8		reserved2, reserved3;	/* Reserved */ | 
|  | u32		first_block;		/* First Block Location */ | 
|  | u32		last_block;		/* Last Block Location (Optional) */ | 
|  | u8		reserved12;		/* Reserved */ | 
|  | u8		blocks_in_buffer[3];	/* Blocks In Buffer - (Optional) */ | 
|  | u32		bytes_in_buffer;	/* Bytes In Buffer (Optional) */ | 
|  | } idetape_read_position_result_t; | 
|  |  | 
|  | /* | 
|  | *      Follows structures which are related to the SELECT SENSE / MODE SENSE | 
|  | *      packet commands. | 
|  | */ | 
|  | #define COMPRESSION_PAGE           0x0f | 
|  | #define COMPRESSION_PAGE_LENGTH    16 | 
|  |  | 
|  | #define CAPABILITIES_PAGE          0x2a | 
|  | #define CAPABILITIES_PAGE_LENGTH   20 | 
|  |  | 
|  | #define TAPE_PARAMTR_PAGE          0x2b | 
|  | #define TAPE_PARAMTR_PAGE_LENGTH   16 | 
|  |  | 
|  | #define NUMBER_RETRIES_PAGE        0x2f | 
|  | #define NUMBER_RETRIES_PAGE_LENGTH 4 | 
|  |  | 
|  | #define BLOCK_SIZE_PAGE            0x30 | 
|  | #define BLOCK_SIZE_PAGE_LENGTH     4 | 
|  |  | 
|  | #define BUFFER_FILLING_PAGE        0x33 | 
|  | #define BUFFER_FILLING_PAGE_LENGTH 4 | 
|  |  | 
|  | #define VENDOR_IDENT_PAGE          0x36 | 
|  | #define VENDOR_IDENT_PAGE_LENGTH   8 | 
|  |  | 
|  | #define LOCATE_STATUS_PAGE         0x37 | 
|  | #define LOCATE_STATUS_PAGE_LENGTH  0 | 
|  |  | 
|  | #define MODE_HEADER_LENGTH         4 | 
|  |  | 
|  |  | 
|  | /* | 
|  | *	REQUEST SENSE packet command result - Data Format. | 
|  | */ | 
|  | typedef struct { | 
|  | unsigned	error_code	:7;	/* Current of deferred errors */ | 
|  | unsigned	valid		:1;	/* The information field conforms to QIC-157C */ | 
|  | u8		reserved1	:8;	/* Segment Number - Reserved */ | 
|  | unsigned	sense_key	:4;	/* Sense Key */ | 
|  | unsigned	reserved2_4	:1;	/* Reserved */ | 
|  | unsigned	ili		:1;	/* Incorrect Length Indicator */ | 
|  | unsigned	eom		:1;	/* End Of Medium */ | 
|  | unsigned	filemark 	:1;	/* Filemark */ | 
|  | u32		information __attribute__ ((packed)); | 
|  | u8		asl;			/* Additional sense length (n-7) */ | 
|  | u32		command_specific;	/* Additional command specific information */ | 
|  | u8		asc;			/* Additional Sense Code */ | 
|  | u8		ascq;			/* Additional Sense Code Qualifier */ | 
|  | u8		replaceable_unit_code;	/* Field Replaceable Unit Code */ | 
|  | unsigned	sk_specific1 	:7;	/* Sense Key Specific */ | 
|  | unsigned	sksv		:1;	/* Sense Key Specific information is valid */ | 
|  | u8		sk_specific2;		/* Sense Key Specific */ | 
|  | u8		sk_specific3;		/* Sense Key Specific */ | 
|  | u8		pad[2];			/* Padding to 20 bytes */ | 
|  | } idetape_request_sense_result_t; | 
|  |  | 
|  | /* | 
|  | *      Mode Parameter Header for the MODE SENSE packet command | 
|  | */ | 
|  | typedef struct { | 
|  | u8              mode_data_length;       /* Length of the following data transfer */ | 
|  | u8              medium_type;            /* Medium Type */ | 
|  | u8              dsp;                    /* Device Specific Parameter */ | 
|  | u8              bdl;                    /* Block Descriptor Length */ | 
|  | } osst_mode_parameter_header_t; | 
|  |  | 
|  | /* | 
|  | *      Mode Parameter Block Descriptor the MODE SENSE packet command | 
|  | * | 
|  | *      Support for block descriptors is optional. | 
|  | */ | 
|  | typedef struct { | 
|  | u8              density_code;           /* Medium density code */ | 
|  | u8              blocks[3];              /* Number of blocks */ | 
|  | u8              reserved4;              /* Reserved */ | 
|  | u8              length[3];              /* Block Length */ | 
|  | } osst_parameter_block_descriptor_t; | 
|  |  | 
|  | /* | 
|  | *      The Data Compression Page, as returned by the MODE SENSE packet command. | 
|  | */ | 
|  | typedef struct { | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        ps              :1; | 
|  | unsigned        reserved0       :1;     /* Reserved */ | 
|  | unsigned        page_code       :6;     /* Page Code - Should be 0xf */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        page_code       :6;     /* Page Code - Should be 0xf */ | 
|  | unsigned        reserved0       :1;     /* Reserved */ | 
|  | unsigned        ps              :1; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8              page_length;            /* Page Length - Should be 14 */ | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        dce             :1;     /* Data Compression Enable */ | 
|  | unsigned        dcc             :1;     /* Data Compression Capable */ | 
|  | unsigned        reserved2       :6;     /* Reserved */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        reserved2       :6;     /* Reserved */ | 
|  | unsigned        dcc             :1;     /* Data Compression Capable */ | 
|  | unsigned        dce             :1;     /* Data Compression Enable */ | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        dde             :1;     /* Data Decompression Enable */ | 
|  | unsigned        red             :2;     /* Report Exception on Decompression */ | 
|  | unsigned        reserved3       :5;     /* Reserved */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        reserved3       :5;     /* Reserved */ | 
|  | unsigned        red             :2;     /* Report Exception on Decompression */ | 
|  | unsigned        dde             :1;     /* Data Decompression Enable */ | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u32             ca;                     /* Compression Algorithm */ | 
|  | u32             da;                     /* Decompression Algorithm */ | 
|  | u8              reserved[4];            /* Reserved */ | 
|  | } osst_data_compression_page_t; | 
|  |  | 
|  | /* | 
|  | *      The Medium Partition Page, as returned by the MODE SENSE packet command. | 
|  | */ | 
|  | typedef struct { | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        ps              :1; | 
|  | unsigned        reserved1_6     :1;     /* Reserved */ | 
|  | unsigned        page_code       :6;     /* Page Code - Should be 0x11 */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        page_code       :6;     /* Page Code - Should be 0x11 */ | 
|  | unsigned        reserved1_6     :1;     /* Reserved */ | 
|  | unsigned        ps              :1; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8              page_length;            /* Page Length - Should be 6 */ | 
|  | u8              map;                    /* Maximum Additional Partitions - Should be 0 */ | 
|  | u8              apd;                    /* Additional Partitions Defined - Should be 0 */ | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        fdp             :1;     /* Fixed Data Partitions */ | 
|  | unsigned        sdp             :1;     /* Should be 0 */ | 
|  | unsigned        idp             :1;     /* Should be 0 */ | 
|  | unsigned        psum            :2;     /* Should be 0 */ | 
|  | unsigned        reserved4_012   :3;     /* Reserved */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        reserved4_012   :3;     /* Reserved */ | 
|  | unsigned        psum            :2;     /* Should be 0 */ | 
|  | unsigned        idp             :1;     /* Should be 0 */ | 
|  | unsigned        sdp             :1;     /* Should be 0 */ | 
|  | unsigned        fdp             :1;     /* Fixed Data Partitions */ | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8              mfr;                    /* Medium Format Recognition */ | 
|  | u8              reserved[2];            /* Reserved */ | 
|  | } osst_medium_partition_page_t; | 
|  |  | 
|  | /* | 
|  | *      Capabilities and Mechanical Status Page | 
|  | */ | 
|  | typedef struct { | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        reserved1_67    :2; | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x2a */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x2a */ | 
|  | unsigned        reserved1_67    :2; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8              page_length;            /* Page Length - Should be 0x12 */ | 
|  | u8              reserved2, reserved3; | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        reserved4_67    :2; | 
|  | unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */ | 
|  | unsigned        reserved4_1234  :4; | 
|  | unsigned        ro              :1;     /* Read Only Mode */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        ro              :1;     /* Read Only Mode */ | 
|  | unsigned        reserved4_1234  :4; | 
|  | unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */ | 
|  | unsigned        reserved4_67    :2; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        reserved5_67    :2; | 
|  | unsigned        qfa             :1;     /* Supports the QFA two partition formats */ | 
|  | unsigned        reserved5_4     :1; | 
|  | unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */ | 
|  | unsigned        reserved5_012   :3; | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        reserved5_012   :3; | 
|  | unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */ | 
|  | unsigned        reserved5_4     :1; | 
|  | unsigned        qfa             :1;     /* Supports the QFA two partition formats */ | 
|  | unsigned        reserved5_67    :2; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        cmprs           :1;     /* Supports data compression */ | 
|  | unsigned        ecc             :1;     /* Supports error correction */ | 
|  | unsigned        reserved6_45    :2;     /* Reserved */ | 
|  | unsigned        eject           :1;     /* The device can eject the volume */ | 
|  | unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */ | 
|  | unsigned        locked          :1;     /* The volume is locked */ | 
|  | unsigned        lock            :1;     /* Supports locking the volume */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        lock            :1;     /* Supports locking the volume */ | 
|  | unsigned        locked          :1;     /* The volume is locked */ | 
|  | unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */ | 
|  | unsigned        eject           :1;     /* The device can eject the volume */ | 
|  | unsigned        reserved6_45    :2;     /* Reserved */ | 
|  | unsigned        ecc             :1;     /* Supports error correction */ | 
|  | unsigned        cmprs           :1;     /* Supports data compression */ | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */ | 
|  | /* transfers for slow buffer memory ??? */ | 
|  | /* Also 32768 block size in some cases */ | 
|  | unsigned        reserved7_3_6   :4; | 
|  | unsigned        blk1024         :1;     /* Supports 1024 bytes block size */ | 
|  | unsigned        blk512          :1;     /* Supports 512 bytes block size */ | 
|  | unsigned        reserved7_0     :1; | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        reserved7_0     :1; | 
|  | unsigned        blk512          :1;     /* Supports 512 bytes block size */ | 
|  | unsigned        blk1024         :1;     /* Supports 1024 bytes block size */ | 
|  | unsigned        reserved7_3_6   :4; | 
|  | unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */ | 
|  | /* transfers for slow buffer memory ??? */ | 
|  | /* Also 32768 block size in some cases */ | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | __be16          max_speed;              /* Maximum speed supported in KBps */ | 
|  | u8              reserved10, reserved11; | 
|  | __be16          ctl;                    /* Continuous Transfer Limit in blocks */ | 
|  | __be16          speed;                  /* Current Speed, in KBps */ | 
|  | __be16          buffer_size;            /* Buffer Size, in 512 bytes */ | 
|  | u8              reserved18, reserved19; | 
|  | } osst_capabilities_page_t; | 
|  |  | 
|  | /* | 
|  | *      Block Size Page | 
|  | */ | 
|  | typedef struct { | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        ps              :1; | 
|  | unsigned        reserved1_6     :1; | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x30 */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x30 */ | 
|  | unsigned        reserved1_6     :1; | 
|  | unsigned        ps              :1; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8              page_length;            /* Page Length - Should be 2 */ | 
|  | u8              reserved2; | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        one             :1; | 
|  | unsigned        reserved2_6     :1; | 
|  | unsigned        record32_5      :1; | 
|  | unsigned        record32        :1; | 
|  | unsigned        reserved2_23    :2; | 
|  | unsigned        play32_5        :1; | 
|  | unsigned        play32          :1; | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        play32          :1; | 
|  | unsigned        play32_5        :1; | 
|  | unsigned        reserved2_23    :2; | 
|  | unsigned        record32        :1; | 
|  | unsigned        record32_5      :1; | 
|  | unsigned        reserved2_6     :1; | 
|  | unsigned        one             :1; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | } osst_block_size_page_t; | 
|  |  | 
|  | /* | 
|  | *	Tape Parameters Page | 
|  | */ | 
|  | typedef struct { | 
|  | #if   defined(__BIG_ENDIAN_BITFIELD) | 
|  | unsigned        ps              :1; | 
|  | unsigned        reserved1_6     :1; | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x2b */ | 
|  | #elif defined(__LITTLE_ENDIAN_BITFIELD) | 
|  | unsigned        page_code       :6;     /* Page code - Should be 0x2b */ | 
|  | unsigned        reserved1_6     :1; | 
|  | unsigned        ps              :1; | 
|  | #else | 
|  | #error "Please fix <asm/byteorder.h>" | 
|  | #endif | 
|  | u8		reserved2; | 
|  | u8		density; | 
|  | u8		reserved3,reserved4; | 
|  | __be16		segtrk; | 
|  | __be16		trks; | 
|  | u8		reserved5,reserved6,reserved7,reserved8,reserved9,reserved10; | 
|  | } osst_tape_paramtr_page_t; | 
|  |  | 
|  | /* OnStream definitions */ | 
|  |  | 
|  | #define OS_CONFIG_PARTITION     (0xff) | 
|  | #define OS_DATA_PARTITION       (0) | 
|  | #define OS_PARTITION_VERSION    (1) | 
|  |  | 
|  | /* | 
|  | * partition | 
|  | */ | 
|  | typedef struct os_partition_s { | 
|  | __u8    partition_num; | 
|  | __u8    par_desc_ver; | 
|  | __be16  wrt_pass_cntr; | 
|  | __be32  first_frame_ppos; | 
|  | __be32  last_frame_ppos; | 
|  | __be32  eod_frame_ppos; | 
|  | } os_partition_t; | 
|  |  | 
|  | /* | 
|  | * DAT entry | 
|  | */ | 
|  | typedef struct os_dat_entry_s { | 
|  | __be32  blk_sz; | 
|  | __be16  blk_cnt; | 
|  | __u8    flags; | 
|  | __u8    reserved; | 
|  | } os_dat_entry_t; | 
|  |  | 
|  | /* | 
|  | * DAT | 
|  | */ | 
|  | #define OS_DAT_FLAGS_DATA       (0xc) | 
|  | #define OS_DAT_FLAGS_MARK       (0x1) | 
|  |  | 
|  | typedef struct os_dat_s { | 
|  | __u8            dat_sz; | 
|  | __u8            reserved1; | 
|  | __u8            entry_cnt; | 
|  | __u8            reserved3; | 
|  | os_dat_entry_t  dat_list[16]; | 
|  | } os_dat_t; | 
|  |  | 
|  | /* | 
|  | * Frame types | 
|  | */ | 
|  | #define OS_FRAME_TYPE_FILL      (0) | 
|  | #define OS_FRAME_TYPE_EOD       (1 << 0) | 
|  | #define OS_FRAME_TYPE_MARKER    (1 << 1) | 
|  | #define OS_FRAME_TYPE_HEADER    (1 << 3) | 
|  | #define OS_FRAME_TYPE_DATA      (1 << 7) | 
|  |  | 
|  | /* | 
|  | * AUX | 
|  | */ | 
|  | typedef struct os_aux_s { | 
|  | __be32          format_id;              /* hardware compatibility AUX is based on */ | 
|  | char            application_sig[4];     /* driver used to write this media */ | 
|  | __be32          hdwr;                   /* reserved */ | 
|  | __be32          update_frame_cntr;      /* for configuration frame */ | 
|  | __u8            frame_type; | 
|  | __u8            frame_type_reserved; | 
|  | __u8            reserved_18_19[2]; | 
|  | os_partition_t  partition; | 
|  | __u8            reserved_36_43[8]; | 
|  | __be32          frame_seq_num; | 
|  | __be32          logical_blk_num_high; | 
|  | __be32          logical_blk_num; | 
|  | os_dat_t        dat; | 
|  | __u8            reserved188_191[4]; | 
|  | __be32          filemark_cnt; | 
|  | __be32          phys_fm; | 
|  | __be32          last_mark_ppos; | 
|  | __u8            reserved204_223[20]; | 
|  |  | 
|  | /* | 
|  | * __u8         app_specific[32]; | 
|  | * | 
|  | * Linux specific fields: | 
|  | */ | 
|  | __be32         next_mark_ppos;         /* when known, points to next marker */ | 
|  | __be32		last_mark_lbn;		/* storing log_blk_num of last mark is extends ADR spec */ | 
|  | __u8           linux_specific[24]; | 
|  |  | 
|  | __u8            reserved_256_511[256]; | 
|  | } os_aux_t; | 
|  |  | 
|  | #define OS_FM_TAB_MAX 1024 | 
|  |  | 
|  | typedef struct os_fm_tab_s { | 
|  | __u8		fm_part_num; | 
|  | __u8		reserved_1; | 
|  | __u8		fm_tab_ent_sz; | 
|  | __u8		reserved_3; | 
|  | __be16		fm_tab_ent_cnt; | 
|  | __u8		reserved6_15[10]; | 
|  | __be32		fm_tab_ent[OS_FM_TAB_MAX]; | 
|  | } os_fm_tab_t; | 
|  |  | 
|  | typedef struct os_ext_trk_ey_s { | 
|  | __u8		et_part_num; | 
|  | __u8		fmt; | 
|  | __be16		fm_tab_off; | 
|  | __u8		reserved4_7[4]; | 
|  | __be32		last_hlb_hi; | 
|  | __be32		last_hlb; | 
|  | __be32		last_pp; | 
|  | __u8		reserved20_31[12]; | 
|  | } os_ext_trk_ey_t; | 
|  |  | 
|  | typedef struct os_ext_trk_tb_s { | 
|  | __u8		nr_stream_part; | 
|  | __u8		reserved_1; | 
|  | __u8		et_ent_sz; | 
|  | __u8		reserved3_15[13]; | 
|  | os_ext_trk_ey_t	dat_ext_trk_ey; | 
|  | os_ext_trk_ey_t	qfa_ext_trk_ey; | 
|  | } os_ext_trk_tb_t; | 
|  |  | 
|  | typedef struct os_header_s { | 
|  | char            ident_str[8]; | 
|  | __u8            major_rev; | 
|  | __u8            minor_rev; | 
|  | __be16		ext_trk_tb_off; | 
|  | __u8            reserved12_15[4]; | 
|  | __u8            pt_par_num; | 
|  | __u8            pt_reserved1_3[3]; | 
|  | os_partition_t  partition[16]; | 
|  | __be32		cfg_col_width; | 
|  | __be32		dat_col_width; | 
|  | __be32		qfa_col_width; | 
|  | __u8		cartridge[16]; | 
|  | __u8		reserved304_511[208]; | 
|  | __be32		old_filemark_list[16680/4];		/* in ADR 1.4 __u8 track_table[16680] */ | 
|  | os_ext_trk_tb_t	ext_track_tb; | 
|  | __u8		reserved17272_17735[464]; | 
|  | os_fm_tab_t	dat_fm_tab; | 
|  | os_fm_tab_t	qfa_fm_tab; | 
|  | __u8		reserved25960_32767[6808]; | 
|  | } os_header_t; | 
|  |  | 
|  |  | 
|  | /* | 
|  | * OnStream ADRL frame | 
|  | */ | 
|  | #define OS_FRAME_SIZE   (32 * 1024 + 512) | 
|  | #define OS_DATA_SIZE    (32 * 1024) | 
|  | #define OS_AUX_SIZE     (512) | 
|  | //#define OSST_MAX_SG      2 | 
|  |  | 
|  | /* The OnStream tape buffer descriptor. */ | 
|  | struct osst_buffer { | 
|  | unsigned char in_use; | 
|  | unsigned char dma;	/* DMA-able buffer */ | 
|  | int buffer_size; | 
|  | int buffer_blocks; | 
|  | int buffer_bytes; | 
|  | int read_pointer; | 
|  | int writing; | 
|  | int midlevel_result; | 
|  | int syscall_result; | 
|  | struct osst_request *last_SRpnt; | 
|  | struct st_cmdstatus cmdstat; | 
|  | struct rq_map_data map_data; | 
|  | unsigned char *b_data; | 
|  | os_aux_t *aux;               /* onstream AUX structure at end of each block     */ | 
|  | unsigned short use_sg;       /* zero or number of s/g segments for this adapter */ | 
|  | unsigned short sg_segs;      /* number of segments in s/g list                  */ | 
|  | unsigned short orig_sg_segs; /* number of segments allocated at first try       */ | 
|  | struct scatterlist sg[1];    /* MUST BE last item                               */ | 
|  | } ; | 
|  |  | 
|  | /* The OnStream tape drive descriptor */ | 
|  | struct osst_tape { | 
|  | struct scsi_driver *driver; | 
|  | unsigned capacity; | 
|  | struct scsi_device *device; | 
|  | struct mutex lock;           /* for serialization */ | 
|  | struct completion wait;      /* for SCSI commands */ | 
|  | struct osst_buffer * buffer; | 
|  |  | 
|  | /* Drive characteristics */ | 
|  | unsigned char omit_blklims; | 
|  | unsigned char do_auto_lock; | 
|  | unsigned char can_bsr; | 
|  | unsigned char can_partitions; | 
|  | unsigned char two_fm; | 
|  | unsigned char fast_mteom; | 
|  | unsigned char restr_dma; | 
|  | unsigned char scsi2_logical; | 
|  | unsigned char default_drvbuffer;  /* 0xff = don't touch, value 3 bits */ | 
|  | unsigned char pos_unknown;        /* after reset position unknown */ | 
|  | int write_threshold; | 
|  | int timeout;			/* timeout for normal commands */ | 
|  | int long_timeout;		/* timeout for commands known to take long time*/ | 
|  |  | 
|  | /* Mode characteristics */ | 
|  | struct st_modedef modes[ST_NBR_MODES]; | 
|  | int current_mode; | 
|  |  | 
|  | /* Status variables */ | 
|  | int partition; | 
|  | int new_partition; | 
|  | int nbr_partitions;    /* zero until partition support enabled */ | 
|  | struct st_partstat ps[ST_NBR_PARTITIONS]; | 
|  | unsigned char dirty; | 
|  | unsigned char ready; | 
|  | unsigned char write_prot; | 
|  | unsigned char drv_write_prot; | 
|  | unsigned char in_use; | 
|  | unsigned char blksize_changed; | 
|  | unsigned char density_changed; | 
|  | unsigned char compression_changed; | 
|  | unsigned char drv_buffer; | 
|  | unsigned char density; | 
|  | unsigned char door_locked; | 
|  | unsigned char rew_at_close; | 
|  | unsigned char inited; | 
|  | int block_size; | 
|  | int min_block; | 
|  | int max_block; | 
|  | int recover_count;            /* from tape opening */ | 
|  | int abort_count; | 
|  | int write_count; | 
|  | int read_count; | 
|  | int recover_erreg;            /* from last status call */ | 
|  | /* | 
|  | * OnStream specific data | 
|  | */ | 
|  | int	   os_fw_rev;			       /* the firmware revision * 10000 */ | 
|  | unsigned char  raw;                          /* flag OnStream raw access (32.5KB block size) */ | 
|  | unsigned char  poll;                         /* flag that this drive needs polling (IDE|firmware) */ | 
|  | unsigned char  frame_in_buffer;	       /* flag that the frame as per frame_seq_number | 
|  | * has been read into STp->buffer and is valid */ | 
|  | int      frame_seq_number;                   /* logical frame number */ | 
|  | int      logical_blk_num;                    /* logical block number */ | 
|  | unsigned first_frame_position;               /* physical frame to be transferred to/from host */ | 
|  | unsigned last_frame_position;                /* physical frame to be transferd to/from tape */ | 
|  | int      cur_frames;                         /* current number of frames in internal buffer */ | 
|  | int      max_frames;                         /* max number of frames in internal buffer */ | 
|  | char     application_sig[5];                 /* application signature */ | 
|  | unsigned char  fast_open;                    /* flag that reminds us we didn't check headers at open */ | 
|  | unsigned short wrt_pass_cntr;                /* write pass counter */ | 
|  | int      update_frame_cntr;                  /* update frame counter */ | 
|  | int      onstream_write_error;               /* write error recovery active */ | 
|  | int      header_ok;                          /* header frame verified ok */ | 
|  | int      linux_media;                        /* reading linux-specifc media */ | 
|  | int      linux_media_version; | 
|  | os_header_t * header_cache;		       /* cache is kept for filemark positions */ | 
|  | int      filemark_cnt; | 
|  | int      first_mark_ppos; | 
|  | int      last_mark_ppos; | 
|  | int      last_mark_lbn;			/* storing log_blk_num of last mark is extends ADR spec */ | 
|  | int      first_data_ppos; | 
|  | int      eod_frame_ppos; | 
|  | int      eod_frame_lfa; | 
|  | int      write_type;				/* used in write error recovery */ | 
|  | int      read_error_frame;			/* used in read error recovery */ | 
|  | unsigned long cmd_start_time; | 
|  | unsigned long max_cmd_time; | 
|  |  | 
|  | #if DEBUG | 
|  | unsigned char write_pending; | 
|  | int nbr_finished; | 
|  | int nbr_waits; | 
|  | unsigned char last_cmnd[6]; | 
|  | unsigned char last_sense[16]; | 
|  | #endif | 
|  | struct gendisk *drive; | 
|  | } ; | 
|  |  | 
|  | /* scsi tape command */ | 
|  | struct osst_request { | 
|  | unsigned char cmd[MAX_COMMAND_SIZE]; | 
|  | unsigned char sense[SCSI_SENSE_BUFFERSIZE]; | 
|  | int result; | 
|  | struct osst_tape *stp; | 
|  | struct completion *waiting; | 
|  | struct bio *bio; | 
|  | }; | 
|  |  | 
|  | /* Values of write_type */ | 
|  | #define OS_WRITE_DATA      0 | 
|  | #define OS_WRITE_EOD       1 | 
|  | #define OS_WRITE_NEW_MARK  2 | 
|  | #define OS_WRITE_LAST_MARK 3 | 
|  | #define OS_WRITE_HEADER    4 | 
|  | #define OS_WRITE_FILLER    5 | 
|  |  | 
|  | /* Additional rw state */ | 
|  | #define OS_WRITING_COMPLETE 3 |