Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
osst.h
Go to the documentation of this file.
1 /*
2  * $Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
3  */
4 
5 #include <asm/byteorder.h>
6 #include <linux/completion.h>
7 #include <linux/mutex.h>
8 
9 /* FIXME - rename and use the following two types or delete them!
10  * and the types really should go to st.h anyway...
11  * INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
12  */
13 typedef struct {
14  unsigned device_type :5; /* Peripheral Device Type */
15  unsigned reserved0_765 :3; /* Peripheral Qualifier - Reserved */
16  unsigned reserved1_6t0 :7; /* Reserved */
17  unsigned rmb :1; /* Removable Medium Bit */
18  unsigned ansi_version :3; /* ANSI Version */
19  unsigned ecma_version :3; /* ECMA Version */
20  unsigned iso_version :2; /* ISO Version */
21  unsigned response_format :4; /* Response Data Format */
22  unsigned reserved3_45 :2; /* Reserved */
23  unsigned reserved3_6 :1; /* TrmIOP - Reserved */
24  unsigned reserved3_7 :1; /* AENC - Reserved */
25  u8 additional_length; /* Additional Length (total_length-4) */
26  u8 rsv5, rsv6, rsv7; /* Reserved */
27  u8 vendor_id[8]; /* Vendor Identification */
28  u8 product_id[16]; /* Product Identification */
29  u8 revision_level[4]; /* Revision Level */
30  u8 vendor_specific[20]; /* Vendor Specific - Optional */
31  u8 reserved56t95[40]; /* Reserved - Optional */
32  /* Additional information may be returned */
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) */
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 */
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 */
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 */
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 */
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 */
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 */
226 #if defined(__BIG_ENDIAN_BITFIELD)
227  unsigned reserved4_67 :2;
228  unsigned sprev :1; /* Supports SPACE in the reverse direction */
229  unsigned reserved4_1234 :4;
230  unsigned ro :1; /* Read Only Mode */
231 #elif defined(__LITTLE_ENDIAN_BITFIELD)
232  unsigned ro :1; /* Read Only Mode */
233  unsigned reserved4_1234 :4;
234  unsigned sprev :1; /* Supports SPACE in the reverse direction */
235  unsigned reserved4_67 :2;
236 #else
237 #error "Please fix <asm/byteorder.h>"
238 #endif
239 #if defined(__BIG_ENDIAN_BITFIELD)
240  unsigned reserved5_67 :2;
241  unsigned qfa :1; /* Supports the QFA two partition formats */
242  unsigned reserved5_4 :1;
243  unsigned efmt :1; /* Supports ERASE command initiated formatting */
244  unsigned reserved5_012 :3;
245 #elif defined(__LITTLE_ENDIAN_BITFIELD)
246  unsigned reserved5_012 :3;
247  unsigned efmt :1; /* Supports ERASE command initiated formatting */
248  unsigned reserved5_4 :1;
249  unsigned qfa :1; /* Supports the QFA two partition formats */
250  unsigned reserved5_67 :2;
251 #else
252 #error "Please fix <asm/byteorder.h>"
253 #endif
254 #if defined(__BIG_ENDIAN_BITFIELD)
255  unsigned cmprs :1; /* Supports data compression */
256  unsigned ecc :1; /* Supports error correction */
257  unsigned reserved6_45 :2; /* Reserved */
258  unsigned eject :1; /* The device can eject the volume */
259  unsigned prevent :1; /* The device defaults in the prevent state after power up */
260  unsigned locked :1; /* The volume is locked */
261  unsigned lock :1; /* Supports locking the volume */
262 #elif defined(__LITTLE_ENDIAN_BITFIELD)
263  unsigned lock :1; /* Supports locking the volume */
264  unsigned locked :1; /* The volume is locked */
265  unsigned prevent :1; /* The device defaults in the prevent state after power up */
266  unsigned eject :1; /* The device can eject the volume */
267  unsigned reserved6_45 :2; /* Reserved */
268  unsigned ecc :1; /* Supports error correction */
269  unsigned cmprs :1; /* Supports data compression */
270 #else
271 #error "Please fix <asm/byteorder.h>"
272 #endif
273 #if defined(__BIG_ENDIAN_BITFIELD)
274  unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
275  /* transfers for slow buffer memory ??? */
276  /* Also 32768 block size in some cases */
277  unsigned reserved7_3_6 :4;
278  unsigned blk1024 :1; /* Supports 1024 bytes block size */
279  unsigned blk512 :1; /* Supports 512 bytes block size */
280  unsigned reserved7_0 :1;
281 #elif defined(__LITTLE_ENDIAN_BITFIELD)
282  unsigned reserved7_0 :1;
283  unsigned blk512 :1; /* Supports 512 bytes block size */
284  unsigned blk1024 :1; /* Supports 1024 bytes block size */
285  unsigned reserved7_3_6 :4;
286  unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */
287  /* transfers for slow buffer memory ??? */
288  /* Also 32768 block size in some cases */
289 #else
290 #error "Please fix <asm/byteorder.h>"
291 #endif
292  __be16 max_speed; /* Maximum speed supported in KBps */
294  __be16 ctl; /* Continuous Transfer Limit in blocks */
295  __be16 speed; /* Current Speed, in KBps */
296  __be16 buffer_size; /* Buffer Size, in 512 bytes */
297  u8 reserved18, reserved19;
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 */
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
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
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 {
378 
379 /*
380  * DAT entry
381  */
382 typedef struct os_dat_entry_s {
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 {
401 } os_dat_t;
402 
403 /*
404  * Frame types
405  */
406 #define OS_FRAME_TYPE_FILL (0)
407 #define OS_FRAME_TYPE_EOD (1 << 0)
408 #define OS_FRAME_TYPE_MARKER (1 << 1)
409 #define OS_FRAME_TYPE_HEADER (1 << 3)
410 #define OS_FRAME_TYPE_DATA (1 << 7)
411 
412 /*
413  * AUX
414  */
415 typedef struct os_aux_s {
416  __be32 format_id; /* hardware compatibility AUX is based on */
417  char application_sig[4]; /* driver used to write this media */
418  __be32 hdwr; /* reserved */
419  __be32 update_frame_cntr; /* for configuration frame */
434 
435  /*
436  * __u8 app_specific[32];
437  *
438  * Linux specific fields:
439  */
440  __be32 next_mark_ppos; /* when known, points to next marker */
441  __be32 last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
443 
445 } os_aux_t;
446 
447 #define OS_FM_TAB_MAX 1024
448 
449 typedef struct os_fm_tab_s {
457 } os_fm_tab_t;
458 
459 typedef struct os_ext_trk_ey_s {
469 
470 typedef struct os_ext_trk_tb_s {
478 
479 typedef struct os_header_s {
480  char ident_str[8];
493  __be32 old_filemark_list[16680/4]; /* in ADR 1.4 __u8 track_table[16680] */
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 */
518  int writing;
523  struct rq_map_data map_data;
524  unsigned char *b_data;
525  os_aux_t *aux; /* onstream AUX structure at end of each block */
526  unsigned short use_sg; /* zero or number of s/g segments for this adapter */
527  unsigned short sg_segs; /* number of segments in s/g list */
528  unsigned short orig_sg_segs; /* number of segments allocated at first try */
529  struct scatterlist sg[1]; /* MUST BE last item */
530 } ;
531 
532 /* The OnStream tape drive descriptor */
533 struct osst_tape {
535  unsigned capacity;
537  struct mutex lock; /* for serialization */
538  struct completion wait; /* for SCSI commands */
539  struct osst_buffer * buffer;
540 
541  /* Drive characteristics */
542  unsigned char omit_blklims;
543  unsigned char do_auto_lock;
544  unsigned char can_bsr;
545  unsigned char can_partitions;
546  unsigned char two_fm;
547  unsigned char fast_mteom;
548  unsigned char restr_dma;
549  unsigned char scsi2_logical;
550  unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */
551  unsigned char pos_unknown; /* after reset position unknown */
553  int timeout; /* timeout for normal commands */
554  int long_timeout; /* timeout for commands known to take long time*/
555 
556  /* Mode characteristics */
559 
560  /* Status variables */
563  int nbr_partitions; /* zero until partition support enabled */
565  unsigned char dirty;
566  unsigned char ready;
567  unsigned char write_prot;
568  unsigned char drv_write_prot;
569  unsigned char in_use;
570  unsigned char blksize_changed;
571  unsigned char density_changed;
572  unsigned char compression_changed;
573  unsigned char drv_buffer;
574  unsigned char density;
575  unsigned char door_locked;
576  unsigned char rew_at_close;
577  unsigned char inited;
581  int recover_count; /* from tape opening */
585  int recover_erreg; /* from last status call */
586  /*
587  * OnStream specific data
588  */
589  int os_fw_rev; /* the firmware revision * 10000 */
590  unsigned char raw; /* flag OnStream raw access (32.5KB block size) */
591  unsigned char poll; /* flag that this drive needs polling (IDE|firmware) */
592  unsigned char frame_in_buffer; /* flag that the frame as per frame_seq_number
593  * has been read into STp->buffer and is valid */
594  int frame_seq_number; /* logical frame number */
595  int logical_blk_num; /* logical block number */
596  unsigned first_frame_position; /* physical frame to be transferred to/from host */
597  unsigned last_frame_position; /* physical frame to be transferd to/from tape */
598  int cur_frames; /* current number of frames in internal buffer */
599  int max_frames; /* max number of frames in internal buffer */
600  char application_sig[5]; /* application signature */
601  unsigned char fast_open; /* flag that reminds us we didn't check headers at open */
602  unsigned short wrt_pass_cntr; /* write pass counter */
603  int update_frame_cntr; /* update frame counter */
604  int onstream_write_error; /* write error recovery active */
605  int header_ok; /* header frame verified ok */
606  int linux_media; /* reading linux-specifc media */
608  os_header_t * header_cache; /* cache is kept for filemark positions */
612  int last_mark_lbn; /* storing log_blk_num of last mark is extends ADR spec */
616  int write_type; /* used in write error recovery */
617  int read_error_frame; /* used in read error recovery */
618  unsigned long cmd_start_time;
619  unsigned long max_cmd_time;
620 
621 #if DEBUG
622  unsigned char write_pending;
623  int nbr_finished;
624  int nbr_waits;
625  unsigned char last_cmnd[6];
626  unsigned char last_sense[16];
627 #endif
628  struct gendisk *drive;
629 } ;
630 
631 /* scsi tape command */
632 struct osst_request {
633  unsigned char cmd[MAX_COMMAND_SIZE];
634  unsigned char sense[SCSI_SENSE_BUFFERSIZE];
635  int result;
636  struct osst_tape *stp;
638  struct bio *bio;
639 };
640 
641 /* Values of write_type */
642 #define OS_WRITE_DATA 0
643 #define OS_WRITE_EOD 1
644 #define OS_WRITE_NEW_MARK 2
645 #define OS_WRITE_LAST_MARK 3
646 #define OS_WRITE_HEADER 4
647 #define OS_WRITE_FILLER 5
648 
649 /* Additional rw state */
650 #define OS_WRITING_COMPLETE 3