11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	$Header: /cvsroot/osst/Driver/osst.h,v 1.16 2005/01/01 21:13:35 wriede Exp $
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/byteorder.h>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/completion.h>
74390e60163979621f59e3a25a260289986eacb85Matthias Kaehlcke#include <linux/mutex.h>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	FIXME - rename and use the following two types or delete them!
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              and the types really should go to st.h anyway...
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	device_type	:5;	/* Peripheral Device Type */
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved0_765	:3;	/* Peripheral Qualifier - Reserved */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved1_6t0	:7;	/* Reserved */
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	rmb		:1;	/* Removable Medium Bit */
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	ansi_version	:3;	/* ANSI Version */
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	ecma_version	:3;	/* ECMA Version */
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	iso_version	:2;	/* ISO Version */
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	response_format :4;	/* Response Data Format */
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved3_45	:2;	/* Reserved */
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved3_6	:1;	/* TrmIOP - Reserved */
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved3_7	:1;	/* AENC - Reserved */
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		additional_length;	/* Additional Length (total_length-4) */
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		rsv5, rsv6, rsv7;	/* Reserved */
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		vendor_id[8];		/* Vendor Identification */
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		product_id[16];		/* Product Identification */
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		revision_level[4];	/* Revision Level */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		vendor_specific[20];	/* Vendor Specific - Optional */
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved56t95[40];	/* Reserved - Optional */
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						/* Additional information may be returned */
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} idetape_inquiry_result_t;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	READ POSITION packet command - Data Format (From Table 6-57)
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved0_10	:2;	/* Reserved */
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	bpu		:1;	/* Block Position Unknown */
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved0_543	:3;	/* Reserved */
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	eop		:1;	/* End Of Partition */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	bop		:1;	/* Beginning Of Partition */
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		partition;		/* Partition Number */
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved2, reserved3;	/* Reserved */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32		first_block;		/* First Block Location */
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32		last_block;		/* Last Block Location (Optional) */
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved12;		/* Reserved */
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		blocks_in_buffer[3];	/* Blocks In Buffer - (Optional) */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32		bytes_in_buffer;	/* Bytes In Buffer (Optional) */
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} idetape_read_position_result_t;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Follows structures which are related to the SELECT SENSE / MODE SENSE
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      packet commands.
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPRESSION_PAGE           0x0f
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define COMPRESSION_PAGE_LENGTH    16
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CAPABILITIES_PAGE          0x2a
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CAPABILITIES_PAGE_LENGTH   20
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TAPE_PARAMTR_PAGE          0x2b
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TAPE_PARAMTR_PAGE_LENGTH   16
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NUMBER_RETRIES_PAGE        0x2f
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NUMBER_RETRIES_PAGE_LENGTH 4
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BLOCK_SIZE_PAGE            0x30
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BLOCK_SIZE_PAGE_LENGTH     4
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUFFER_FILLING_PAGE        0x33
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUFFER_FILLING_PAGE_LENGTH 4
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VENDOR_IDENT_PAGE          0x36
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VENDOR_IDENT_PAGE_LENGTH   8
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOCATE_STATUS_PAGE         0x37
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define LOCATE_STATUS_PAGE_LENGTH  0
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MODE_HEADER_LENGTH         4
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	REQUEST SENSE packet command result - Data Format.
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	error_code	:7;	/* Current of deferred errors */
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	valid		:1;	/* The information field conforms to QIC-157C */
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved1	:8;	/* Segment Number - Reserved */
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	sense_key	:4;	/* Sense Key */
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	reserved2_4	:1;	/* Reserved */
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	ili		:1;	/* Incorrect Length Indicator */
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	eom		:1;	/* End Of Medium */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	filemark 	:1;	/* Filemark */
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32		information __attribute__ ((packed));
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		asl;			/* Additional sense length (n-7) */
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32		command_specific;	/* Additional command specific information */
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		asc;			/* Additional Sense Code */
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		ascq;			/* Additional Sense Code Qualifier */
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		replaceable_unit_code;	/* Field Replaceable Unit Code */
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	sk_specific1 	:7;	/* Sense Key Specific */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned	sksv		:1;	/* Sense Key Specific information is valid */
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		sk_specific2;		/* Sense Key Specific */
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		sk_specific3;		/* Sense Key Specific */
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		pad[2];			/* Padding to 20 bytes */
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} idetape_request_sense_result_t;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Mode Parameter Header for the MODE SENSE packet command
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              mode_data_length;       /* Length of the following data transfer */
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              medium_type;            /* Medium Type */
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              dsp;                    /* Device Specific Parameter */
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              bdl;                    /* Block Descriptor Length */
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_mode_parameter_header_t;
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Mode Parameter Block Descriptor the MODE SENSE packet command
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Support for block descriptors is optional.
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              density_code;           /* Medium density code */
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              blocks[3];              /* Number of blocks */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved4;              /* Reserved */
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              length[3];              /* Block Length */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_parameter_block_descriptor_t;
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      The Data Compression Page, as returned by the MODE SENSE packet command.
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved0       :1;     /* Reserved */
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page Code - Should be 0xf */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page Code - Should be 0xf */
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved0       :1;     /* Reserved */
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              page_length;            /* Page Length - Should be 14 */
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dce             :1;     /* Data Compression Enable */
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dcc             :1;     /* Data Compression Capable */
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved2       :6;     /* Reserved */
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved2       :6;     /* Reserved */
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dcc             :1;     /* Data Compression Capable */
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dce             :1;     /* Data Compression Enable */
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dde             :1;     /* Data Decompression Enable */
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        red             :2;     /* Report Exception on Decompression */
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved3       :5;     /* Reserved */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved3       :5;     /* Reserved */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        red             :2;     /* Report Exception on Decompression */
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        dde             :1;     /* Data Decompression Enable */
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u32             ca;                     /* Compression Algorithm */
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u32             da;                     /* Decompression Algorithm */
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved[4];            /* Reserved */
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_data_compression_page_t;
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      The Medium Partition Page, as returned by the MODE SENSE packet command.
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;     /* Reserved */
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page Code - Should be 0x11 */
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page Code - Should be 0x11 */
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;     /* Reserved */
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              page_length;            /* Page Length - Should be 6 */
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              map;                    /* Maximum Additional Partitions - Should be 0 */
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              apd;                    /* Additional Partitions Defined - Should be 0 */
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        fdp             :1;     /* Fixed Data Partitions */
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        sdp             :1;     /* Should be 0 */
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        idp             :1;     /* Should be 0 */
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        psum            :2;     /* Should be 0 */
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved4_012   :3;     /* Reserved */
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved4_012   :3;     /* Reserved */
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        psum            :2;     /* Should be 0 */
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        idp             :1;     /* Should be 0 */
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        sdp             :1;     /* Should be 0 */
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        fdp             :1;     /* Fixed Data Partitions */
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              mfr;                    /* Medium Format Recognition */
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved[2];            /* Reserved */
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_medium_partition_page_t;
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Capabilities and Mechanical Status Page
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_67    :2;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x2a */
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x2a */
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_67    :2;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              page_length;            /* Page Length - Should be 0x12 */
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved2, reserved3;
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved4_67    :2;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved4_1234  :4;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        ro              :1;     /* Read Only Mode */
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        ro              :1;     /* Read Only Mode */
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved4_1234  :4;
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved4_67    :2;
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved5_67    :2;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        qfa             :1;     /* Supports the QFA two partition formats */
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved5_4     :1;
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved5_012   :3;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved5_012   :3;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved5_4     :1;
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        qfa             :1;     /* Supports the QFA two partition formats */
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved5_67    :2;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        cmprs           :1;     /* Supports data compression */
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ecc             :1;     /* Supports error correction */
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved6_45    :2;     /* Reserved */
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        eject           :1;     /* The device can eject the volume */
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        locked          :1;     /* The volume is locked */
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        lock            :1;     /* Supports locking the volume */
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        lock            :1;     /* Supports locking the volume */
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        locked          :1;     /* The volume is locked */
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        eject           :1;     /* The device can eject the volume */
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved6_45    :2;     /* Reserved */
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ecc             :1;     /* Supports error correction */
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        cmprs           :1;     /* Supports data compression */
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                /* transfers for slow buffer memory ??? */
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                /* Also 32768 block size in some cases */
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved7_3_6   :4;
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk1024         :1;     /* Supports 1024 bytes block size */
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk512          :1;     /* Supports 512 bytes block size */
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved7_0     :1;
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        reserved7_0     :1;
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk512          :1;     /* Supports 512 bytes block size */
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk1024         :1;     /* Supports 1024 bytes block size */
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved7_3_6   :4;
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                /* transfers for slow buffer memory ??? */
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                /* Also 32768 block size in some cases */
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
29295389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16          max_speed;              /* Maximum speed supported in KBps */
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved10, reserved11;
29495389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16          ctl;                    /* Continuous Transfer Limit in blocks */
29595389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16          speed;                  /* Current Speed, in KBps */
29695389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16          buffer_size;            /* Buffer Size, in 512 bytes */
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved18, reserved19;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_capabilities_page_t;
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *      Block Size Page
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x30 */
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x30 */
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              page_length;            /* Page Length - Should be 2 */
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        u8              reserved2;
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        one             :1;
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved2_6     :1;
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        record32_5      :1;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        record32        :1;
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved2_23    :2;
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        play32_5        :1;
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        play32          :1;
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        play32          :1;
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        play32_5        :1;
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved2_23    :2;
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        record32        :1;
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        record32_5      :1;
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved2_6     :1;
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        one             :1;
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_block_size_page_t;
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Tape Parameters Page
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if   defined(__BIG_ENDIAN_BITFIELD)
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x2b */
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(__LITTLE_ENDIAN_BITFIELD)
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned        page_code       :6;     /* Page code - Should be 0x2b */
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        reserved1_6     :1;
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        unsigned        ps              :1;
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#error "Please fix <asm/byteorder.h>"
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved2;
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		density;
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved3,reserved4;
35695389b86fd07660970a3e6498405d53037c035e9Al Viro	__be16		segtrk;
35795389b86fd07660970a3e6498405d53037c035e9Al Viro	__be16		trks;
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8		reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} osst_tape_paramtr_page_t;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* OnStream definitions */
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_CONFIG_PARTITION     (0xff)
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_DATA_PARTITION       (0)
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_PARTITION_VERSION    (1)
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * partition
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_partition_s {
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8    partition_num;
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8    par_desc_ver;
37395389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16  wrt_pass_cntr;
37495389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32  first_frame_ppos;
37595389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32  last_frame_ppos;
37695389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32  eod_frame_ppos;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_partition_t;
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAT entry
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_dat_entry_s {
38395389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32  blk_sz;
38495389b86fd07660970a3e6498405d53037c035e9Al Viro        __be16  blk_cnt;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8    flags;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8    reserved;
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_dat_entry_t;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAT
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_DAT_FLAGS_DATA       (0xc)
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_DAT_FLAGS_MARK       (0x1)
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_dat_s {
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            dat_sz;
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved1;
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            entry_cnt;
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved3;
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        os_dat_entry_t  dat_list[16];
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_dat_t;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Frame types
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_TYPE_FILL      (0)
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_TYPE_EOD       (1 << 0)
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_TYPE_MARKER    (1 << 1)
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_TYPE_HEADER    (1 << 3)
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_TYPE_DATA      (1 << 7)
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AUX
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_aux_s {
41625985edcedea6396277003854657b5f3cb31a628Lucas De Marchi        __be32          format_id;              /* hardware compatibility AUX is based on */
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        char            application_sig[4];     /* driver used to write this media */
41895389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          hdwr;                   /* reserved */
41995389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          update_frame_cntr;      /* for configuration frame */
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            frame_type;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            frame_type_reserved;
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved_18_19[2];
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        os_partition_t  partition;
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved_36_43[8];
42595389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          frame_seq_num;
42695389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          logical_blk_num_high;
42795389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          logical_blk_num;
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        os_dat_t        dat;
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved188_191[4];
43095389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          filemark_cnt;
43195389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          phys_fm;
43295389b86fd07660970a3e6498405d53037c035e9Al Viro        __be32          last_mark_ppos;
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved204_223[20];
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /*
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds         * __u8         app_specific[32];
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds         *
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds         * Linux specific fields:
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds         */
44095389b86fd07660970a3e6498405d53037c035e9Al Viro         __be32         next_mark_ppos;         /* when known, points to next marker */
44195389b86fd07660970a3e6498405d53037c035e9Al Viro	 __be32		last_mark_lbn;		/* storing log_blk_num of last mark is extends ADR spec */
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds         __u8           linux_specific[24];
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved_256_511[256];
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_aux_t;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FM_TAB_MAX 1024
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_fm_tab_s {
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		fm_part_num;
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved_1;
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		fm_tab_ent_sz;
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved_3;
45495389b86fd07660970a3e6498405d53037c035e9Al Viro	__be16		fm_tab_ent_cnt;
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved6_15[10];
45695389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		fm_tab_ent[OS_FM_TAB_MAX];
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_fm_tab_t;
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_ext_trk_ey_s {
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		et_part_num;
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		fmt;
46295389b86fd07660970a3e6498405d53037c035e9Al Viro	__be16		fm_tab_off;
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved4_7[4];
46495389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		last_hlb_hi;
46595389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		last_hlb;
46695389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		last_pp;
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved20_31[12];
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_ext_trk_ey_t;
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_ext_trk_tb_s {
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		nr_stream_part;
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved_1;
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		et_ent_sz;
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved3_15[13];
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	os_ext_trk_ey_t	dat_ext_trk_ey;
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	os_ext_trk_ey_t	qfa_ext_trk_ey;
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_ext_trk_tb_t;
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct os_header_s {
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        char            ident_str[8];
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            major_rev;
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            minor_rev;
48395389b86fd07660970a3e6498405d53037c035e9Al Viro	__be16		ext_trk_tb_off;
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            reserved12_15[4];
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            pt_par_num;
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        __u8            pt_reserved1_3[3];
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        os_partition_t  partition[16];
48895389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		cfg_col_width;
48995389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		dat_col_width;
49095389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		qfa_col_width;
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		cartridge[16];
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved304_511[208];
49395389b86fd07660970a3e6498405d53037c035e9Al Viro	__be32		old_filemark_list[16680/4];		/* in ADR 1.4 __u8 track_table[16680] */
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	os_ext_trk_tb_t	ext_track_tb;
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved17272_17735[464];
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	os_fm_tab_t	dat_fm_tab;
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	os_fm_tab_t	qfa_fm_tab;
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__u8		reserved25960_32767[6808];
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} os_header_t;
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OnStream ADRL frame
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_FRAME_SIZE   (32 * 1024 + 512)
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_DATA_SIZE    (32 * 1024)
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_AUX_SIZE     (512)
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds//#define OSST_MAX_SG      2
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The OnStream tape buffer descriptor. */
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct osst_buffer {
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char in_use;
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char dma;	/* DMA-able buffer */
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int buffer_size;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int buffer_blocks;
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int buffer_bytes;
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int read_pointer;
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int writing;
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int midlevel_result;
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int syscall_result;
5215e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede  struct osst_request *last_SRpnt;
5225e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede  struct st_cmdstatus cmdstat;
52326243043f207b3faa00594a33e10b2103205f27bFUJITA Tomonori  struct rq_map_data map_data;
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char *b_data;
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  os_aux_t *aux;               /* onstream AUX structure at end of each block     */
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short use_sg;       /* zero or number of s/g segments for this adapter */
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short sg_segs;      /* number of segments in s/g list                  */
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short orig_sg_segs; /* number of segments allocated at first try       */
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct scatterlist sg[1];    /* MUST BE last item                               */
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ;
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The OnStream tape drive descriptor */
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct osst_tape {
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct scsi_driver *driver;
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned capacity;
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct scsi_device *device;
5374390e60163979621f59e3a25a260289986eacb85Matthias Kaehlcke  struct mutex lock;           /* for serialization */
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct completion wait;      /* for SCSI commands */
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct osst_buffer * buffer;
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /* Drive characteristics */
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char omit_blklims;
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char do_auto_lock;
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char can_bsr;
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char can_partitions;
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char two_fm;
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char fast_mteom;
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char restr_dma;
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char scsi2_logical;
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char default_drvbuffer;  /* 0xff = don't touch, value 3 bits */
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char pos_unknown;        /* after reset position unknown */
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int write_threshold;
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int timeout;			/* timeout for normal commands */
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int long_timeout;		/* timeout for commands known to take long time*/
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /* Mode characteristics */
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct st_modedef modes[ST_NBR_MODES];
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int current_mode;
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /* Status variables */
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int partition;
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int new_partition;
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int nbr_partitions;    /* zero until partition support enabled */
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct st_partstat ps[ST_NBR_PARTITIONS];
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char dirty;
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char ready;
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char write_prot;
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char drv_write_prot;
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char in_use;
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char blksize_changed;
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char density_changed;
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char compression_changed;
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char drv_buffer;
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char density;
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char door_locked;
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char rew_at_close;
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char inited;
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int block_size;
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int min_block;
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int max_block;
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int recover_count;            /* from tape opening */
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int abort_count;
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int write_count;
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int read_count;
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int recover_erreg;            /* from last status call */
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /*
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * OnStream specific data
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   */
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int	   os_fw_rev;			       /* the firmware revision * 10000 */
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  raw;                          /* flag OnStream raw access (32.5KB block size) */
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  poll;                         /* flag that this drive needs polling (IDE|firmware) */
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  frame_in_buffer;	       /* flag that the frame as per frame_seq_number
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						* has been read into STp->buffer and is valid */
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      frame_seq_number;                   /* logical frame number */
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      logical_blk_num;                    /* logical block number */
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned first_frame_position;               /* physical frame to be transferred to/from host */
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned last_frame_position;                /* physical frame to be transferd to/from tape */
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      cur_frames;                         /* current number of frames in internal buffer */
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      max_frames;                         /* max number of frames in internal buffer */
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char     application_sig[5];                 /* application signature */
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char  fast_open;                    /* flag that reminds us we didn't check headers at open */
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short wrt_pass_cntr;                /* write pass counter */
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      update_frame_cntr;                  /* update frame counter */
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      onstream_write_error;               /* write error recovery active */
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      header_ok;                          /* header frame verified ok */
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      linux_media;                        /* reading linux-specifc media */
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      linux_media_version;
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  os_header_t * header_cache;		       /* cache is kept for filemark positions */
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      filemark_cnt;
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      first_mark_ppos;
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      last_mark_ppos;
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      last_mark_lbn;			/* storing log_blk_num of last mark is extends ADR spec */
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      first_data_ppos;
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      eod_frame_ppos;
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      eod_frame_lfa;
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      write_type;				/* used in write error recovery */
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int      read_error_frame;			/* used in read error recovery */
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned long cmd_start_time;
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned long max_cmd_time;
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if DEBUG
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char write_pending;
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int nbr_finished;
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int nbr_waits;
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char last_cmnd[6];
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned char last_sense[16];
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  struct gendisk *drive;
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} ;
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6315e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede/* scsi tape command */
6325e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riedestruct osst_request {
6335e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede	unsigned char cmd[MAX_COMMAND_SIZE];
6345e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede	unsigned char sense[SCSI_SENSE_BUFFERSIZE];
6355e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede	int result;
6365e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede	struct osst_tape *stp;
6375e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede	struct completion *waiting;
63826243043f207b3faa00594a33e10b2103205f27bFUJITA Tomonori	struct bio *bio;
6395e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede};
6405e6575c051f3313feb9fe1aad61263b3560df5ccWillem Riede
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Values of write_type */
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_DATA      0
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_EOD       1
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_NEW_MARK  2
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_LAST_MARK 3
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_HEADER    4
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITE_FILLER    5
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Additional rw state */
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OS_WRITING_COMPLETE 3
651