1 ////////////////////////////////////////////////////////////////////////////////////
2 // W32MTIO.H      --      Win32 'mtio.h' (Magnetic Tape structures)
3 //
4 // (c) Copyright "Fish" (David B. Trout), 2005-2009. Released under
5 // the Q Public License (http://www.hercules-390.org/herclic.html)
6 // as modifications to Hercules.
7 ////////////////////////////////////////////////////////////////////////////////////
8 //
9 //  From the Koders.com (http://www.koders.com/) entry for
10 //  the Unununium(uuu) project (http://unununium.org/) which,
11 //  believe it or not, states their source code is COMPLETELY
12 //  FREE (i.e. no licensing restrictions AT ALL!).
13 //  Modified as needed by Fish for Hercules Win32 port.
14 //  Original filename: mtio.h; new filename: w32mtio.h
15 //
16 ////////////////////////////////////////////////////////////////////////////////////
17 
18 
19 #ifndef _W32MTIO_H_
20 #define _W32MTIO_H_
21 
22 #ifdef _MSVC_               // (Fish: only needed for MSVC)
23 
24 //#include <sys/ioctl.h>    // (Fish: not needed)
25 #define  _IOWR  _IOW        // (Fish: see 'winsock2.h')
26 //__BEGIN_DECLS             // (Fish: not needed)
27 
28 /* structure for MTIOCTOP - mag tape op command */
29 struct mtop {
30   short int mt_op;  /* operations defined below */
31   int mt_count;     /* how many of them */
32 };
33 
34 /* Magnetic Tape operations [Not all operations supported by all drivers]: */
35 #define MTRESET         0   /* +reset drive in case of problems */
36 #define MTFSF           1   /* forward space over FileMark,
37                              * position at first record of next file
38                              */
39 #define MTBSF           2   /* backward space FileMark (position before FM) */
40 #define MTFSR           3   /* forward space record */
41 #define MTBSR           4   /* backward space record */
42 #define MTWEOF          5   /* write an end-of-file record (mark) */
43 #define MTREW           6   /* rewind */
44 #define MTOFFL          7   /* rewind and put the drive offline (eject?) */
45 #define MTNOP           8   /* no op, set status only (read with MTIOCGET) */
46 #define MTRETEN         9   /* retension tape */
47 #define MTBSFM          10  /* +backward space FileMark, position at FM */
48 #define MTFSFM          11  /* +forward space FileMark, position at FM */
49 #define MTEOM           12  /* goto end of recorded media (for appending files).
50                              * MTEOM positions after the last FM, ready for
51                              * appending another file.
52                              */
53 #define MTERASE         13  /* erase tape -- be careful! */
54 
55 #define MTRAS1          14  /* run self test 1 (nondestructive) */
56 #define MTRAS2          15  /* run self test 2 (destructive) */
57 #define MTRAS3          16  /* reserved for self test 3 */
58 
59 #define MTEOTWARN       17  /* Fish: Warning Zone size (0 bytes == disable) */
60                             /* Some BSD's only support an "MTEWARN" boolean */
61 #define MTEWARN  MTEOTWARN  /* (for transparency/portability)               */
62 
63 #define MTSETBLK        20  /* set block length (SCSI) */
64 #define MTSETDENSITY    21  /* set tape density (SCSI) */
65 #define MTSEEK          22  /* seek to block (Tandberg, etc.) */
66 #define MTTELL          23  /* tell block (Tandberg, etc.) */
67 #define MTSETDRVBUFFER  24  /* set the drive buffering according to SCSI-2 */
68                             /* ordinary buffered operation with code 1 */
69 #define MTFSS           25  /* space forward over setmarks */
70 #define MTBSS           26  /* space backward over setmarks */
71 #define MTWSM           27  /* write setmarks */
72 
73 #define MTLOCK          28  /* lock the drive door */
74 #define MTUNLOCK        29  /* unlock the drive door */
75 #define MTLOAD          30  /* execute the SCSI load command */
76 #define MTUNLOAD        31  /* execute the SCSI unload command */
77 #define MTCOMPRESSION   32  /* control compression with SCSI mode page 15 */
78 #define MTSETPART       33  /* Change the active tape partition */
79 #define MTMKPART        34  /* Format the tape with one or two partitions */
80 
81 /* structure for MTIOCGET - mag tape get status command */
82 
83 struct mtget {
84   long int mt_type;     /* type of magtape device */
85   long int mt_resid;    /* residual count: (not sure)
86                          *   number of bytes ignored, or
87                          *   number of files not skipped, or
88                          *   number of records not skipped.
89                          */
90   /* the following registers are device dependent */
91   long int mt_dsreg;    /* status register */
92   long int mt_gstat;    /* generic (device independent) status */
93   long int mt_erreg;    /* error register */
94   /* The next two fields are not always used */
95   /* these really are daddr_t, but that is only declared with _BSD_SOURCE */
96   long mt_fileno;       /* number of current file on tape */
97   long mt_blkno;        /* current block number */
98 };
99 
100 /*
101  * Constants for mt_type. Not all of these are supported,
102  * and these are not all of the ones that are supported.
103  */
104 #define MT_ISUNKNOWN        0x01
105 #define MT_ISQIC02          0x02    /* Generic QIC-02 tape streamer */
106 #define MT_ISWT5150         0x03    /* Wangtek 5150EQ, QIC-150, QIC-02 */
107 #define MT_ISARCHIVE_5945L2 0x04    /* Archive 5945L-2, QIC-24, QIC-02? */
108 #define MT_ISCMSJ500        0x05    /* CMS Jumbo 500 (QIC-02?) */
109 #define MT_ISTDC3610        0x06    /* Tandberg 6310, QIC-24 */
110 #define MT_ISARCHIVE_VP60I  0x07    /* Archive VP60i, QIC-02 */
111 #define MT_ISARCHIVE_2150L  0x08    /* Archive Viper 2150L */
112 #define MT_ISARCHIVE_2060L  0x09    /* Archive Viper 2060L */
113 #define MT_ISARCHIVESC499   0x0A    /* Archive SC-499 QIC-36 controller */
114 #define MT_ISQIC02_ALL_FEATURES 0x0F/* Generic QIC-02 with all features */
115 #define MT_ISWT5099EEN24    0x11    /* Wangtek 5099-een24, 60MB, QIC-24 */
116 #define MT_ISTEAC_MT2ST     0x12    /* Teac MT-2ST 155mb drive, Teac DC-1 card (Wangtek type) */
117 #define MT_ISEVEREX_FT40A   0x32    /* Everex FT40A (QIC-40) */
118 #define MT_ISDDS1           0x51    /* DDS device without partitions */
119 #define MT_ISDDS2           0x52    /* DDS device with partitions */
120 #define MT_ISONSTREAM_SC    0x61    /* OnStream SCSI tape drives (SC-x0)
121                                        and SCSI emulated (DI, DP, USB) */
122 #define MT_ISSCSI1          0x71    /* Generic ANSI SCSI-1 tape unit */
123 #define MT_ISSCSI2          0x72    /* Generic ANSI SCSI-2 tape unit */
124 
125 /* QIC-40/80/3010/3020 ftape supported drives.
126  * 20bit vendor ID + 0x800000 (see ftape-vendors.h)
127  */
128 #define MT_ISFTAPE_UNKNOWN  0x800000 /* obsolete */
129 #define MT_ISFTAPE_FLAG     0x800000
130 
131 struct mt_tape_info {
132   long int t_type;  /* device type id (mt_type) */
133   char* t_name;     /* descriptive name */
134 };
135 
136 #define MT_TAPE_INFO    { \
137     {MT_ISUNKNOWN,              "Unknown type of tape device"}, \
138     {MT_ISQIC02,                "Generic QIC-02 tape streamer"}, \
139     {MT_ISWT5150,               "Wangtek 5150, QIC-150"}, \
140     {MT_ISARCHIVE_5945L2,       "Archive 5945L-2"}, \
141     {MT_ISCMSJ500,              "CMS Jumbo 500"}, \
142     {MT_ISTDC3610,              "Tandberg TDC 3610, QIC-24"}, \
143     {MT_ISARCHIVE_VP60I,        "Archive VP60i, QIC-02"}, \
144     {MT_ISARCHIVE_2150L,        "Archive Viper 2150L"}, \
145     {MT_ISARCHIVE_2060L,        "Archive Viper 2060L"}, \
146     {MT_ISARCHIVESC499,         "Archive SC-499 QIC-36 controller"}, \
147     {MT_ISQIC02_ALL_FEATURES,   "Generic QIC-02 tape, all features"}, \
148     {MT_ISWT5099EEN24,          "Wangtek 5099-een24, 60MB"}, \
149     {MT_ISTEAC_MT2ST,           "Teac MT-2ST 155mb data cassette drive"}, \
150     {MT_ISEVEREX_FT40A,         "Everex FT40A, QIC-40"}, \
151     {MT_ISONSTREAM_SC,          "OnStream SC-, DI-, DP-, or USB tape drive"}, \
152     {MT_ISSCSI1,                "Generic SCSI-1 tape"}, \
153     {MT_ISSCSI2,                "Generic SCSI-2 tape"}, \
154     {0, NULL} \
155 }
156 
157 /* structure for MTIOCPOS - mag tape get position command */
158 
159 struct mtpos {
160   long int mt_blkno;    /* current block number */
161 };
162 
163 /* structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended
164  * as an interim solution for QIC-02 until DDI is fully implemented.
165  */
166 struct mtconfiginfo {
167   long int mt_type;         /* drive type */
168   long int ifc_type;        /* interface card type */
169   unsigned short int irqnr; /* IRQ number to use */
170   unsigned short int dmanr; /* DMA channel to use */
171   unsigned short int port;  /* IO port base address */
172 
173   unsigned long int debug;  /* debugging flags */
174 
175   unsigned int have_dens:1;
176   unsigned int have_bsf:1;
177   unsigned int have_fsr:1;
178   unsigned int have_bsr:1;
179   unsigned int have_eod:1;
180   unsigned int have_seek:1;
181   unsigned int have_tell:1;
182   unsigned int have_ras1:1;
183   unsigned int have_ras2:1;
184   unsigned int have_ras3:1;
185   unsigned int have_qfa:1;
186 
187   unsigned int pad1:5;
188   char reserved[10];
189 };
190 
191 /*  structure for MTIOCVOLINFO, query information about the volume
192  *  currently positioned at (zftape)
193  */
194 struct mtvolinfo {
195   unsigned int mt_volno;    /* vol-number */
196   unsigned int mt_blksz;    /* blocksize used when recording */
197   unsigned int mt_rawsize;  /* raw tape space consumed, in kb */
198   unsigned int mt_size;     /* volume size after decompression, in kb */
199   unsigned int mt_cmpr:1;   /* this volume has been compressed */
200 };
201 
202 /* raw access to a floppy drive, read and write an arbitrary segment.
203  * For ftape/zftape to support formatting etc.
204  */
205 #define MT_FT_RD_SINGLE  0
206 #define MT_FT_RD_AHEAD   1
207 #define MT_FT_WR_ASYNC   0  /* start tape only when all buffers are full     */
208 #define MT_FT_WR_MULTI   1  /* start tape, continue until buffers are empty  */
209 #define MT_FT_WR_SINGLE  2  /* write a single segment and stop afterwards    */
210 #define MT_FT_WR_DELETE  3  /* write deleted data marks, one segment at time */
211 
212 struct mtftseg {
213   unsigned int mt_segno;    /* the segment to read or write */
214   unsigned int mt_mode;     /* modes for read/write (sync/async etc.) */
215   int mt_result;            /* result of r/w request, not of the ioctl */
216   void *mt_data;            /* User space buffer: must be 29kb */
217 };
218 
219 /* get tape capacity (ftape/zftape)
220  */
221 struct mttapesize {
222   unsigned long mt_capacity; /* entire, uncompressed capacity of a cartridge */
223   unsigned long mt_used;     /* what has been used so far, raw uncompressed amount */
224 };
225 
226 /*  possible values of the ftfmt_op field
227  */
228 #define FTFMT_SET_PARMS     1 /* set software parms */
229 #define FTFMT_GET_PARMS     2 /* get software parms */
230 #define FTFMT_FORMAT_TRACK  3 /* start formatting a tape track   */
231 #define FTFMT_STATUS        4 /* monitor formatting a tape track */
232 #define FTFMT_VERIFY        5 /* verify the given segment        */
233 
234 struct ftfmtparms {
235   unsigned char  ft_qicstd;   /* QIC-40/QIC-80/QIC-3010/QIC-3020 */
236   unsigned char  ft_fmtcode;  /* Refer to the QIC specs */
237   unsigned char  ft_fhm;      /* floppy head max */
238   unsigned char  ft_ftm;      /* floppy track max */
239   unsigned short ft_spt;      /* segments per track */
240   unsigned short ft_tpc;      /* tracks per cartridge */
241 };
242 
243 struct ftfmttrack {
244   unsigned int  ft_track;     /* track to format */
245   unsigned char ft_gap3;      /* size of gap3, for FORMAT_TRK */
246 };
247 
248 struct ftfmtstatus {
249   unsigned int  ft_segment;   /* segment currently being formatted */
250 };
251 
252 struct ftfmtverify {
253   unsigned int  ft_segment;   /* segment to verify */
254   unsigned long ft_bsm;       /* bsm as result of VERIFY cmd */
255 };
256 
257 struct mtftformat {
258   unsigned int fmt_op;        /* operation to perform */
259   union fmt_arg {
260     struct ftfmtparms  fmt_parms;  /* format parameters */
261     struct ftfmttrack  fmt_track;  /* ctrl while formatting */
262     struct ftfmtstatus fmt_status;
263     struct ftfmtverify fmt_verify; /* for verifying */
264   } fmt_arg;
265 };
266 
267 /* mag tape io control commands */
268 #define MTIOCTOP        _IOW('m', 1, struct mtop)           /* do a mag tape op */
269 #define MTIOCGET        _IOR('m', 2, struct mtget)          /* get tape status */
270 #define MTIOCPOS        _IOR('m', 3, struct mtpos)          /* get tape position */
271 
272 /* The next two are used by the QIC-02 driver for runtime reconfiguration.
273  * See tpqic02.h for struct mtconfiginfo.
274  */
275 #define MTIOCGETCONFIG  _IOR('m', 4, struct mtconfiginfo)   /* get tape config */
276 #define MTIOCSETCONFIG  _IOW('m', 5, struct mtconfiginfo)   /* set tape config */
277 
278 /* the next six are used by the floppy ftape drivers and its frontends
279  * sorry, but MTIOCTOP commands are write only.
280  */
281 #define MTIOCRDFTSEG    _IOWR('m', 6, struct mtftseg)       /* read a segment */
282 #define MTIOCWRFTSEG    _IOWR('m', 7, struct mtftseg)       /* write a segment */
283 #define MTIOCVOLINFO    _IOR('m',  8, struct mtvolinfo)     /* info about volume */
284 #define MTIOCGETSIZE    _IOR('m',  9, struct mttapesize)    /* get cartridge size*/
285 #define MTIOCFTFORMAT   _IOWR('m', 10, struct mtftformat)   /* format ftape */
286 #define MTIOCFTCMD      _IOWR('m', 11, struct mtftcmd)      /* send QIC-117 cmd */
287 
288 /* Generic Mag Tape (device independent) status macros for examining
289  * mt_gstat -- HP-UX compatible.
290  * There is room for more generic status bits here, but I don't
291  * know which of them are reserved. At least three or so should
292  * be added to make this really useful.
293  */
294 #define GMT_EOF(x)              ((x) & 0x80000000)
295 #define GMT_BOT(x)              ((x) & 0x40000000)
296 #define GMT_EOT(x)              ((x) & 0x20000000)
297 #define GMT_SM(x)               ((x) & 0x10000000)  /* DDS setmark */
298 #define GMT_EOD(x)              ((x) & 0x08000000)  /* DDS EOD */
299 #define GMT_WR_PROT(x)          ((x) & 0x04000000)
300 /* #define GMT_ ?               ((x) & 0x02000000) */
301 #define GMT_ONLINE(x)           ((x) & 0x01000000)
302 #define GMT_D_6250(x)           ((x) & 0x00800000)
303 #define GMT_D_1600(x)           ((x) & 0x00400000)
304 #define GMT_D_800(x)            ((x) & 0x00200000)
305 /* #define GMT_ ?               ((x) & 0x00100000) */
306 /* #define GMT_ ?               ((x) & 0x00080000) */
307 #define GMT_DR_OPEN(x)          ((x) & 0x00040000)  /* door open (no tape) */
308 /* #define GMT_ ?               ((x) & 0x00020000) */
309 #define GMT_IM_REP_EN(x)        ((x) & 0x00010000)  /* immediate report mode */
310 /* 16 generic status bits unused */
311 
312 /* SCSI-tape specific definitions */
313 /* Bitfield shifts in the status  */
314 #define MT_ST_BLKSIZE_SHIFT     0
315 #define MT_ST_BLKSIZE_MASK      0xffffff
316 #define MT_ST_DENSITY_SHIFT     24
317 #define MT_ST_DENSITY_MASK      0xff000000
318 
319 #define MT_ST_SOFTERR_SHIFT     0
320 #define MT_ST_SOFTERR_MASK      0xffff
321 
322 /* Bitfields for the MTSETDRVBUFFER ioctl */
323 #define MT_ST_OPTIONS           0xf0000000
324 #define MT_ST_BOOLEANS          0x10000000
325 #define MT_ST_SETBOOLEANS       0x30000000
326 #define MT_ST_CLEARBOOLEANS     0x40000000
327 #define MT_ST_WRITE_THRESHOLD   0x20000000
328 #define MT_ST_DEF_BLKSIZE       0x50000000
329 #define MT_ST_DEF_OPTIONS       0x60000000
330 #define MT_ST_TIMEOUTS          0x70000000
331 #define MT_ST_SET_TIMEOUT       (MT_ST_TIMEOUTS | 0x000000)
332 #define MT_ST_SET_LONG_TIMEOUT  (MT_ST_TIMEOUTS | 0x100000)
333 
334 #define MT_ST_BUFFER_WRITES     0x0001
335 #define MT_ST_ASYNC_WRITES      0x0002
336 #define MT_ST_READ_AHEAD        0x0004
337 #define MT_ST_DEBUGGING         0x0008
338 #define MT_ST_TWO_FM            0x0010
339 #define MT_ST_FAST_MTEOM        0x0020
340 #define MT_ST_AUTO_LOCK         0x0040
341 #define MT_ST_DEF_WRITES        0x0080
342 #define MT_ST_CAN_BSR           0x0100
343 #define MT_ST_NO_BLKLIMS        0x0200
344 #define MT_ST_CAN_PARTITIONS    0x0400
345 #define MT_ST_SCSI2LOGICAL      0x0800
346 #define MT_ST_SYSV              0x1000
347 
348 /* The mode parameters to be controlled. Parameter chosen with bits 20-28 */
349 #define MT_ST_CLEAR_DEFAULT     0xfffff
350 #define MT_ST_DEF_DENSITY       (MT_ST_DEF_OPTIONS | 0x100000)
351 #define MT_ST_DEF_COMPRESSION   (MT_ST_DEF_OPTIONS | 0x200000)
352 #define MT_ST_DEF_DRVBUFFER     (MT_ST_DEF_OPTIONS | 0x300000)
353 
354 /* The offset for the arguments for the special HP changer load command. */
355 #define MT_ST_HPLOADER_OFFSET   10000
356 
357 /* Specify default tape device.  */
358 #ifndef DEFTAPE
359 #define DEFTAPE "/dev/tape/0"
360 #endif
361 
362 //__END_DECLS               // (Fish: not needed)
363 
364 #endif // _MSVC_
365 
366 #endif // _W32MTIO_H_
367