Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *	$Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
  4 */
  5
  6#include <asm/byteorder.h>
  7#include <linux/completion.h>
  8#include <linux/mutex.h>
  9
 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)
 13 */
 14typedef struct {
 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;
 35
 36/*
 37 *	READ POSITION packet command - Data Format (From Table 6-57)
 38 */
 39typedef struct {
 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;
 53
 54/*
 55 *      Follows structures which are related to the SELECT SENSE / MODE SENSE
 56 *      packet commands. 
 57 */
 58#define COMPRESSION_PAGE           0x0f
 59#define COMPRESSION_PAGE_LENGTH    16
 60
 61#define CAPABILITIES_PAGE          0x2a
 62#define CAPABILITIES_PAGE_LENGTH   20
 63
 64#define TAPE_PARAMTR_PAGE          0x2b
 65#define TAPE_PARAMTR_PAGE_LENGTH   16
 66
 67#define NUMBER_RETRIES_PAGE        0x2f
 68#define NUMBER_RETRIES_PAGE_LENGTH 4
 69
 70#define BLOCK_SIZE_PAGE            0x30
 71#define BLOCK_SIZE_PAGE_LENGTH     4
 72
 73#define BUFFER_FILLING_PAGE        0x33
 74#define BUFFER_FILLING_PAGE_LENGTH 4
 75
 76#define VENDOR_IDENT_PAGE          0x36
 77#define VENDOR_IDENT_PAGE_LENGTH   8
 78
 79#define LOCATE_STATUS_PAGE         0x37
 80#define LOCATE_STATUS_PAGE_LENGTH  0
 81
 82#define MODE_HEADER_LENGTH         4
 83
 84
 85/*
 86 *	REQUEST SENSE packet command result - Data Format.
 87 */
 88typedef struct {
 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;
109
110/*
111 *      Mode Parameter Header for the MODE SENSE packet command
112 */
113typedef struct {
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;
119
120/*
121 *      Mode Parameter Block Descriptor the MODE SENSE packet command
122 *
123 *      Support for block descriptors is optional.
124 */
125typedef struct {
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;
131
132/*
133 *      The Data Compression Page, as returned by the MODE SENSE packet command.
134 */
135typedef struct {
136#if   defined(__BIG_ENDIAN_BITFIELD)
137        unsigned        ps              :1;
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 */
143        unsigned        ps              :1;
144#else
145#error "Please fix <asm/byteorder.h>"
146#endif
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 */
156#else
157#error "Please fix <asm/byteorder.h>"
158#endif
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 */
167#else
168#error "Please fix <asm/byteorder.h>"
169#endif
170        u32             ca;                     /* Compression Algorithm */
171        u32             da;                     /* Decompression Algorithm */
172        u8              reserved[4];            /* Reserved */
173} osst_data_compression_page_t;
174
175/*
176 *      The Medium Partition Page, as returned by the MODE SENSE packet command.
177 */
178typedef struct {
179#if   defined(__BIG_ENDIAN_BITFIELD)
180        unsigned        ps              :1;
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 */
186        unsigned        ps              :1;
187#else
188#error "Please fix <asm/byteorder.h>"
189#endif
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 */
205#else
206#error "Please fix <asm/byteorder.h>"
207#endif
208        u8              mfr;                    /* Medium Format Recognition */
209        u8              reserved[2];            /* Reserved */
210} osst_medium_partition_page_t;
211
212/*
213 *      Capabilities and Mechanical Status Page
214 */
215typedef struct {
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;
222#else
223#error "Please fix <asm/byteorder.h>"
224#endif
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;
237#else
238#error "Please fix <asm/byteorder.h>"
239#endif
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;
252#else
253#error "Please fix <asm/byteorder.h>"
254#endif
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 */
271#else
272#error "Please fix <asm/byteorder.h>"
273#endif
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 */
290#else
291#error "Please fix <asm/byteorder.h>"
292#endif
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;
300
301/*
302 *      Block Size Page
303 */
304typedef struct {
305#if   defined(__BIG_ENDIAN_BITFIELD)
306        unsigned        ps              :1;
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;
312        unsigned        ps              :1;
313#else
314#error "Please fix <asm/byteorder.h>"
315#endif
316        u8              page_length;            /* Page Length - Should be 2 */
317        u8              reserved2;
318#if   defined(__BIG_ENDIAN_BITFIELD)
319        unsigned        one             :1;
320        unsigned        reserved2_6     :1;
321        unsigned        record32_5      :1;
322        unsigned        record32        :1;
323        unsigned        reserved2_23    :2;
324        unsigned        play32_5        :1;
325	unsigned        play32          :1;
326#elif defined(__LITTLE_ENDIAN_BITFIELD)
327	unsigned        play32          :1;
328        unsigned        play32_5        :1;
329        unsigned        reserved2_23    :2;
330        unsigned        record32        :1;
331        unsigned        record32_5      :1;
332        unsigned        reserved2_6     :1;
333        unsigned        one             :1;
334#else
335#error "Please fix <asm/byteorder.h>"
336#endif
337} osst_block_size_page_t;
338
339/*
340 *	Tape Parameters Page
341 */
342typedef struct {
343#if   defined(__BIG_ENDIAN_BITFIELD)
344        unsigned        ps              :1;
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;
350        unsigned        ps              :1;
351#else
352#error "Please fix <asm/byteorder.h>"
353#endif
354	u8		reserved2;
355	u8		density;
356	u8		reserved3,reserved4;
357	__be16		segtrk;
358	__be16		trks;
359	u8		reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
360} osst_tape_paramtr_page_t;
361
362/* OnStream definitions */
363
364#define OS_CONFIG_PARTITION     (0xff)
365#define OS_DATA_PARTITION       (0)
366#define OS_PARTITION_VERSION    (1)
367
368/*
369 * partition
370 */
371typedef struct os_partition_s {
372        __u8    partition_num;
373        __u8    par_desc_ver;
374        __be16  wrt_pass_cntr;
375        __be32  first_frame_ppos;
376        __be32  last_frame_ppos;
377        __be32  eod_frame_ppos;
378} os_partition_t;
379
380/*
381 * DAT entry
382 */
383typedef struct os_dat_entry_s {
384        __be32  blk_sz;
385        __be16  blk_cnt;
386        __u8    flags;
387        __u8    reserved;
388} os_dat_entry_t;
389
390/*
391 * DAT
392 */
393#define OS_DAT_FLAGS_DATA       (0xc)
394#define OS_DAT_FLAGS_MARK       (0x1)
395
396typedef struct os_dat_s {
397        __u8            dat_sz;
398        __u8            reserved1;
399        __u8            entry_cnt;
400        __u8            reserved3;
401        os_dat_entry_t  dat_list[16];
402} os_dat_t;
403
404/*
405 * Frame types
406 */
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)
412
413/*
414 * AUX
415 */
416typedef 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 */
421        __u8            frame_type;
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;
429        os_dat_t        dat;
430        __u8            reserved188_191[4];
431        __be32          filemark_cnt;
432        __be32          phys_fm;
433        __be32          last_mark_ppos;
434        __u8            reserved204_223[20];
435
436        /*
437         * __u8         app_specific[32];
438         *
439         * Linux specific fields:
440         */
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];
444
445        __u8            reserved_256_511[256];
446} os_aux_t;
447
448#define OS_FM_TAB_MAX 1024
449
450typedef struct os_fm_tab_s {
451	__u8		fm_part_num;
452	__u8		reserved_1;
453	__u8		fm_tab_ent_sz;
454	__u8		reserved_3;
455	__be16		fm_tab_ent_cnt;
456	__u8		reserved6_15[10];
457	__be32		fm_tab_ent[OS_FM_TAB_MAX];
458} os_fm_tab_t;
459
460typedef struct os_ext_trk_ey_s {
461	__u8		et_part_num;
462	__u8		fmt;
463	__be16		fm_tab_off;
464	__u8		reserved4_7[4];
465	__be32		last_hlb_hi;
466	__be32		last_hlb;
467	__be32		last_pp;
468	__u8		reserved20_31[12];
469} os_ext_trk_ey_t;
470
471typedef struct os_ext_trk_tb_s {
472	__u8		nr_stream_part;
473	__u8		reserved_1;
474	__u8		et_ent_sz;
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;
478} os_ext_trk_tb_t;
479
480typedef struct os_header_s {
481        char            ident_str[8];
482        __u8            major_rev;
483        __u8            minor_rev;
484	__be16		ext_trk_tb_off;
485        __u8            reserved12_15[4];
486        __u8            pt_par_num;
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;
492	__u8		cartridge[16];
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];
500} os_header_t;
501
502
503/*
504 * OnStream ADRL frame
505 */
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
510
511/* The OnStream tape buffer descriptor. */
512struct osst_buffer {
513  unsigned char in_use;
514  unsigned char dma;	/* DMA-able buffer */
515  int buffer_size;
516  int buffer_blocks;
517  int buffer_bytes;
518  int read_pointer;
519  int writing;
520  int midlevel_result;
521  int syscall_result;
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                               */
531} ;
532
533/* The OnStream tape drive descriptor */
534struct osst_tape {
535  struct scsi_driver *driver;
536  unsigned capacity;
537  struct scsi_device *device;
538  struct mutex lock;           /* for serialization */
539  struct completion wait;      /* for SCSI commands */
540  struct osst_buffer * buffer;
541
542  /* Drive characteristics */
543  unsigned char omit_blklims;
544  unsigned char do_auto_lock;
545  unsigned char can_bsr;
546  unsigned char can_partitions;
547  unsigned char two_fm;
548  unsigned char fast_mteom;
549  unsigned char restr_dma;
550  unsigned char scsi2_logical;
551  unsigned char default_drvbuffer;  /* 0xff = don't touch, value 3 bits */
552  unsigned char pos_unknown;        /* after reset position unknown */
553  int write_threshold;
554  int timeout;			/* timeout for normal commands */
555  int long_timeout;		/* timeout for commands known to take long time*/
556
557  /* Mode characteristics */
558  struct st_modedef modes[ST_NBR_MODES];
559  int current_mode;
560
561  /* Status variables */
562  int partition;
563  int new_partition;
564  int nbr_partitions;    /* zero until partition support enabled */
565  struct st_partstat ps[ST_NBR_PARTITIONS];
566  unsigned char dirty;
567  unsigned char ready;
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;
579  int block_size;
580  int min_block;
581  int max_block;
582  int recover_count;            /* from tape opening */
583  int abort_count;
584  int write_count;
585  int read_count;
586  int recover_erreg;            /* from last status call */
587  /*
588   * OnStream specific data
589   */
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 */
610  int      filemark_cnt;
611  int      first_mark_ppos;
612  int      last_mark_ppos;
613  int      last_mark_lbn;			/* storing log_blk_num of last mark is extends ADR spec */
614  int      first_data_ppos;
615  int      eod_frame_ppos;
616  int      eod_frame_lfa;
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;
621
622#if DEBUG
623  unsigned char write_pending;
624  int nbr_finished;
625  int nbr_waits;
626  unsigned char last_cmnd[6];
627  unsigned char last_sense[16];
628#endif
629  struct gendisk *drive;
630} ;
631
632/* scsi tape command */
633struct osst_request {
634	unsigned char cmd[MAX_COMMAND_SIZE];
635	unsigned char sense[SCSI_SENSE_BUFFERSIZE];
636	int result;
637	struct osst_tape *stp;
638	struct completion *waiting;
639	struct bio *bio;
640};
641
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
649
650/* Additional rw state */
651#define OS_WRITING_COMPLETE 3