/* $Copyright:	$
 * Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989, 1990 
 * Sequent Computer Systems, Inc.   All rights reserved.
 *  
 * This software is furnished under a license and may be used
 * only in accordance with the terms of that license and with the
 * inclusion of the above copyright notice.   This software may not
 * be provided or otherwise made available to, or used by, any
 * other person.  No title to or ownership of the software is
 * hereby transferred.
 */

#ident	"$Header: mtio.h 1.8 89/08/07 $"

#ifndef	_SYS_MTIO_H_

/*
 * mtio.h 
 * 	Structures and definitions for mag tape io control commands
 */

/* $Log:	mtio.h,v $
 */

/* structure for MTIOCTOP - mag tape op command */
struct	mtop	{
	short	mt_op;		/* operations defined below */
	daddr_t	mt_count;	/* how many of them */
};

/*
 * operations
 * 
 * Note: Device drivers depend on the ordering below.
 */
#define MTWEOF	0	/* write an end-of-file record */
#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 MTREW	5	/* rewind */
#define MTOFFL	6	/* rewind and put the drive offline */
#define MTNOP	7	/* no operation, sets status only */
#define MTERASE	8	/* Erase from current position to eot */
#define MTRET	9	/* Retention the tape (streamers) */
#define MTSEOD	10	/* Space to end of data */
#define MTNORET	11	/* don't retention the tape this time */

/*
 * Structure for MTIOCGET - mag tape get status command
 */

struct	mtget	{
	short	mt_type;	/* type of magtape device */
	/*
	 * The following two registers are grossly device dependent
	 */
	short	mt_dsreg;	/* ``drive status'' register */
	short	mt_erreg;	/* ``error'' register */
	/*
	 * End device-dependent registers
	 */
	short	mt_resid;	/* residual count */
	/* 
	 * The following two are not yet implemented on all devices
	 */
	daddr_t	mt_fileno;	/* file number of current position */
	daddr_t	mt_blkno;	/* block number of current position */
};

/*
 * Constants for mt_type byte
 */
#define	MT_ISTS		0x01
#define	MT_ISHT		0x02
#define	MT_ISTM		0x03
#define	MT_ISMT		0x04
#define	MT_ISUT		0x05
#define	MT_ISCPC	0x06
#define	MT_ISAR		0x07
#define MT_ISXT		0x08	/* Cipher streamer */
#define MT_ISST		0x09	/* scsi streamer tape */
#define MT_ISTB		0x0a	/* scsi block tape */

/* mag tape io control commands */
#define	MTIOC		('m' << 8)
#define	MTIOCTOP	(MTIOC|1)		/* do a mag tape op */
#define	MTIOCGET	(MTIOC|2)		/* get tape status */

#ifndef	INKERNEL
#define	DEFTAPE	"/dev/rmt/xt0"	/* default tape for "mt"commands */
#endif

/*
 * The following defines the format of a minor device 
 * number for a tape driver unit.  Its the 16-bit minor 
 * device number (of type 'dev_t) consists of a mode 
 * byte and a unit number byte.  
 * 
 * The mode byte contains flags for selecting driver
 * modes, such as no-rewind-on-close, and a density
 * selector field.  Each drive class (i.e. 1/4" 
 * vs. 1/2") may define its own densities.  Drivers
 * may support only a subset of these modes.
 * 
 * For efficient access and flexibility a byte is 
 * reserved for the unit number.  Each driver shall
 * determine the maximum number of units it supports.
 */
#define MT_MINOR(unit,flags,density) ((unit) << 8 | (flags) | (density)) 
					/* Build a tape device minor number */

#define MT_UNIT(x) ((x) >> 8 & 0xff)	/* Extract unit number from minor */
#define MT_FLAGS(x) ((x) & 0xf0)	/* Extract mode flags from minor */
#define MT_DENSITY(x) ((x) & 0x0f)	/* Extract mode density from minor */

/* Mode density values for 1/2 inch media software selection */
#define MTD_NONE	0x0		/* No software selection */
#define MTD_LOW		0x1		/* Lowest density */
#define MTD_MED		0x2		/* Intermediate density */
#define MTD_HIGH	0x3		/* Highest density */
#define MTD_COMPRESS	0x4		/* Highest density with Compression */

/* Mode flags */
#define MTF_NOREWFLAG	0x80		/* Don't rewind on close */

#define MT_REWIND(dev)	(!(MT_FLAGS(minor(dev)) & MTF_NOREWFLAG)) 
					/* Determine from the device's dev_t 
					 * structure if it should be rewound 
					 * when closed.  */

#define	_SYS_MTIO_H_
#endif	/* _SYS_MTIO_H_ */
