[BACK]Return to ts_mtio.h CVS log [TXT][DIR] Up to [Development] / xfs-cmds / xfsdump / common

File: [Development] / xfs-cmds / xfsdump / common / ts_mtio.h (download)

Revision 1.1, Mon Mar 17 19:35:42 2003 UTC (14 years, 7 months ago) by alkirkco
Branch: MAIN

Undoes mod:     xfs-cmds:slinx:141863a
All of the SGI tape applications (TMF, DMF, OpenVault, and
tape tests) currently use the TS tape driver. This mod adds
initial support for xfsdump to also use the TS tape driver.

#ifndef __SYS_MTIO_H__
#define __SYS_MTIO_H__

#include <linux/mtio.h>

#ifndef __KERNEL__
#include <stdint.h>
#ifndef	_UCHAR_T_DEFINED
typedef unsigned char   uchar_t;
#define	_UCHAR_T_DEFINED	1
#endif
typedef unsigned int    uint_t;
#endif	/* __KERNEL */
typedef unsigned int    major_t;
typedef unsigned int    minor_t;

#define TAPEPATH	"/dev/ts"
#ifndef _BITS_TYPES_H
#endif /* _BITS_TYPES_H */
#define NBPSCTR	512	/* Bytes per sector from irix/kern/sys/param.h */
#define SCTRSHFT  9	/* Shift for BPSECT from irix/kern/sys/param.h */

/*
 * TS supports the following MTIOCTOP subcodes. These subcode
 * have been defined in linux/mtio.h and are supported in ST as well.
 * See linux/mtio.h for details.
 *
 *  operations (mt_op values for MTIOCTOP) 
 *
 * #define MTFSF	1	 forward space file 
 * #define MTBSF	2	 backward space file 
 * #define MTFSR	3	 forward space record 
 * #define MTBSR	4	 backward space record 
 * #define MTWEOF	5	 write an end-of-file record
 * #define MTREW	6	 rewind 
 * #define MTOFFL	7	 rewind and put the drive offline 
 * #define MTNOP	8	 no operation, sets status only 
 * #define MTRETEN	9	 retention operation 
 * #define MTEOM	12	 space to end of recorded data 
 * #define MTERASE	13	 erase tape from current position to EOT 
 * #define MTSETBLK	20	 set block length
 * #define MTSEEK	22	 Seek to the given block number.  Not all
 *				 drives support this option.  For drives
 *				 that support audio, the block number
 *				 actually becomes the program number ( 0
 *				 meaning leadin area, 0xfffffffe meaning
 *				 leadout, and other values (currently 1-
 *				 799 decimal) the program #).  For seeking
 *				 to times in audio mode, see MTSETAUDIO.
 * #define MTWSM	27	 write mt_count setmarks (DAT)
 * #define MTUNLOAD	31	 unload tape from drive 
 * #define MTSETPART	33	 skip to partition in mt_count (DAT); for
 * 				 DDS format DAT drives (only ones
 * 				 supported current), partition 1 is the
 * 				 first partition on the tape (nearest
 * 				 BOT), and partition 0 is the remainder of
 * 				 the tape. 
 * #define MTMKPART	34	 create partition (DAT), count is
 * 				 multiplied by 1 Mybte (2^20 bytes) to
 * 				 give the size of partition 1; if 0, then
 * 				 changes tape to a single partition
 * 				 tape. 
 * 
 */

#define MTRET		MTRETEN	/* retention operation */

#define MTRSV		0x7000	/* Issue a unit reserve command */
#define MTRLS		0x7001	/* Issue a unit release command */
#define MTPREEMPT	0x7002  /* Preempt active persistent reservation */
#define MTCLEAR		0x7003  /* Clear persistent reservation and keys */
#define MTAFILE		0x7004	/* space to end of last file before FM (so
				 * next data written is appended) */
#define MTSKSM		0x7005	/* skip setmark (DAT); skip backwards if mt_
				 * count is negative */
#define MTAUD		0x7006	/* turn audio mode on and off.  If count is
				 * 0, we are in data mode (default), if 1,
				 * put drive in audio mode.  This is only
				 * needed for writing tapes, since when
				 * reading the tape type (data or audio) is
				 * recognized automaticly. (DAT only for
				 * now). Remains set until same ioctl is
				 * reused, or until reboot. */

/* MTSPECOP - special drive specific operations.  
 * These use the mtop structure. 
 * MTSPECOP subcodes start at 0x6000.
 */
#define MTSCSI_CIPHER_SEC_ON	0x6001	/* enable reporting of recovered
					 * errors on the Cipher 540S */
#define MTSCSI_CIPHER_SEC_OFF	0x6002	/* disable recovered error report */
/* These are meaningful only for Exabyte.  Default is to return
	errors if read length is less than the block length */
#define MTSCSI_SILI		0x6003	/* suppress illegal length indication */
#define MTSCSI_EILI		0x6004	/* enable illegal length indication.
					 * currently implemented only for
					 * SCSI tape driver */
#define MTSCSI_SETFIXED		0x6005	/* set size of blocks for fixed
					 * block device in mt_count.  Lasts
					 * till reset same way, or till next
					 * boot. */
#define MTSCSI_SPEED		0x6006	/* set speed for multispeed devices
					 * in mt_count.  Current legal
					 * values are 0 (50 ips) and 1 (100
					 * ips) on Kennedy drives only.
					 * Default is currently 100. */

#define MTSCSI_SM		0x6007	/* How DAT setmarks are handled.
					 * default is to treat similar to
					 * FM (also if non-zero in mt_
					 * count).  0 in mt_count causes
					 * setmarks to be ignored.  Lasts
					 * until reboot or reset. */
#define MTSCSI_LOG_OFF		0x6008	/* Disable sense data logging */
#define MTSCSI_LOG_ON		0x6009	/* Enable sense data logging */

#define ABI_MTIOCTOP	(('t' << 8) | 9)
#define ABI_MTWEOF	0	/* same as MTWEOF */
#define ABI_MTFSF	1	/* same as MTFSF */
#define ABI_MTBSF	2	/* same as MTBSF */
#define ABI_MTFSR	3	/* same as MTFSR */
#define ABI_MTBSR	4	/* same as MTBSR */
#define ABI_MTREW	5	/* same as MTREW */
#define ABI_MTOFFL	6	/* same as MTOFFL */

/* structure for MTIOCGET_SGI - mag tape get status command; note that
 * in audio mode, the blkno is actually the program number; see
 * also the MTGETAUDIO ioctl and structure.  For the 3 special
 * position in audio mode (leadin, leadout, and unknown), the
 * low nibbles are replicated, so they don't match valid program
 * numbers (which are 1-799 decimal), giving values of 0xBBB, 0xEEE,
 * and 0xAAA, respectively.
*/
struct	mtget_sgi	{
	short	mt_type;		/* type of magtape device */
	unsigned short	mt_dposn;	/* status of tape position (see below)*/
	/* the following two registers are device dependent */
	unsigned short	mt_dsreg;	/* ``drive status'' register */
	short	mt_erreg;		/* ``error'' register */
	short	mt_resid;		/* residual count; for SCSI, this is 
					 * used to report the current partition
					 * # for DAT tapes that are partitioned
					 */
	/* the following two are not yet fully implemented */
	int	mt_fileno;	/* file number of current position */
	int	mt_blkno;	/* block number of current position */
};

/* old mtget structure , still keep it around for compatibility reason */
/* the librmt and /etc/rmt code uses it */
struct	old_mtget	{
	short	mt_type;	/* type of magtape device */
	/* the following two registers are device dependent */
	unsigned short	mt_dsreg;	/* ``drive status'' register */
	short	mt_erreg;	/* ``error'' register */

	short	mt_resid;	/* residual count */
	/* the following two are not yet fully implemented */
	int	mt_fileno;	/* file number of current position */
	int	mt_blkno;	/* block number of current position */
};

/*
 *      Structure to get persistent reservation state
 */
struct  mt_prsv {
	int	mt_flags;               /* flags for per rsv state */
	int	mt_active_gen;          /* generation of per rsv */
	int	mt_type;                /* prsv type */
	char	mt_active_key[8];       /* active prsv key */
	char	mt_local_key[8];        /* key used by local host */
};
#define MT_PRSV_VALID_RSV	0x01    /* valid persistent rsv */

/*	structure for MTIOCGETEXT
 *
 *	mt_type		Type of tape device
 *	mt_dposn	Status of tape position. See below.
 *	mt_dsreg	Drive status register.  See below.
 *	mt_erreg	Error registers.  The error register bits for a SCSI
 *			device are defined in tpsc.h, the upper 16 bits of
 *			ct_state in word0, ct_state2 in word 1.
 *	resid		Difference between what was requested and what has
 *			completed, in bytes or blocks depending on the command.
 *	fileno		Not currently supported.
 *	blkno		Block number (from device)
 *	partno		Partition number.
 *	cblkno		Block number calculated by driver, includes filemarks.
 *	lastreq		Last device request made by user.  See MTR_xxx request
 *			codes defined below.
 *	mt_ilimode	1 if ILI reporting is on, otherwise 0.
 *	mt_buffmmode	1 if filemarks are buffered, otherwise 0.
 */
typedef	struct	mtgetext {
	short		mt_type;
	unsigned short	mt_dposn;	/* Status of tape position	*/
	unsigned short	mt_dsreg;	/* Drive status register	*/
	unsigned short	mt_erreg[5];	/* Error registers		*/
	int		mt_resid;	/* Residual count		*/
	int		mt_fileno;	/* File number			*/
	int		mt_blkno;	/* Block number (from device)	*/
	int		mt_partno;	/* Partition number		*/
	int		mt_cblkno;	/* Block number	(calculated)	*/
	int		mt_lastreq;	/* Last device request		*/
	int		mt_ilimode;	/* State of ILI reporting mode	*/
	int		mt_buffmmode;	/* State of buffered filemarks	*/
	int		mt_subtype;	/* Device type			*/
	uint_t		mt_capability;	/* Device capabilities (MTCAN*) */
	int64_t		mt_nreads;	/* Bytes read since tape load 	*/
	int64_t		mt_nwrites;	/* Bytes written since tape load*/
	int		mt_future[2];	/* Future additions		*/
} mtgetext_t;


/*
 *   Structure for MTACCT
 *
 */
typedef	struct	mtacct {
	u_char          mt_hinv;        /* Tape type defined in invent.h    */
	uint_t          mt_capability;  /* Tape capabilities                */
	uint64_t        mt_reads;       /* read()s since boot time	    */
	uint64_t        mt_rbytes;      /* bytes read since boot time	    */
	uint64_t        mt_writes;      /* write()s since boot time	    */
	uint64_t        mt_wbytes;      /* bytes written since boot time    */
	uint64_t        mt_ioctls;      /* ioctl()s since boot time	    */
	uint64_t        mt_reads_load;  /* read()s at last load	            */
	uint64_t        mt_rbytes_load; /* bytes read at last load	    */
	uint64_t        mt_writes_load; /* write()s at last load	    */
	uint64_t        mt_wbytes_load; /* bytes written at last load	    */
	uint64_t        mt_ioctls_load; /* ioctl()s at last load	    */
	uint64_t        mt_future[16];  /* Future additions                 */
} mtacct_t;

#define	MT_MAX_VID	6	/* Max characters in volume id sans null    */

struct	mtvid {
	char	vid[MT_MAX_VID+1];
};

/*	structure for MTIOCGETBLKINFO - all quantities in bytes.
	A value of 0 indicates no limit
	When using the variable block size device, the lastread
	field is determined by reading one block and then spacing
	backwards, if no i/o has yet been done to this tape.  Unlike 
	MTIOCGETBLKSIZE, all quantities are in bytes.
*/
struct mtblkinfo {
	unsigned minblksz;	/* minimum block size */
	unsigned maxblksz;	/* maximum block size */
	unsigned curblksz;	/* size of block at last i/o.  For fixed
		mode, all requests must be a multiple of this. */
	unsigned recblksz;	/* "recommended" size for i/o.  Mostly
		based on compatibility with earlier releases and/or
		other vendors */
};


/*	structure for MTSCSI_RDLOG
	The fields in this structure reflect the values required in
	the SCSI Log Sense command.  See a product manual for an
	explanation of the fields.
*/

#define	MTSCSI_LOGLEN	4096
typedef	struct	mtscsi_rdlog	{
	uint		mtppc	: 1,	/* Parameter pointer control	*/
			mtsp	: 1,	/* Saving paramters		*/
			mtpc	: 2,	/* Page control			*/
			mtpage	: 6;	/* Page code of requested page	*/
	unsigned short	mtparam;	/* Parameter pointer		*/
	unsigned short	mtlen;		/* Size of buffer receiving log	*/
	caddr_t		mtarg;		/* Buffer pointer		*/
} mtscsi_rdlog_t;

#if _KERNEL
typedef	struct	irix5_mtscsi_rdlog {
	uint		mtppc	: 1,	/* Parameter pointer control	*/
			mtsp	: 1,	/* Saving paramters		*/
			mtpc	: 2,	/* Page control			*/
			mtpage	: 6;	/* Page code of requested page	*/
	unsigned short	mtparam;	/* Parameter pointer		*/
	unsigned short	mtlen;		/* Size of buffer receiving log	*/
	app32_ptr_t	mtarg;		/* Buffer pointer		*/
} irix5_mtscsi_rdlog_t;
#endif /* _KERNEL */	



/* structure and defines for MT[GS]ETAUDIO.
 * When using SETAUDIO to locate to a particular point, the type
 * should be set to one of the MTAUDPOSN_* values, 
 * and only the corresponding fields need be filled in.  See the DAT
 * audio spec for more detail on the definitions of the different times.
 * There are 34 frames per second, legal values are 0 through 33.  The
 * maximum value for the hours field is 99 hours.  Positioning commands
 * return immediately (as does rewind) in audio mode, and requests for
 * current position may be made while the positioning is in progress.
 * Other commands will block while positioning is in progress.
 * When known, all 4 of the positions are returned for GET (that is
 * pnum1-index, and all 3 of the mtaudtime structures).  The program
 * must determine by looking for 0xA in both nibbles whether any particular
 * field is valid.
*/

#define MTAUDPOSN_PROG	0	/* seek to program number */
#define MTAUDPOSN_ABS 	1	/* seek to absolute time */
#define MTAUDPOSN_RUN 	2	/* seek to running time */
#define MTAUDPOSN_PTIME 3	/* seek to program time (within program) */

/*
 * all the times are BCD digits, for both SET and GET.
 * a value of 0xA in BOTH nibbles, (i.e., not a valid BCD number)
 * means that the field isn't valid.
 */
struct mtaudtimecode {
    uchar_t hhi:4, hlo:4;	/* hours */
    uchar_t mhi:4, mlo:4;	/* minutes */
    uchar_t shi:4, slo:4;	/* seconds */
    uchar_t fhi:4, flo:4;	/* frame # (finer grain than seconds) */
};

struct mtaudio {
    uchar_t zero1:4, pno1:4; /* 3 BCD digits giving program number the zero */
    uchar_t zero2:4, pno2:4; /* fields should always be 0, or 0xA, when the */
    uchar_t zero3:4, pno3:4; /* pno field is also 0xA, indicating not valid */
    uchar_t indexhi:4, index:4; /* index number within program; hi is the
		most significant BCD digit, index the least. */
    struct mtaudtimecode ptime;         /* program time */
    struct mtaudtimecode atime;         /* absolute time */
    struct mtaudtimecode rtime;         /* running time */
    uchar_t seektype;            /* one of the MTAUDPOSN_* values */
    uchar_t cfuture[11];  /* future expansion */
};


/* structure for MTCAPABILITY */
struct mt_capablity  {
	int mtsubtype;	/* this is NOT the same as mt_type, this is
		the actual tape type, from invent.h, such as 9track, or DAT;
		otherwise it is difficult to associate a particular device
		with its type from a program. */
	uint_t mtcapablity;	/* the MTCAN* bits */
	uint_t mtfuture[8];	/* for future additions */
};


/* Constants for mt_type byte */
#define MT_ISSCSI	0x09		/* Western Digital SCSI controller */


/*      values for mt_dposn; values chosen for compatiblity with
        existing programs!  Note that these bits and the gaps between
        are also used in tpsc.h */

/* The expected relative behaviour of MT_EW, MT_EOT and MTANSI can be
   described as follows. 
   - writing from BOT, with MTANSI disabled, when LEOT is encountered,
     MT_EW and MT_EOT are set. If MTANSI is now enabled, MT_EOT will be
     reset and writing will be permitted until PEOT is encountered,
     whereupon MT_EOT will again be set and will remain so until the
     tape is repositioned.
   - reading from BOT, MT_EOT will be set when PEOT is
     encountered. LEOT is not normally reported by the drive, and therefore 
     MT_EW will normally not be set, unless the drive supports the REW mode 
     bit. (few do) 
*/

#define MT_EOT		0x01	/* tape is at end of media */
#define MT_BOT		0x02	/* tape is at beginning of media */
#define MT_WPROT	0x04	/* tape is write-protected */
#define	MT_EW		0x08	/* hit early warning marker	*/
#define MT_ONL		0x40	/* drive is online */
#define MT_EOD		0x4000	/* tape is at end of data */
#define MT_FMK		0x8000	/* tape is at file mark */
#define MT_POSMSK	0xC04F	/* mask for supported bits */

/*
 *   mt_dsreg bits which are not also mt_dposn values.  MT_QIC24 and MTQIC120
 *   are set only for drives that support QIC150 as well as the older formats.
 */
#define	MT_GETBLKLEN	0x0010	/* Request to determine block length pending  */
#define	MT_MOTION	0x0020	/* Command performed which (potentially) moves*/
				/*    the tape since last load or reset       */
#define	MT_QIC24	0x0080	/* QIC24 cartridge in drive		      */
#define	MT_QIC120	0x0100	/* QIC120 cartridge in drive		      */
#define	MT_OPEN		0x0200	/* Device is open			      */
#define	MT_READ		0x0400	/* Last motion request is read		      */
#define	MT_WRITE	0x0800	/* Last motion request is write		      */
#define	MT_CHG		0x1000	/* Unit attention has occurred		      */
#define	MT_DIDIO	0x2000	/* I/O or user requested tape motion command  */
				/*    has successfully completed since open   */
				/*    or space/rewind			      */

/*
 *   mt_erreg or mt_erreg[0] bits.
 */
#define	MT_NEEDBOT	0x0001	/* Must position at BOT before I/O.	      */
#define	MT_LOADED	0x0002	/* Tape is loaded			      */
#define	MT_ANSI		0x0004	/* I/O permitted after EOT detected	      */
#define	MT_SMK		0x0008	/* Drive is positioned at setmark	      */
#define	MT_AUDIO	0x0010	/* Drive is in audio mode.  Persists until    */
				/*   reset, tape change, or reboot.	      */
#define	MT_AUD_MED	0x0020	/* Drive media is in audio format	      */
#define	MT_MULTPART	0x0040	/* Drive media is multi-partitioned	      */
#define	MT_SEEKING	0x0080	/* Seek/rewind in immediate mode is pending   */
#define	MT_HITFMSHORT	0x0100	/* Fixed block I/O, hit FM and returned short */
				/*   non-zero count.  Next read will return 0 */
#define	MT_INCOMPAT_MEDIA 0x0200 /* Media is incompatible with drive	      */
#define	MT_CLEANHEADS	0x0400	/* Drive needs cleaning			      */
#define	MT_COMPRESS	0x0800	/* Drive in compress mode		      */
#define MT_RESERVED	0x1000	/* Persistent reserve placed on drive	      */
#define	MT_MEDIA_ERR	0x4000	/* Media error has occurred		      */

/*
 *   mt_erreg[1] bits.
 */
#define	MT_BAD_REQT	0x0001	/* Invalid request issued to device	      */
#define	MT_LARGE_BLK	0x0002	/* Block size on tape larger than request size*/
#define	MT_LOAD_ERR	0x0004	/* Load error				      */
#define	MT_HWERR	0x0008	/* Hardware error			      */
#define	MT_NOT_READY	0x0010	/* Device is not ready			      */
#define	MT_BLKLEN	0x0020	/* Set block size differs from actual size    */
#define	MT_INV_POS	0x0040	/* Tape position has not been established     */
#define MT_BLANK_TAPE	0x0080  /* Blank Tape detected 			      */

/*
 *   mag tape io control commands
 *
 *   Ioctls 1-10000 are reserved by the TS driver and personality
 *   daemons.
 *
 */
#define MTPDTRACE	6000			/* From pd_ioctl.h */
#define MTIOCODE(x)	('t'<<8|(x))

#ifndef	_LINUX_MTIO_H
#define MTIOCTOP	MTIOCODE('a')		/* perform tape op */
#endif	/* _LINUX_MTIO_H */
#define MTIOCGET_SGI	MTIOCODE('b')		/* get tape status */
#define MTIOCGETBLKSIZE	MTIOCODE('c')		/* get tape block size
						 * in multiples of 512 bytes */

#define MTSCSIINQ	MTIOCODE('d')		/* return scsi inquiry info (
						 * scsi tape drives only!);
						 * 3rd arg is a ptr to a
						 * buffer of at least izeof(
						 * ct_g0inq_data_t) from
						 * tpsc.h */
#define MTSCSI_INQUIRY_LEN 82			/* length of inquiry data
						 * for scsi tapes */
#define MTSPECOP	MTIOCODE('e')		/* special drive specific ops */
#define MTIOCGETBLKINFO	MTIOCODE('f')		/* get tape block info */
#define MTANSI		MTIOCODE('g')		/* allows i/o past EOT mark
						 * to provide for ANSI 3.27
						 * labeling.  Doesn't
						 * persist across opens.  If
						 * used, standard SGI EOT
						 * handling for tar, bru,
						 * etc. won't work
						 * correctly.  Currently
						 * implemented only on SCSI
						 * tape drives.  An arg of 1
						 * enables, 0 disables.
						 * NOTE: when the EOT marker
						 * is encountered, the
						 * current i/o operation
						 * returns either a short
						 * count (if any i/o
						 * completed), or -1 (if no
						 * i/o completed); it is the
						 * programmers responsiblity
						 * to determine if EOT has
						 * been encountered by using
						 * MTIOCGET or logic
						 * internal to the program.
						 * This ioctl should be
						 * issued AFTER encountering
						 * EOT, if ANSI 3.27 EOT
						 * handling is desired.
						 * subsequent i/o's will
						 * then be allowed, and will
						 * return the count actually
						 * transferred, or -1 if the
						 * drive was unable to
						 * transfer any data.  The
						 * standard calls for
						 * writing a FM before the
						 * label.  If this isn't
						 * done, the drive may
						 * return label info as
						 * data.  */
#define MTCAPABILITY		MTIOCODE('h')	/* returns drive type and
						 * capablities (MTCAN*).
						 * Currently implemented
						 * only for SCSI drives. See
						 * mt_capablity struct */
#define MTSETAUDIO		MTIOCODE('i')	/* sets audio position,
						 * etc. */
#define MTGETAUDIO		MTIOCODE('j')	/* returns info about
						 * position, etc. in audio
						 * mode */
#define MTABORT			MTIOCODE('k')	/* abort current tape
						 * operation, if any. Useful
						 * only with commands that
						 * run asynchronously to the
						 * caller, such as seek and
						 * rewind when in audio
						 * mode. */
#define MTALIAS			MTIOCODE('l')	/* for use by ioconfig in
						 * the hardware graph*/
#define MTSCSI_SENSE		MTIOCODE('m')	/* returns the data for the
						 * most recent request sense
						 * issued as the result of a
						 * scsi tape driver command
						 * that got a SCSI
						 * checkcondition. returns
						 * up to MTSCSI_SENSE_LEN
						 * bytes of data. The buffer
						 * supplied as the 3rd ioctl
						 * argument must be at least
						 * that large.  The actual
						 * amount of data will
						 * usually be less. */

#define MTSCSI_SENSE_LEN	256		/* length of sense data
						 * returned by MTSCSI_SENSE
						 * ioctl.  returned data
						 * must be examined for for
						 * actual valid length.  */

#define MTILIMODE		MTIOCODE('n')	/* Set ILI mode */
#define	MTIOCKGET		MTIOCODE('o')	/* CA UniCenter kernel call */
#define	MTSCSI_RDLOG		MTIOCODE('p')	/* Return SCSI device log
						 * data	*/
#define	MTIOCGETEXT		MTIOCODE('q')	/* Get extended tape status */
#define MTGETATTR		MTIOCODE('r')	/* Get tape device attributes */
#define MTBUFFMMODE		MTIOCODE('s')	/* Set Buffered filemark mode */
#define MTFPMESSAGE		MTIOCODE('t')	/* Write to diagnostic
						 * display (if supported) */
#define MTGETPOS		MTIOCODE('u')	/* Get vendor specific
						 * position */
#define MTSETPOS		MTIOCODE('v')	/* Set vendor specific
						 * position */
#define	MTIOCGETEXTL		MTIOCODE('w')	/* Get last extended tape
						 * status */
#define	MTACCT			MTIOCODE('x')	/* Return accounting data */
#define MTSETVID		MTIOCODE('y')	/* Set device volume id */
#define MTPRSV			MTIOCODE('z')	/* Get persistent reserve
						 * out key */

/* definitions for tape capablities.  Only those that are not
 * shared by all tape drives are shown. */
#define MTCAN_BSF	0x1	/* can backspace file */
#define MTCAN_BSR	0x2	/* can backspace record (block) */
#define MTCAN_APPEND	0x4	/* can append to existing tape files */
#define MTCAN_SETMK	0x8	/* can do setmarks */
#define MTCAN_PART	0x10	/* can do multiple partitions (DAT) */
#define MTCAN_PREV	0x20	/* can prevent/allow media removal */
#define MTCAN_SYNC	0x40	/* can do synchronous mode SCSI */

/* Note.  If SPEOD are set, or just SPEOD is set,
 * then a simple space to EOD is done; the combination
 * of SPEOD and LEOD is meaningless, and is treated as SPEOD, when
 * spacing, or as LEOD when closing; i.e., do NOT set both, or you
 * will get inconsistent results.
 * Some drives, such as the 8mm drive, have a drive detectible EOD,
 * but don't support the space EOD command.  For these drives,
 * neither SPEOD nor LEOD should be set.  We then fake it by looping
 * on space record and space FM until we get a blank check or other
 * indication of EOD. */
#define MTCAN_LEOD	0x80	/* Use a logical EOD (as opposed to an EOD
	* detectable by the drive).  Currently only 9-track drives.
	* If set, it is assumed EOD is marked by 2 sequential filemarks.
	* Setting this also implies causes two sequential FM's to be written
	* on close, when writing. */
#define MTCAN_SPEOD	0x100	/* can execute the space EOD command. */

#define MTCAN_CHKRDY 0x200	/* can determine if a tape is present; some
	* drives, such as Cipher540S return OK on a test unit ready even if
	* no cartridge is present. */

#define MTCAN_VAR	0x400	/* can do variable block sizes */
#define MTCAN_SETSZ	0x800	/* can set fixed block size */
#define MTCAN_SETSP	0x1000	/* can set tape speed (some 9track) */
#define MTCAN_SETDEN	0x2000	/* can set tape density (some 9track) */
#define MTCAN_SILI	0x4000	/* can set suppress illegal length errors;
	* only on drives that support variable block sizes */
#define MTCANT_RET	0x8000	/* some drives can't retension; the driver
	* will do it's best by spacing to EOD and rewinding. */
#define MTCAN_AUDIO	0x10000	/* drive supports audio over the SCSI bus;
	* only DAT at this time. The data is expected to be read
	* or written in the standard DAT format, including subcodes.
	* collection and gathering of subcodes is handled by the drive.
	* all 7 subcodes follow the data, then the mainID.
	* The drive reports/sets audio or data tapes via the density code
	* in the modesense/select block descriptor.  Actual data layout
	* is as below:
	*   5760 bytes of audio data (16 bits left, 16 bits right, repeat)
	*   7 subcode packs of 8 bytes each
	*   4 bytes of subid (4bits each of ctrlid, dataid, program # high
	*     nibble, # of valid pack items, progno # middle nibble, progno
	*     low nibble, 2 reserved nibbles)
	*   2 bytes main id (2 bits each of fmtid, and id1 - id7)
	*/
#define MTCAN_SEEK	0x20000	/* drive supports seeking to a particular
	* block (or sometimes program # if AUDIO supported) */
#define MTCAN_CHTYPEANY 0x40000	/* drive can change density
	and/or fixed to variable at any point (if it can change at all).
	Otherwise it can change only at BOT */
#define MTCANT_IMM	0x80000 /* drive doesn't work correctly when
	immediate mode rewind, etc. is enabled.  Setting this bit
	will disable immediate mode rewind on the drive, independent
	of the setting of tpsc_immediate_rewind (in master.d/tpsc) */
#define MTCAN_COMPRESS	0x100000 /* drive supports compression */
#define MTCAN_BUFFM	0x200000 /* drive supports writing of
				  * buffered filemarks */
#define MTCAN_FASTSEEK	0x400000 /* Drive needs BT bit set in read position and
				  * locate commands for fast seeking. */
#define MTCANT_LOAD	0x800000 /* Do NOT issue SCSI LOAD command for this drive */
#define MTCAN_LDREW	0x1000000 /* Issue Rewind instead of Load command. Used
				   * in conjunction with MTCANT_LOAD. */

/* 
 * Definitions for MTGETATTR 
 */

/* Definition of MTGETATTR return struct */
struct mt_attr {
	char		*ma_name;
	char		*ma_value;
	int		ma_vlen;
};

/* Definitions of attribute names */
#define MT_ATTR_NAME_REWIND		"rewind"
#define MT_ATTR_NAME_VARIABLE		"varblk"
#define MT_ATTR_NAME_SWAP		"swap"
#define MT_ATTR_NAME_COMPRESS_DENS	"compress"
#define MT_ATTR_NAME_DEVSCSI		"devscsi"

/* (Some of the) Definitions of return values */
#define MT_ATTR_VALUE_TRUE		"true"
#define MT_ATTR_VALUE_FALSE		"false"

#define MT_ATTR_MAX_NAMELEN	32
#define MT_ATTR_MAX_VALLEN	256

/*
 * Definitions for MTFPMESSAGE
 */

#define MT_FPMSG_MAX_MSGLEN	64
#define MT_FPMSG_IBM_MSGLEN	0x18
#define MT_FPMSG_DIANA_MSGLEN	0x11

/* Definition of MTFPMESSAGE struct */
struct mt_fpmsg {
	int		mm_mlen;
	union {
		char	mm_msg[MT_FPMSG_MAX_MSGLEN];	/* Generic format */
		struct {			/* Format for IBM 3590 type*/
			char   display_type;	/* Display Type: Set to 0x80 */
			char   msg_type:3,      /* Message type: 0x00 = General
						 * Status message */
		               msg_cntrl:3,     /* Message control: 
						   0 = Display message 0
						   1 = Display message 1
						   2 = Flash message 0
						   3 = Flash message 1
						   4 = Alternate message 0 and 1
						 */
		               rsvd1:2;
			char   rsvd2[4];
			ushort msg_len;	        /* Message length:Set to 0x10 */
			char   msg1[8];	        /* message 1 */
			char   msg2[8];	        /* message 2 */
		} ibm3590;
		struct {		/* Format for Fujitsu Diana 1,2,3 */
			char   display_mode:3, 
		               display_len:1,
		               flash:1,
		               half_msg:1,
			       :1,
		               data_format:1;
			char   msg1[8];
			char   msg2[8];
		} diana;
	} u;
};


#define default_mm_msg		u.mm_msg
#define ibm3590_display_type	u.ibm3590.display_type
#define ibm3590_msg_type	u.ibm3590.msg_type
#define ibm3590_msg_cntrl	u.ibm3590.msg_cntrl
#define ibm3590_msg_len		u.ibm3590.msg_len
#define ibm3590_msg1		u.ibm3590.msg1
#define ibm3590_msg2		u.ibm3590.msg2
#define diana_display_mode	u.diana.display_mode
#define diana_display_len	u.diana.display_len
#define diana_flash		u.diana.flash
#define diana_half_msg		u.diana.half_msg
#define diana_data_format	u.diana.data_format
#define diana_msg1		u.diana.msg1
#define diana_msg2		u.diana.msg2

/* Definition of MTGETPOS/MTSETPOS structure */
#define MAX_VEND_POS_SIZE	256	/* Maximum vendor specific position 
					 * data size. */
struct	vendor_specific_pos
{
	u_short	position_type;/* Identifies which position type is required. */
	short	size;	      /* Number of bytes of position data. */
	u_char	pos[MAX_VEND_POS_SIZE];/*Generic vendor specific position data*/
};

/* Definition for vendor_specific_pos position_type. */
#define	BLKPOSTYPE	0x1001	/* Ampex DST Block Position type. */
#define	FSNPOSTYPE	0x1002	/* Ampex DST File Section Position type. */
#define	DISPOSTYPE	0x1003	/* Ampex DIS Timecode Position type. */

/*
 *   Define user request codes.  These values are returned in field lastreq
 *   of structure mtgetext_t.
 */

#define MTR_READ	1		/* Read				*/
#define	MTR_WRITE	2		/* Write			*/
#define	MTR_WFM		3		/* Write filemark(s)		*/
#define	MTR_SRB		4		/* Skip records backward, position after FM */
#define	MTR_SRF		5		/* Skip records forward, position after FM */
#define	MTR_SFB		6		/* Skip filemarks backwards	*/
#define	MTR_SFF		7		/* Skip filemarks forward	*/
#define	MTR_SEOD	8		/* Space to the end of data	*/
#define	MTR_SEOM	9		/* Space to the end of media	*/
#define	MTR_FORMAT	10		/* Skip filemarkds forward	*/
#define	MTR_PART	11		/* Position to a partition	*/
#define	MTR_SSM		12		/* Skip setmarks		*/
#define	MTR_WSM		13		/* Write setmarks		*/
#define	MTR_MODEAUD	14		/* Enable or disable audio mode	*/
#define	MTR_REW		15		/* Rewind			*/
#define	MTR_ERASE	16		/* Erase from current pos to EOT*/
#define	MTR_RETEN	17		/* Retension			*/
#define	MTR_UNLOAD	18		/* Unload			*/
#define	MTR_PABS	19		/* Position to an absolute pos	*/
#define	MTR_PAUDIO	20		/* Audio position		*/
#define	MTR_GAUDIO	21		/* Get audio position		*/
#define	MTR_RDLOG	22		/* Read log			*/
#define	MTR_ATTR	23		/* Set attribute		*/
#define	MTR_SPOS	24		/* Set vendor specific position	*/
#define	MTR_GPOS	25		/* Get vendor specific position	*/
#define MTR_RSV		26		/* Unit reserve			*/
#define MTR_RLS		27		/* Unit release			*/
#define MTR_PREEMPT	28
#define MTR_CLEAR	29
#define	MTR_LOAD	30		/* Load				*/
#define	MTR_SFBM	31		/* Skip filemarks backward, position at FM */
#define	MTR_SFFM	32		/* Skip filemarks forward, position at FM */

#endif /* __SYS_MTIO_H__ */