| 1 | /* Structures and definitions for magnetic tape I/O control commands. |
| 2 | Copyright (C) 1996-2026 Free Software Foundation, Inc. |
| 3 | This file is part of the GNU C Library. |
| 4 | |
| 5 | The GNU C Library is free software; you can redistribute it and/or |
| 6 | modify it under the terms of the GNU Lesser General Public |
| 7 | License as published by the Free Software Foundation; either |
| 8 | version 2.1 of the License, or (at your option) any later version. |
| 9 | |
| 10 | The GNU C Library is distributed in the hope that it will be useful, |
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | Lesser General Public License for more details. |
| 14 | |
| 15 | You should have received a copy of the GNU Lesser General Public |
| 16 | License along with the GNU C Library; if not, see |
| 17 | <https://www.gnu.org/licenses/>. */ |
| 18 | |
| 19 | |
| 20 | #ifndef _SYS_MTIO_H |
| 21 | #define _SYS_MTIO_H	1 |
| 22 | |
| 23 | /* Get necessary definitions from system and kernel headers. */ |
| 24 | #include <sys/types.h> |
| 25 | #include <sys/ioctl.h> |
| 26 | |
| 27 | |
| 28 | /* Structure for MTIOCTOP - magnetic tape operation command. */ |
| 29 | struct mtop |
| 30 | { |
| 31 | short int mt_op;		/* Operations defined below. */ |
| 32 | int mt_count;		/* How many of them. */ |
| 33 | }; |
| 34 | #define _IOT_mtop /* Hurd ioctl type field. */ \ |
| 35 | _IOT (_IOTS (short), 1, _IOTS (int), 1, 0, 0) |
| 36 | |
| 37 | /* Magnetic Tape operations [Not all operations supported by all drivers]. */ |
| 38 | #define MTRESET 0	/* +reset drive in case of problems. */ |
| 39 | #define MTFSF	1	/* Forward space over FileMark, |
| 40 | 			 * position at first record of next file. */ |
| 41 | #define MTBSF	2	/* Backward space FileMark (position before FM). */ |
| 42 | #define MTFSR	3	/* Forward space record. */ |
| 43 | #define MTBSR	4	/* Backward space record. */ |
| 44 | #define MTWEOF	5	/* Write an end-of-file record (mark). */ |
| 45 | #define MTREW	6	/* Rewind. */ |
| 46 | #define MTOFFL	7	/* Rewind and put the drive offline (eject?). */ |
| 47 | #define MTNOP	8	/* No op, set status only (read with MTIOCGET). */ |
| 48 | #define MTRETEN 9	/* Retension tape. */ |
| 49 | #define MTBSFM	10	/* +backward space FileMark, position at FM. */ |
| 50 | #define MTFSFM 11	/* +forward space FileMark, position at FM. */ |
| 51 | #define MTEOM	12	/* Goto end of recorded media (for appending files). |
| 52 | 			 MTEOM positions after the last FM, ready for |
| 53 | 			 appending another file. */ |
| 54 | #define MTERASE 13	/* Erase tape -- be careful! */ |
| 55 | |
| 56 | #define MTRAS1 14	/* Run self test 1 (nondestructive). */ |
| 57 | #define MTRAS2	15	/* Run self test 2 (destructive). */ |
| 58 | #define MTRAS3 16	/* Reserved for self test 3. */ |
| 59 | |
| 60 | #define MTSETBLK 20	/* Set block length (SCSI). */ |
| 61 | #define MTSETDENSITY 21	/* Set tape density (SCSI). */ |
| 62 | #define MTSEEK	22	/* Seek to block (Tandberg, etc.). */ |
| 63 | #define MTTELL	23	/* Tell block (Tandberg, etc.). */ |
| 64 | #define MTSETDRVBUFFER 24 /* Set the drive buffering according to SCSI-2. |
| 65 | 			 Ordinary buffered operation with code 1. */ |
| 66 | #define MTFSS	25	/* Space forward over setmarks. */ |
| 67 | #define MTBSS	26	/* Space backward over setmarks. */ |
| 68 | #define MTWSM	27	/* Write setmarks. */ |
| 69 | |
| 70 | #define MTLOCK 28	/* Lock the drive door. */ |
| 71 | #define MTUNLOCK 29	/* Unlock the drive door. */ |
| 72 | #define MTLOAD 30	/* Execute the SCSI load command. */ |
| 73 | #define MTUNLOAD 31	/* Execute the SCSI unload command. */ |
| 74 | #define MTCOMPRESSION 32/* Control compression with SCSI mode page 15. */ |
| 75 | #define MTSETPART 33	/* Change the active tape partition. */ |
| 76 | #define MTMKPART 34	/* Format the tape with one or two partitions. */ |
| 77 | |
| 78 | /* structure for MTIOCGET - mag tape get status command */ |
| 79 | |
| 80 | struct mtget |
| 81 | { |
| 82 | long int mt_type;		/* Type of magtape device. */ |
| 83 | long int mt_resid;		/* Residual count: (not sure) |
| 84 | 				 number of bytes ignored, or |
| 85 | 				 number of files not skipped, or |
| 86 | 				 number of records not skipped. */ |
| 87 | /* The following registers are device dependent. */ |
| 88 | long int mt_dsreg;		/* Status register. */ |
| 89 | long int mt_gstat;		/* Generic (device independent) status. */ |
| 90 | long int mt_erreg;		/* Error register. */ |
| 91 | /* The next two fields are not always used. */ |
| 92 | __daddr_t mt_fileno;	/* Number of current file on tape. */ |
| 93 | __daddr_t mt_blkno;		/* Current block number. */ |
| 94 | }; |
| 95 | #define _IOT_mtget /* Hurd ioctl type field. */ \ |
| 96 | _IOT (_IOTS (long), 7, 0, 0, 0, 0) |
| 97 | |
| 98 | |
| 99 | /* Constants for mt_type. Not all of these are supported, and |
| 100 | these are not all of the ones that are supported. */ |
| 101 | #define MT_ISUNKNOWN		0x01 |
| 102 | #define MT_ISQIC02		0x02	/* Generic QIC-02 tape streamer. */ |
| 103 | #define MT_ISWT5150		0x03	/* Wangtek 5150EQ, QIC-150, QIC-02. */ |
| 104 | #define MT_ISARCHIVE_5945L2	0x04	/* Archive 5945L-2, QIC-24, QIC-02?. */ |
| 105 | #define MT_ISCMSJ500		0x05	/* CMS Jumbo 500 (QIC-02?). */ |
| 106 | #define MT_ISTDC3610		0x06	/* Tandberg 6310, QIC-24. */ |
| 107 | #define MT_ISARCHIVE_VP60I	0x07	/* Archive VP60i, QIC-02. */ |
| 108 | #define MT_ISARCHIVE_2150L	0x08	/* Archive Viper 2150L. */ |
| 109 | #define MT_ISARCHIVE_2060L	0x09	/* Archive Viper 2060L. */ |
| 110 | #define MT_ISARCHIVESC499	0x0A	/* Archive SC-499 QIC-36 controller. */ |
| 111 | #define MT_ISQIC02_ALL_FEATURES	0x0F	/* Generic QIC-02 with all features. */ |
| 112 | #define MT_ISWT5099EEN24	0x11	/* Wangtek 5099-een24, 60MB, QIC-24. */ |
| 113 | #define MT_ISTEAC_MT2ST		0x12	/* Teac MT-2ST 155mb drive, |
| 114 | 					 Teac DC-1 card (Wangtek type). */ |
| 115 | #define MT_ISEVEREX_FT40A	0x32	/* Everex FT40A (QIC-40). */ |
| 116 | #define MT_ISDDS1		0x51	/* DDS device without partitions. */ |
| 117 | #define MT_ISDDS2		0x52	/* DDS device with partitions. */ |
| 118 | #define MT_ISSCSI1		0x71	/* Generic ANSI SCSI-1 tape unit. */ |
| 119 | #define MT_ISSCSI2		0x72	/* Generic ANSI SCSI-2 tape unit. */ |
| 120 | |
| 121 | /* QIC-40/80/3010/3020 ftape supported drives. |
| 122 | 20bit vendor ID + 0x800000 (see vendors.h in ftape distribution). */ |
| 123 | #define MT_ISFTAPE_UNKNOWN	0x800000 /* obsolete */ |
| 124 | #define MT_ISFTAPE_FLAG		0x800000 |
| 125 | |
| 126 | struct mt_tape_info |
| 127 | { |
| 128 | long int t_type;		/* Device type id (mt_type). */ |
| 129 | char *t_name;		/* Descriptive name. */ |
| 130 | }; |
| 131 | |
| 132 | #define MT_TAPE_INFO \ |
| 133 | {									 \ |
| 134 | 	{MT_ISUNKNOWN,		"Unknown type of tape device"},		 \ |
| 135 | 	{MT_ISQIC02,		"Generic QIC-02 tape streamer"},	 \ |
| 136 | 	{MT_ISWT5150,		"Wangtek 5150, QIC-150"},		 \ |
| 137 | 	{MT_ISARCHIVE_5945L2,	"Archive 5945L-2"},			 \ |
| 138 | 	{MT_ISCMSJ500,		"CMS Jumbo 500"},			 \ |
| 139 | 	{MT_ISTDC3610,		"Tandberg TDC 3610, QIC-24"},		 \ |
| 140 | 	{MT_ISARCHIVE_VP60I,	"Archive VP60i, QIC-02"},		 \ |
| 141 | 	{MT_ISARCHIVE_2150L,	"Archive Viper 2150L"},			 \ |
| 142 | 	{MT_ISARCHIVE_2060L,	"Archive Viper 2060L"},			 \ |
| 143 | 	{MT_ISARCHIVESC499,	"Archive SC-499 QIC-36 controller"},	 \ |
| 144 | 	{MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"},	 \ |
| 145 | 	{MT_ISWT5099EEN24,	"Wangtek 5099-een24, 60MB"},		 \ |
| 146 | 	{MT_ISTEAC_MT2ST,	"Teac MT-2ST 155mb data cassette drive"}, \ |
| 147 | 	{MT_ISEVEREX_FT40A,	"Everex FT40A, QIC-40"},		 \ |
| 148 | 	{MT_ISSCSI1,		"Generic SCSI-1 tape"},			 \ |
| 149 | 	{MT_ISSCSI2,		"Generic SCSI-2 tape"},			 \ |
| 150 | 	{0, NULL}							 \ |
| 151 | } |
| 152 | |
| 153 | |
| 154 | /* Structure for MTIOCPOS - mag tape get position command. */ |
| 155 | |
| 156 | struct mtpos |
| 157 | { |
| 158 | long int mt_blkno;	/* Current block number. */ |
| 159 | }; |
| 160 | #define _IOT_mtpos /* Hurd ioctl type field. */ \ |
| 161 | _IOT_SIMPLE (long) |
| 162 | |
| 163 | |
| 164 | /* Structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended |
| 165 | as an interim solution for QIC-02 until DDI is fully implemented. */ |
| 166 | struct mtconfiginfo |
| 167 | { |
| 168 | long int mt_type;		/* Drive type. */ |
| 169 | long int ifc_type;		/* Interface card type. */ |
| 170 | unsigned short int irqnr;	/* IRQ number to use. */ |
| 171 | unsigned short int dmanr;	/* DMA channel to use. */ |
| 172 | unsigned short int port;	/* IO port base address. */ |
| 173 | |
| 174 | unsigned long int debug;	/* Debugging flags. */ |
| 175 | |
| 176 | unsigned have_dens:1; |
| 177 | unsigned have_bsf:1; |
| 178 | unsigned have_fsr:1; |
| 179 | unsigned have_bsr:1; |
| 180 | unsigned have_eod:1; |
| 181 | unsigned have_seek:1; |
| 182 | unsigned have_tell:1; |
| 183 | unsigned have_ras1:1; |
| 184 | unsigned have_ras2:1; |
| 185 | unsigned have_ras3:1; |
| 186 | unsigned have_qfa:1; |
| 187 | |
| 188 | unsigned pad1:5; |
| 189 | char reserved[10]; |
| 190 | }; |
| 191 | #define _IOT_mtconfiginfo /* Hurd ioctl type field. */ \ |
| 192 | _IOT (_IOTS (long), 2, _IOTS (short), 3, _IOTS (long), 1) /* XXX wrong */ |
| 193 | |
| 194 | |
| 195 | /* Magnetic tape I/O control commands. */ |
| 196 | #define	MTIOCTOP	_IOW('m', 1, struct mtop)	/* Do a mag tape op. */ |
| 197 | #define	MTIOCGET	_IOR('m', 2, struct mtget)	/* Get tape status. */ |
| 198 | #define	MTIOCPOS	_IOR('m', 3, struct mtpos)	/* Get tape position.*/ |
| 199 | |
| 200 | /* The next two are used by the QIC-02 driver for runtime reconfiguration. |
| 201 | See tpqic02.h for struct mtconfiginfo. */ |
| 202 | #define	MTIOCGETCONFIG	_IOR('m', 4, struct mtconfiginfo) /* Get tape config.*/ |
| 203 | #define	MTIOCSETCONFIG	_IOW('m', 5, struct mtconfiginfo) /* Set tape config.*/ |
| 204 | |
| 205 | /* Generic Mag Tape (device independent) status macros for examining |
| 206 | mt_gstat -- HP-UX compatible. |
| 207 | There is room for more generic status bits here, but I don't |
| 208 | know which of them are reserved. At least three or so should |
| 209 | be added to make this really useful. */ |
| 210 | #define GMT_EOF(x) ((x) & 0x80000000) |
| 211 | #define GMT_BOT(x) ((x) & 0x40000000) |
| 212 | #define GMT_EOT(x) ((x) & 0x20000000) |
| 213 | #define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */ |
| 214 | #define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */ |
| 215 | #define GMT_WR_PROT(x) ((x) & 0x04000000) |
| 216 | /* #define GMT_ ? 		((x) & 0x02000000) */ |
| 217 | #define GMT_ONLINE(x) ((x) & 0x01000000) |
| 218 | #define GMT_D_6250(x) ((x) & 0x00800000) |
| 219 | #define GMT_D_1600(x) ((x) & 0x00400000) |
| 220 | #define GMT_D_800(x) ((x) & 0x00200000) |
| 221 | /* #define GMT_ ? 		((x) & 0x00100000) */ |
| 222 | /* #define GMT_ ? 		((x) & 0x00080000) */ |
| 223 | #define GMT_DR_OPEN(x) ((x) & 0x00040000) /* Door open (no tape). */ |
| 224 | /* #define GMT_ ? 		((x) & 0x00020000) */ |
| 225 | #define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* Immediate report mode.*/ |
| 226 | /* 16 generic status bits unused. */ |
| 227 | |
| 228 | |
| 229 | /* SCSI-tape specific definitions. Bitfield shifts in the status */ |
| 230 | #define MT_ST_BLKSIZE_SHIFT	0 |
| 231 | #define MT_ST_BLKSIZE_MASK	0xffffff |
| 232 | #define MT_ST_DENSITY_SHIFT	24 |
| 233 | #define MT_ST_DENSITY_MASK	0xff000000 |
| 234 | |
| 235 | #define MT_ST_SOFTERR_SHIFT	0 |
| 236 | #define MT_ST_SOFTERR_MASK	0xffff |
| 237 | |
| 238 | /* Bitfields for the MTSETDRVBUFFER ioctl. */ |
| 239 | #define MT_ST_OPTIONS		0xf0000000 |
| 240 | #define MT_ST_BOOLEANS		0x10000000 |
| 241 | #define MT_ST_SETBOOLEANS	0x30000000 |
| 242 | #define MT_ST_CLEARBOOLEANS	0x40000000 |
| 243 | #define MT_ST_WRITE_THRESHOLD	0x20000000 |
| 244 | #define MT_ST_DEF_BLKSIZE	0x50000000 |
| 245 | #define MT_ST_DEF_OPTIONS	0x60000000 |
| 246 | |
| 247 | #define MT_ST_BUFFER_WRITES	0x1 |
| 248 | #define MT_ST_ASYNC_WRITES	0x2 |
| 249 | #define MT_ST_READ_AHEAD	0x4 |
| 250 | #define MT_ST_DEBUGGING		0x8 |
| 251 | #define MT_ST_TWO_FM		0x10 |
| 252 | #define MT_ST_FAST_MTEOM	0x20 |
| 253 | #define MT_ST_AUTO_LOCK		0x40 |
| 254 | #define MT_ST_DEF_WRITES	0x80 |
| 255 | #define MT_ST_CAN_BSR		0x100 |
| 256 | #define MT_ST_NO_BLKLIMS	0x200 |
| 257 | #define MT_ST_CAN_PARTITIONS 0x400 |
| 258 | #define MT_ST_SCSI2LOGICAL 0x800 |
| 259 | |
| 260 | /* The mode parameters to be controlled. Parameter chosen with bits 20-28. */ |
| 261 | #define MT_ST_CLEAR_DEFAULT	0xfffff |
| 262 | #define MT_ST_DEF_DENSITY	(MT_ST_DEF_OPTIONS | 0x100000) |
| 263 | #define MT_ST_DEF_COMPRESSION	(MT_ST_DEF_OPTIONS | 0x200000) |
| 264 | #define MT_ST_DEF_DRVBUFFER	(MT_ST_DEF_OPTIONS | 0x300000) |
| 265 | |
| 266 | /* The offset for the arguments for the special HP changer load command. */ |
| 267 | #define MT_ST_HPLOADER_OFFSET 10000 |
| 268 | |
| 269 | |
| 270 | /* Specify default tape device. */ |
| 271 | #ifndef DEFTAPE |
| 272 | # define DEFTAPE	"/dev/tape" |
| 273 | #endif |
| 274 | |
| 275 | #endif /* mtio.h */ |