1 /* SPDX-License-Identifier: GPL-2.0 */
3 * $Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
6 #include <asm/byteorder.h>
7 #include <linux/completion.h>
8 #include <linux/mutex.h>
10 /* FIXME - rename and use the following two types or delete them!
11 * and the types really should go to st.h anyway...
12 * INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
15 unsigned device_type
:5; /* Peripheral Device Type */
16 unsigned reserved0_765
:3; /* Peripheral Qualifier - Reserved */
17 unsigned reserved1_6t0
:7; /* Reserved */
18 unsigned rmb
:1; /* Removable Medium Bit */
19 unsigned ansi_version
:3; /* ANSI Version */
20 unsigned ecma_version
:3; /* ECMA Version */
21 unsigned iso_version
:2; /* ISO Version */
22 unsigned response_format
:4; /* Response Data Format */
23 unsigned reserved3_45
:2; /* Reserved */
24 unsigned reserved3_6
:1; /* TrmIOP - Reserved */
25 unsigned reserved3_7
:1; /* AENC - Reserved */
26 u8 additional_length
; /* Additional Length (total_length-4) */
27 u8 rsv5
, rsv6
, rsv7
; /* Reserved */
28 u8 vendor_id
[8]; /* Vendor Identification */
29 u8 product_id
[16]; /* Product Identification */
30 u8 revision_level
[4]; /* Revision Level */
31 u8 vendor_specific
[20]; /* Vendor Specific - Optional */
32 u8 reserved56t95
[40]; /* Reserved - Optional */
33 /* Additional information may be returned */
34 } idetape_inquiry_result_t
;
37 * READ POSITION packet command - Data Format (From Table 6-57)
40 unsigned reserved0_10
:2; /* Reserved */
41 unsigned bpu
:1; /* Block Position Unknown */
42 unsigned reserved0_543
:3; /* Reserved */
43 unsigned eop
:1; /* End Of Partition */
44 unsigned bop
:1; /* Beginning Of Partition */
45 u8 partition
; /* Partition Number */
46 u8 reserved2
, reserved3
; /* Reserved */
47 u32 first_block
; /* First Block Location */
48 u32 last_block
; /* Last Block Location (Optional) */
49 u8 reserved12
; /* Reserved */
50 u8 blocks_in_buffer
[3]; /* Blocks In Buffer - (Optional) */
51 u32 bytes_in_buffer
; /* Bytes In Buffer (Optional) */
52 } idetape_read_position_result_t
;
55 * Follows structures which are related to the SELECT SENSE / MODE SENSE
58 #define COMPRESSION_PAGE 0x0f
59 #define COMPRESSION_PAGE_LENGTH 16
61 #define CAPABILITIES_PAGE 0x2a
62 #define CAPABILITIES_PAGE_LENGTH 20
64 #define TAPE_PARAMTR_PAGE 0x2b
65 #define TAPE_PARAMTR_PAGE_LENGTH 16
67 #define NUMBER_RETRIES_PAGE 0x2f
68 #define NUMBER_RETRIES_PAGE_LENGTH 4
70 #define BLOCK_SIZE_PAGE 0x30
71 #define BLOCK_SIZE_PAGE_LENGTH 4
73 #define BUFFER_FILLING_PAGE 0x33
74 #define BUFFER_FILLING_PAGE_LENGTH 4
76 #define VENDOR_IDENT_PAGE 0x36
77 #define VENDOR_IDENT_PAGE_LENGTH 8
79 #define LOCATE_STATUS_PAGE 0x37
80 #define LOCATE_STATUS_PAGE_LENGTH 0
82 #define MODE_HEADER_LENGTH 4
86 * REQUEST SENSE packet command result - Data Format.
89 unsigned error_code
:7; /* Current of deferred errors */
90 unsigned valid
:1; /* The information field conforms to QIC-157C */
91 u8 reserved1
:8; /* Segment Number - Reserved */
92 unsigned sense_key
:4; /* Sense Key */
93 unsigned reserved2_4
:1; /* Reserved */
94 unsigned ili
:1; /* Incorrect Length Indicator */
95 unsigned eom
:1; /* End Of Medium */
96 unsigned filemark
:1; /* Filemark */
97 u32 information
__attribute__ ((packed
));
98 u8 asl
; /* Additional sense length (n-7) */
99 u32 command_specific
; /* Additional command specific information */
100 u8 asc
; /* Additional Sense Code */
101 u8 ascq
; /* Additional Sense Code Qualifier */
102 u8 replaceable_unit_code
; /* Field Replaceable Unit Code */
103 unsigned sk_specific1
:7; /* Sense Key Specific */
104 unsigned sksv
:1; /* Sense Key Specific information is valid */
105 u8 sk_specific2
; /* Sense Key Specific */
106 u8 sk_specific3
; /* Sense Key Specific */
107 u8 pad
[2]; /* Padding to 20 bytes */
108 } idetape_request_sense_result_t
;
111 * Mode Parameter Header for the MODE SENSE packet command
114 u8 mode_data_length
; /* Length of the following data transfer */
115 u8 medium_type
; /* Medium Type */
116 u8 dsp
; /* Device Specific Parameter */
117 u8 bdl
; /* Block Descriptor Length */
118 } osst_mode_parameter_header_t
;
121 * Mode Parameter Block Descriptor the MODE SENSE packet command
123 * Support for block descriptors is optional.
126 u8 density_code
; /* Medium density code */
127 u8 blocks
[3]; /* Number of blocks */
128 u8 reserved4
; /* Reserved */
129 u8 length
[3]; /* Block Length */
130 } osst_parameter_block_descriptor_t
;
133 * The Data Compression Page, as returned by the MODE SENSE packet command.
136 #if defined(__BIG_ENDIAN_BITFIELD)
138 unsigned reserved0
:1; /* Reserved */
139 unsigned page_code
:6; /* Page Code - Should be 0xf */
140 #elif defined(__LITTLE_ENDIAN_BITFIELD)
141 unsigned page_code
:6; /* Page Code - Should be 0xf */
142 unsigned reserved0
:1; /* Reserved */
145 #error "Please fix <asm/byteorder.h>"
147 u8 page_length
; /* Page Length - Should be 14 */
148 #if defined(__BIG_ENDIAN_BITFIELD)
149 unsigned dce
:1; /* Data Compression Enable */
150 unsigned dcc
:1; /* Data Compression Capable */
151 unsigned reserved2
:6; /* Reserved */
152 #elif defined(__LITTLE_ENDIAN_BITFIELD)
153 unsigned reserved2
:6; /* Reserved */
154 unsigned dcc
:1; /* Data Compression Capable */
155 unsigned dce
:1; /* Data Compression Enable */
157 #error "Please fix <asm/byteorder.h>"
159 #if defined(__BIG_ENDIAN_BITFIELD)
160 unsigned dde
:1; /* Data Decompression Enable */
161 unsigned red
:2; /* Report Exception on Decompression */
162 unsigned reserved3
:5; /* Reserved */
163 #elif defined(__LITTLE_ENDIAN_BITFIELD)
164 unsigned reserved3
:5; /* Reserved */
165 unsigned red
:2; /* Report Exception on Decompression */
166 unsigned dde
:1; /* Data Decompression Enable */
168 #error "Please fix <asm/byteorder.h>"
170 u32 ca
; /* Compression Algorithm */
171 u32 da
; /* Decompression Algorithm */
172 u8 reserved
[4]; /* Reserved */
173 } osst_data_compression_page_t
;
176 * The Medium Partition Page, as returned by the MODE SENSE packet command.
179 #if defined(__BIG_ENDIAN_BITFIELD)
181 unsigned reserved1_6
:1; /* Reserved */
182 unsigned page_code
:6; /* Page Code - Should be 0x11 */
183 #elif defined(__LITTLE_ENDIAN_BITFIELD)
184 unsigned page_code
:6; /* Page Code - Should be 0x11 */
185 unsigned reserved1_6
:1; /* Reserved */
188 #error "Please fix <asm/byteorder.h>"
190 u8 page_length
; /* Page Length - Should be 6 */
191 u8 map
; /* Maximum Additional Partitions - Should be 0 */
192 u8 apd
; /* Additional Partitions Defined - Should be 0 */
193 #if defined(__BIG_ENDIAN_BITFIELD)
194 unsigned fdp
:1; /* Fixed Data Partitions */
195 unsigned sdp
:1; /* Should be 0 */
196 unsigned idp
:1; /* Should be 0 */
197 unsigned psum
:2; /* Should be 0 */
198 unsigned reserved4_012
:3; /* Reserved */
199 #elif defined(__LITTLE_ENDIAN_BITFIELD)
200 unsigned reserved4_012
:3; /* Reserved */
201 unsigned psum
:2; /* Should be 0 */
202 unsigned idp
:1; /* Should be 0 */
203 unsigned sdp
:1; /* Should be 0 */
204 unsigned fdp
:1; /* Fixed Data Partitions */
206 #error "Please fix <asm/byteorder.h>"
208 u8 mfr
; /* Medium Format Recognition */
209 u8 reserved
[2]; /* Reserved */
210 } osst_medium_partition_page_t
;
213 * Capabilities and Mechanical Status Page
216 #if defined(__BIG_ENDIAN_BITFIELD)
217 unsigned reserved1_67
:2;
218 unsigned page_code
:6; /* Page code - Should be 0x2a */
219 #elif defined(__LITTLE_ENDIAN_BITFIELD)
220 unsigned page_code
:6; /* Page code - Should be 0x2a */
221 unsigned reserved1_67
:2;
223 #error "Please fix <asm/byteorder.h>"
225 u8 page_length
; /* Page Length - Should be 0x12 */
226 u8 reserved2
, reserved3
;
227 #if defined(__BIG_ENDIAN_BITFIELD)
228 unsigned reserved4_67
:2;
229 unsigned sprev
:1; /* Supports SPACE in the reverse direction */
230 unsigned reserved4_1234
:4;
231 unsigned ro
:1; /* Read Only Mode */
232 #elif defined(__LITTLE_ENDIAN_BITFIELD)
233 unsigned ro
:1; /* Read Only Mode */
234 unsigned reserved4_1234
:4;
235 unsigned sprev
:1; /* Supports SPACE in the reverse direction */
236 unsigned reserved4_67
:2;
238 #error "Please fix <asm/byteorder.h>"
240 #if defined(__BIG_ENDIAN_BITFIELD)
241 unsigned reserved5_67
:2;
242 unsigned qfa
:1; /* Supports the QFA two partition formats */
243 unsigned reserved5_4
:1;
244 unsigned efmt
:1; /* Supports ERASE command initiated formatting */
245 unsigned reserved5_012
:3;
246 #elif defined(__LITTLE_ENDIAN_BITFIELD)
247 unsigned reserved5_012
:3;
248 unsigned efmt
:1; /* Supports ERASE command initiated formatting */
249 unsigned reserved5_4
:1;
250 unsigned qfa
:1; /* Supports the QFA two partition formats */
251 unsigned reserved5_67
:2;
253 #error "Please fix <asm/byteorder.h>"
255 #if defined(__BIG_ENDIAN_BITFIELD)
256 unsigned cmprs
:1; /* Supports data compression */
257 unsigned ecc
:1; /* Supports error correction */
258 unsigned reserved6_45
:2; /* Reserved */
259 unsigned eject
:1; /* The device can eject the volume */
260 unsigned prevent
:1; /* The device defaults in the prevent state after power up */
261 unsigned locked
:1; /* The volume is locked */
262 unsigned lock
:1; /* Supports locking the volume */
263 #elif defined(__LITTLE_ENDIAN_BITFIELD)
264 unsigned lock
:1; /* Supports locking the volume */
265 unsigned locked
:1; /* The volume is locked */
266 unsigned prevent
:1; /* The device defaults in the prevent state after power up */
267 unsigned eject
:1; /* The device can eject the volume */
268 unsigned reserved6_45
:2; /* Reserved */
269 unsigned ecc
:1; /* Supports error correction */
270 unsigned cmprs
:1; /* Supports data compression */
272 #error "Please fix <asm/byteorder.h>"
274 #if defined(__BIG_ENDIAN_BITFIELD)
275 unsigned blk32768
:1; /* slowb - the device restricts the byte count for PIO */
276 /* transfers for slow buffer memory ??? */
277 /* Also 32768 block size in some cases */
278 unsigned reserved7_3_6
:4;
279 unsigned blk1024
:1; /* Supports 1024 bytes block size */
280 unsigned blk512
:1; /* Supports 512 bytes block size */
281 unsigned reserved7_0
:1;
282 #elif defined(__LITTLE_ENDIAN_BITFIELD)
283 unsigned reserved7_0
:1;
284 unsigned blk512
:1; /* Supports 512 bytes block size */
285 unsigned blk1024
:1; /* Supports 1024 bytes block size */
286 unsigned reserved7_3_6
:4;
287 unsigned blk32768
:1; /* slowb - the device restricts the byte count for PIO */
288 /* transfers for slow buffer memory ??? */
289 /* Also 32768 block size in some cases */
291 #error "Please fix <asm/byteorder.h>"
293 __be16 max_speed
; /* Maximum speed supported in KBps */
294 u8 reserved10
, reserved11
;
295 __be16 ctl
; /* Continuous Transfer Limit in blocks */
296 __be16 speed
; /* Current Speed, in KBps */
297 __be16 buffer_size
; /* Buffer Size, in 512 bytes */
298 u8 reserved18
, reserved19
;
299 } osst_capabilities_page_t
;
305 #if defined(__BIG_ENDIAN_BITFIELD)
307 unsigned reserved1_6
:1;
308 unsigned page_code
:6; /* Page code - Should be 0x30 */
309 #elif defined(__LITTLE_ENDIAN_BITFIELD)
310 unsigned page_code
:6; /* Page code - Should be 0x30 */
311 unsigned reserved1_6
:1;
314 #error "Please fix <asm/byteorder.h>"
316 u8 page_length
; /* Page Length - Should be 2 */
318 #if defined(__BIG_ENDIAN_BITFIELD)
320 unsigned reserved2_6
:1;
321 unsigned record32_5
:1;
322 unsigned record32
:1;
323 unsigned reserved2_23
:2;
324 unsigned play32_5
:1;
326 #elif defined(__LITTLE_ENDIAN_BITFIELD)
328 unsigned play32_5
:1;
329 unsigned reserved2_23
:2;
330 unsigned record32
:1;
331 unsigned record32_5
:1;
332 unsigned reserved2_6
:1;
335 #error "Please fix <asm/byteorder.h>"
337 } osst_block_size_page_t
;
340 * Tape Parameters Page
343 #if defined(__BIG_ENDIAN_BITFIELD)
345 unsigned reserved1_6
:1;
346 unsigned page_code
:6; /* Page code - Should be 0x2b */
347 #elif defined(__LITTLE_ENDIAN_BITFIELD)
348 unsigned page_code
:6; /* Page code - Should be 0x2b */
349 unsigned reserved1_6
:1;
352 #error "Please fix <asm/byteorder.h>"
356 u8 reserved3
,reserved4
;
359 u8 reserved5
,reserved6
,reserved7
,reserved8
,reserved9
,reserved10
;
360 } osst_tape_paramtr_page_t
;
362 /* OnStream definitions */
364 #define OS_CONFIG_PARTITION (0xff)
365 #define OS_DATA_PARTITION (0)
366 #define OS_PARTITION_VERSION (1)
371 typedef struct os_partition_s
{
374 __be16 wrt_pass_cntr
;
375 __be32 first_frame_ppos
;
376 __be32 last_frame_ppos
;
377 __be32 eod_frame_ppos
;
383 typedef struct os_dat_entry_s
{
393 #define OS_DAT_FLAGS_DATA (0xc)
394 #define OS_DAT_FLAGS_MARK (0x1)
396 typedef struct os_dat_s
{
401 os_dat_entry_t dat_list
[16];
407 #define OS_FRAME_TYPE_FILL (0)
408 #define OS_FRAME_TYPE_EOD (1 << 0)
409 #define OS_FRAME_TYPE_MARKER (1 << 1)
410 #define OS_FRAME_TYPE_HEADER (1 << 3)
411 #define OS_FRAME_TYPE_DATA (1 << 7)
416 typedef struct os_aux_s
{
417 __be32 format_id
; /* hardware compatibility AUX is based on */
418 char application_sig
[4]; /* driver used to write this media */
419 __be32 hdwr
; /* reserved */
420 __be32 update_frame_cntr
; /* for configuration frame */
422 __u8 frame_type_reserved
;
423 __u8 reserved_18_19
[2];
424 os_partition_t partition
;
425 __u8 reserved_36_43
[8];
426 __be32 frame_seq_num
;
427 __be32 logical_blk_num_high
;
428 __be32 logical_blk_num
;
430 __u8 reserved188_191
[4];
433 __be32 last_mark_ppos
;
434 __u8 reserved204_223
[20];
437 * __u8 app_specific[32];
439 * Linux specific fields:
441 __be32 next_mark_ppos
; /* when known, points to next marker */
442 __be32 last_mark_lbn
; /* storing log_blk_num of last mark is extends ADR spec */
443 __u8 linux_specific
[24];
445 __u8 reserved_256_511
[256];
448 #define OS_FM_TAB_MAX 1024
450 typedef struct os_fm_tab_s
{
455 __be16 fm_tab_ent_cnt
;
456 __u8 reserved6_15
[10];
457 __be32 fm_tab_ent
[OS_FM_TAB_MAX
];
460 typedef struct os_ext_trk_ey_s
{
468 __u8 reserved20_31
[12];
471 typedef struct os_ext_trk_tb_s
{
475 __u8 reserved3_15
[13];
476 os_ext_trk_ey_t dat_ext_trk_ey
;
477 os_ext_trk_ey_t qfa_ext_trk_ey
;
480 typedef struct os_header_s
{
484 __be16 ext_trk_tb_off
;
485 __u8 reserved12_15
[4];
487 __u8 pt_reserved1_3
[3];
488 os_partition_t partition
[16];
489 __be32 cfg_col_width
;
490 __be32 dat_col_width
;
491 __be32 qfa_col_width
;
493 __u8 reserved304_511
[208];
494 __be32 old_filemark_list
[16680/4]; /* in ADR 1.4 __u8 track_table[16680] */
495 os_ext_trk_tb_t ext_track_tb
;
496 __u8 reserved17272_17735
[464];
497 os_fm_tab_t dat_fm_tab
;
498 os_fm_tab_t qfa_fm_tab
;
499 __u8 reserved25960_32767
[6808];
504 * OnStream ADRL frame
506 #define OS_FRAME_SIZE (32 * 1024 + 512)
507 #define OS_DATA_SIZE (32 * 1024)
508 #define OS_AUX_SIZE (512)
509 //#define OSST_MAX_SG 2
511 /* The OnStream tape buffer descriptor. */
513 unsigned char in_use
;
514 unsigned char dma
; /* DMA-able buffer */
522 struct osst_request
*last_SRpnt
;
523 struct st_cmdstatus cmdstat
;
524 struct rq_map_data map_data
;
525 unsigned char *b_data
;
526 os_aux_t
*aux
; /* onstream AUX structure at end of each block */
527 unsigned short use_sg
; /* zero or number of s/g segments for this adapter */
528 unsigned short sg_segs
; /* number of segments in s/g list */
529 unsigned short orig_sg_segs
; /* number of segments allocated at first try */
530 struct scatterlist sg
[1]; /* MUST BE last item */
533 /* The OnStream tape drive descriptor */
535 struct scsi_driver
*driver
;
537 struct scsi_device
*device
;
538 struct mutex lock
; /* for serialization */
539 struct completion wait
; /* for SCSI commands */
540 struct osst_buffer
* buffer
;
542 /* Drive characteristics */
543 unsigned char omit_blklims
;
544 unsigned char do_auto_lock
;
545 unsigned char can_bsr
;
546 unsigned char can_partitions
;
547 unsigned char two_fm
;
548 unsigned char fast_mteom
;
549 unsigned char restr_dma
;
550 unsigned char scsi2_logical
;
551 unsigned char default_drvbuffer
; /* 0xff = don't touch, value 3 bits */
552 unsigned char pos_unknown
; /* after reset position unknown */
554 int timeout
; /* timeout for normal commands */
555 int long_timeout
; /* timeout for commands known to take long time*/
557 /* Mode characteristics */
558 struct st_modedef modes
[ST_NBR_MODES
];
561 /* Status variables */
564 int nbr_partitions
; /* zero until partition support enabled */
565 struct st_partstat ps
[ST_NBR_PARTITIONS
];
568 unsigned char write_prot
;
569 unsigned char drv_write_prot
;
570 unsigned char in_use
;
571 unsigned char blksize_changed
;
572 unsigned char density_changed
;
573 unsigned char compression_changed
;
574 unsigned char drv_buffer
;
575 unsigned char density
;
576 unsigned char door_locked
;
577 unsigned char rew_at_close
;
578 unsigned char inited
;
582 int recover_count
; /* from tape opening */
586 int recover_erreg
; /* from last status call */
588 * OnStream specific data
590 int os_fw_rev
; /* the firmware revision * 10000 */
591 unsigned char raw
; /* flag OnStream raw access (32.5KB block size) */
592 unsigned char poll
; /* flag that this drive needs polling (IDE|firmware) */
593 unsigned char frame_in_buffer
; /* flag that the frame as per frame_seq_number
594 * has been read into STp->buffer and is valid */
595 int frame_seq_number
; /* logical frame number */
596 int logical_blk_num
; /* logical block number */
597 unsigned first_frame_position
; /* physical frame to be transferred to/from host */
598 unsigned last_frame_position
; /* physical frame to be transferd to/from tape */
599 int cur_frames
; /* current number of frames in internal buffer */
600 int max_frames
; /* max number of frames in internal buffer */
601 char application_sig
[5]; /* application signature */
602 unsigned char fast_open
; /* flag that reminds us we didn't check headers at open */
603 unsigned short wrt_pass_cntr
; /* write pass counter */
604 int update_frame_cntr
; /* update frame counter */
605 int onstream_write_error
; /* write error recovery active */
606 int header_ok
; /* header frame verified ok */
607 int linux_media
; /* reading linux-specifc media */
608 int linux_media_version
;
609 os_header_t
* header_cache
; /* cache is kept for filemark positions */
613 int last_mark_lbn
; /* storing log_blk_num of last mark is extends ADR spec */
617 int write_type
; /* used in write error recovery */
618 int read_error_frame
; /* used in read error recovery */
619 unsigned long cmd_start_time
;
620 unsigned long max_cmd_time
;
623 unsigned char write_pending
;
626 unsigned char last_cmnd
[6];
627 unsigned char last_sense
[16];
629 struct gendisk
*drive
;
632 /* scsi tape command */
633 struct osst_request
{
634 unsigned char cmd
[MAX_COMMAND_SIZE
];
635 unsigned char sense
[SCSI_SENSE_BUFFERSIZE
];
637 struct osst_tape
*stp
;
638 struct completion
*waiting
;
642 /* Values of write_type */
643 #define OS_WRITE_DATA 0
644 #define OS_WRITE_EOD 1
645 #define OS_WRITE_NEW_MARK 2
646 #define OS_WRITE_LAST_MARK 3
647 #define OS_WRITE_HEADER 4
648 #define OS_WRITE_FILLER 5
650 /* Additional rw state */
651 #define OS_WRITING_COMPLETE 3