| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | #include <linux/completion.h> | 
| Matthias Kaehlcke | 4390e60 | 2007-08-10 14:50:44 -0700 | [diff] [blame] | 7 | #include <linux/mutex.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 292 | __be16          max_speed;              /* Maximum speed supported in KBps */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 293 | u8              reserved10, reserved11; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 294 | __be16          ctl;                    /* Continuous Transfer Limit in blocks */ | 
|  | 295 | __be16          speed;                  /* Current Speed, in KBps */ | 
|  | 296 | __be16          buffer_size;            /* Buffer Size, in 512 bytes */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 356 | __be16		segtrk; | 
|  | 357 | __be16		trks; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 373 | __be16  wrt_pass_cntr; | 
|  | 374 | __be32  first_frame_ppos; | 
|  | 375 | __be32  last_frame_ppos; | 
|  | 376 | __be32  eod_frame_ppos; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 377 | } os_partition_t; | 
|  | 378 |  | 
|  | 379 | /* | 
|  | 380 | * DAT entry | 
|  | 381 | */ | 
|  | 382 | typedef struct os_dat_entry_s { | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 383 | __be32  blk_sz; | 
|  | 384 | __be16  blk_cnt; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 { | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 416 | __be32          format_id;              /* hardware compability AUX is based on */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 417 | char            application_sig[4];     /* driver used to write this media */ | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 418 | __be32          hdwr;                   /* reserved */ | 
|  | 419 | __be32          update_frame_cntr;      /* for configuration frame */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 425 | __be32          frame_seq_num; | 
|  | 426 | __be32          logical_blk_num_high; | 
|  | 427 | __be32          logical_blk_num; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 428 | os_dat_t        dat; | 
|  | 429 | __u8            reserved188_191[4]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 430 | __be32          filemark_cnt; | 
|  | 431 | __be32          phys_fm; | 
|  | 432 | __be32          last_mark_ppos; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 433 | __u8            reserved204_223[20]; | 
|  | 434 |  | 
|  | 435 | /* | 
|  | 436 | * __u8         app_specific[32]; | 
|  | 437 | * | 
|  | 438 | * Linux specific fields: | 
|  | 439 | */ | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 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 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 454 | __be16		fm_tab_ent_cnt; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 455 | __u8		reserved6_15[10]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 456 | __be32		fm_tab_ent[OS_FM_TAB_MAX]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 457 | } os_fm_tab_t; | 
|  | 458 |  | 
|  | 459 | typedef struct os_ext_trk_ey_s { | 
|  | 460 | __u8		et_part_num; | 
|  | 461 | __u8		fmt; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 462 | __be16		fm_tab_off; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 463 | __u8		reserved4_7[4]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 464 | __be32		last_hlb_hi; | 
|  | 465 | __be32		last_hlb; | 
|  | 466 | __be32		last_pp; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 483 | __be16		ext_trk_tb_off; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 484 | __u8            reserved12_15[4]; | 
|  | 485 | __u8            pt_par_num; | 
|  | 486 | __u8            pt_reserved1_3[3]; | 
|  | 487 | os_partition_t  partition[16]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 488 | __be32		cfg_col_width; | 
|  | 489 | __be32		dat_col_width; | 
|  | 490 | __be32		qfa_col_width; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 491 | __u8		cartridge[16]; | 
|  | 492 | __u8		reserved304_511[208]; | 
| Al Viro | 95389b8 | 2007-02-09 16:39:45 +0000 | [diff] [blame] | 493 | __be32		old_filemark_list[16680/4];		/* in ADR 1.4 __u8 track_table[16680] */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; | 
| Willem Riede | 5e6575c | 2006-02-11 14:46:56 -0500 | [diff] [blame] | 521 | struct osst_request *last_SRpnt; | 
|  | 522 | struct st_cmdstatus cmdstat; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 523 | unsigned char *b_data; | 
|  | 524 | os_aux_t *aux;               /* onstream AUX structure at end of each block     */ | 
|  | 525 | unsigned short use_sg;       /* zero or number of s/g segments for this adapter */ | 
|  | 526 | unsigned short sg_segs;      /* number of segments in s/g list                  */ | 
|  | 527 | unsigned short orig_sg_segs; /* number of segments allocated at first try       */ | 
|  | 528 | struct scatterlist sg[1];    /* MUST BE last item                               */ | 
|  | 529 | } ; | 
|  | 530 |  | 
|  | 531 | /* The OnStream tape drive descriptor */ | 
|  | 532 | struct osst_tape { | 
|  | 533 | struct scsi_driver *driver; | 
|  | 534 | unsigned capacity; | 
|  | 535 | struct scsi_device *device; | 
| Matthias Kaehlcke | 4390e60 | 2007-08-10 14:50:44 -0700 | [diff] [blame] | 536 | struct mutex lock;           /* for serialization */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 537 | struct completion wait;      /* for SCSI commands */ | 
|  | 538 | struct osst_buffer * buffer; | 
|  | 539 |  | 
|  | 540 | /* Drive characteristics */ | 
|  | 541 | unsigned char omit_blklims; | 
|  | 542 | unsigned char do_auto_lock; | 
|  | 543 | unsigned char can_bsr; | 
|  | 544 | unsigned char can_partitions; | 
|  | 545 | unsigned char two_fm; | 
|  | 546 | unsigned char fast_mteom; | 
|  | 547 | unsigned char restr_dma; | 
|  | 548 | unsigned char scsi2_logical; | 
|  | 549 | unsigned char default_drvbuffer;  /* 0xff = don't touch, value 3 bits */ | 
|  | 550 | unsigned char pos_unknown;        /* after reset position unknown */ | 
|  | 551 | int write_threshold; | 
|  | 552 | int timeout;			/* timeout for normal commands */ | 
|  | 553 | int long_timeout;		/* timeout for commands known to take long time*/ | 
|  | 554 |  | 
|  | 555 | /* Mode characteristics */ | 
|  | 556 | struct st_modedef modes[ST_NBR_MODES]; | 
|  | 557 | int current_mode; | 
|  | 558 |  | 
|  | 559 | /* Status variables */ | 
|  | 560 | int partition; | 
|  | 561 | int new_partition; | 
|  | 562 | int nbr_partitions;    /* zero until partition support enabled */ | 
|  | 563 | struct st_partstat ps[ST_NBR_PARTITIONS]; | 
|  | 564 | unsigned char dirty; | 
|  | 565 | unsigned char ready; | 
|  | 566 | unsigned char write_prot; | 
|  | 567 | unsigned char drv_write_prot; | 
|  | 568 | unsigned char in_use; | 
|  | 569 | unsigned char blksize_changed; | 
|  | 570 | unsigned char density_changed; | 
|  | 571 | unsigned char compression_changed; | 
|  | 572 | unsigned char drv_buffer; | 
|  | 573 | unsigned char density; | 
|  | 574 | unsigned char door_locked; | 
|  | 575 | unsigned char rew_at_close; | 
|  | 576 | unsigned char inited; | 
|  | 577 | int block_size; | 
|  | 578 | int min_block; | 
|  | 579 | int max_block; | 
|  | 580 | int recover_count;            /* from tape opening */ | 
|  | 581 | int abort_count; | 
|  | 582 | int write_count; | 
|  | 583 | int read_count; | 
|  | 584 | int recover_erreg;            /* from last status call */ | 
|  | 585 | /* | 
|  | 586 | * OnStream specific data | 
|  | 587 | */ | 
|  | 588 | int	   os_fw_rev;			       /* the firmware revision * 10000 */ | 
|  | 589 | unsigned char  raw;                          /* flag OnStream raw access (32.5KB block size) */ | 
|  | 590 | unsigned char  poll;                         /* flag that this drive needs polling (IDE|firmware) */ | 
|  | 591 | unsigned char  frame_in_buffer;	       /* flag that the frame as per frame_seq_number | 
|  | 592 | * has been read into STp->buffer and is valid */ | 
|  | 593 | int      frame_seq_number;                   /* logical frame number */ | 
|  | 594 | int      logical_blk_num;                    /* logical block number */ | 
|  | 595 | unsigned first_frame_position;               /* physical frame to be transferred to/from host */ | 
|  | 596 | unsigned last_frame_position;                /* physical frame to be transferd to/from tape */ | 
|  | 597 | int      cur_frames;                         /* current number of frames in internal buffer */ | 
|  | 598 | int      max_frames;                         /* max number of frames in internal buffer */ | 
|  | 599 | char     application_sig[5];                 /* application signature */ | 
|  | 600 | unsigned char  fast_open;                    /* flag that reminds us we didn't check headers at open */ | 
|  | 601 | unsigned short wrt_pass_cntr;                /* write pass counter */ | 
|  | 602 | int      update_frame_cntr;                  /* update frame counter */ | 
|  | 603 | int      onstream_write_error;               /* write error recovery active */ | 
|  | 604 | int      header_ok;                          /* header frame verified ok */ | 
|  | 605 | int      linux_media;                        /* reading linux-specifc media */ | 
|  | 606 | int      linux_media_version; | 
|  | 607 | os_header_t * header_cache;		       /* cache is kept for filemark positions */ | 
|  | 608 | int      filemark_cnt; | 
|  | 609 | int      first_mark_ppos; | 
|  | 610 | int      last_mark_ppos; | 
|  | 611 | int      last_mark_lbn;			/* storing log_blk_num of last mark is extends ADR spec */ | 
|  | 612 | int      first_data_ppos; | 
|  | 613 | int      eod_frame_ppos; | 
|  | 614 | int      eod_frame_lfa; | 
|  | 615 | int      write_type;				/* used in write error recovery */ | 
|  | 616 | int      read_error_frame;			/* used in read error recovery */ | 
|  | 617 | unsigned long cmd_start_time; | 
|  | 618 | unsigned long max_cmd_time; | 
|  | 619 |  | 
|  | 620 | #if DEBUG | 
|  | 621 | unsigned char write_pending; | 
|  | 622 | int nbr_finished; | 
|  | 623 | int nbr_waits; | 
|  | 624 | unsigned char last_cmnd[6]; | 
|  | 625 | unsigned char last_sense[16]; | 
|  | 626 | #endif | 
|  | 627 | struct gendisk *drive; | 
|  | 628 | } ; | 
|  | 629 |  | 
| Willem Riede | 5e6575c | 2006-02-11 14:46:56 -0500 | [diff] [blame] | 630 | /* scsi tape command */ | 
|  | 631 | struct osst_request { | 
|  | 632 | unsigned char cmd[MAX_COMMAND_SIZE]; | 
|  | 633 | unsigned char sense[SCSI_SENSE_BUFFERSIZE]; | 
|  | 634 | int result; | 
|  | 635 | struct osst_tape *stp; | 
|  | 636 | struct completion *waiting; | 
|  | 637 | }; | 
|  | 638 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 639 | /* Values of write_type */ | 
|  | 640 | #define OS_WRITE_DATA      0 | 
|  | 641 | #define OS_WRITE_EOD       1 | 
|  | 642 | #define OS_WRITE_NEW_MARK  2 | 
|  | 643 | #define OS_WRITE_LAST_MARK 3 | 
|  | 644 | #define OS_WRITE_HEADER    4 | 
|  | 645 | #define OS_WRITE_FILLER    5 | 
|  | 646 |  | 
|  | 647 | /* Additional rw state */ | 
|  | 648 | #define OS_WRITING_COMPLETE 3 |