aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/sys/ftape.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/sys/sys/ftape.h b/sys/sys/ftape.h
new file mode 100644
index 000000000000..79a644276ad0
--- /dev/null
+++ b/sys/sys/ftape.h
@@ -0,0 +1,222 @@
+/*
+ * Copyright (c) 1993 Steve Gerakines
+ *
+ * This is freely redistributable software. You may do anything you
+ * wish with it, so long as the above notice stays intact.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ftape.h - QIC-40/80 floppy tape driver functions
+ * 10/30/93 v0.3
+ * Set up constant values. Added support to get hardware info.
+ *
+ * 08/07/93 v0.2
+ * Header file that sits in /sys/sys, first revision. Support for
+ * ioctl functions added.
+ */
+
+#ifndef _FTAPE_H_
+#define _FTAPE_H_
+
+#ifndef _IOCTL_H_
+#include <sys/ioctl.h>
+#endif
+
+/* Miscellaneous constant values */
+#define QCV_BLKSIZE 1024 /* Size of a block */
+#define QCV_SEGSIZE 32768 /* Size of a segment */
+#define QCV_BLKSEG 32 /* Blocks per segment */
+#define QCV_ECCSIZE 3072 /* Bytes ecc eats */
+#define QCV_ECCBLKS 3 /* Blocks ecc eats */
+#define QCV_NFMT 3 /* Number of tape formats */
+#define QCV_NLEN 5 /* Number of tape lengths */
+#define QCV_HDRMAGIC 0xaa55aa55 /* Magic for header segment */
+#define QCV_FSMAGIC 0x33cc33cc /* Magic for fileset */
+
+#define UCHAR unsigned char
+#define USHORT unsigned short
+#define ULONG unsigned long
+
+/* Segment request structure. */
+typedef struct qic_segment {
+ ULONG sg_trk; /* Track number */
+ ULONG sg_seg; /* Segment number */
+ ULONG sg_crcmap; /* Returned bitmap of CRC errors */
+ ULONG sg_badmap; /* Map of known bad sectors */
+ UCHAR *sg_data; /* Segment w/bad blocks discarded */
+} QIC_Segment;
+
+/* Tape geometry structure. */
+typedef struct qic_geom {
+ int g_fmtno; /* Format number */
+ int g_lenno; /* Length number */
+ char g_fmtdesc[16]; /* Format text description */
+ char g_lendesc[16]; /* Length text description */
+ int g_trktape; /* Number of tracks per tape */
+ int g_segtrk; /* Number of segments per track */
+ int g_blktrk; /* Number of blocks per track */
+ int g_fdtrk; /* Floppy disk tracks */
+ int g_fdside; /* Floppy disk sectors/side */
+} QIC_Geom;
+
+/* Tape hardware info */
+typedef struct qic_hwinfo {
+ int hw_make; /* 10-bit drive make */
+ int hw_model; /* 6-bit model */
+ int hw_rombeta; /* TRUE if beta rom */
+ int hw_romid; /* 8-bit rom ID */
+} QIC_HWInfo;
+
+/* Various ioctl() routines. */
+#define QIOREAD _IOWR('q', 1, QIC_Segment) /* Read segment */
+#define QIOWRITE _IOW('q', 2, QIC_Segment) /* Write segment */
+#define QIOREWIND _IO('q', 3) /* Rewind tape */
+#define QIOBOT _IO('q', 4) /* Seek beg of trk */
+#define QIOEOT _IO('q', 5) /* Seek end of trk */
+#define QIOTRACK _IOW('q', 6, int) /* Seek to track */
+#define QIOSEEKLP _IO('q', 7) /* Seek load point */
+#define QIOFORWARD _IO('q', 8) /* Move tape fwd */
+#define QIOSTOP _IO('q', 9) /* Stop tape */
+#define QIOPRIMARY _IO('q', 10) /* Primary mode */
+#define QIOFORMAT _IO('q', 11) /* Format mode */
+#define QIOVERIFY _IO('q', 12) /* Verify mode */
+#define QIOWRREF _IO('q', 13) /* Write ref burst */
+#define QIOSTATUS _IOR('q', 14, int) /* Get drive status */
+#define QIOCONFIG _IOR('q', 15, int) /* Get tape config */
+#define QIOGEOM _IOR('q', 16, QIC_Geom) /* Get geometry */
+#define QIOHWINFO _IOR('q', 17, QIC_HWInfo) /* Get hardware inf */
+#define QIOSENDHDR _IOW('q', 18, QIC_Segment) /* Send header */
+#define QIORECVHDR _IOWR('q', 19, QIC_Segment) /* Receive header */
+
+/* QIC drive status bits. */
+#define QS_READY 0x01 /* Drive ready */
+#define QS_ERROR 0x02 /* Error detected */
+#define QS_CART 0x04 /* Tape in drive */
+#define QS_RDONLY 0x08 /* Write protect */
+#define QS_NEWCART 0x10 /* New tape inserted */
+#define QS_FMTOK 0x20 /* Tape is formatted */
+#define QS_BOT 0x40 /* Tape at beginning */
+#define QS_EOT 0x80 /* Tape at end */
+
+/* QIC configuration bits. */
+#define QCF_RTMASK 0x18 /* Rate mask */
+#define QCF_RT250 0x00 /* 250K bps */
+#define QCF_RT2 0x01 /* 2M bps */
+#define QCF_RT500 0x02 /* 500K bps */
+#define QCF_RT1 0x03 /* 1M bps */
+#define QCF_EXTRA 0x40 /* Extra length tape */
+#define QCF_QIC80 0x80 /* QIC-80 detected */
+
+/* QIC tape status bits. */
+#define QTS_FMMASK 0x0f /* Tape format mask */
+#define QTS_LNMASK 0xf0 /* Tape length mask */
+#define QTS_QIC40 0x01 /* QIC-40 tape */
+#define QTS_QIC80 0x02 /* QIC-80 tape */
+#define QTS_QIC500 0x03 /* QIC-500 tape */
+#define QTS_LEN1 0x10 /* 205 ft/550 Oe */
+#define QTS_LEN2 0x20 /* 307.5 ft/550 Oe */
+#define QTS_LEN3 0x30 /* 295 ft/900 Oe */
+#define QTS_LEN4 0x40 /* 1100 ft/550 Oe */
+#define QTS_LEN5 0x50 /* 1100 ft/900 Oe */
+
+/* Tape header segment structure */
+typedef struct qic_header {
+ ULONG qh_sig; /* Header signature 0x55aa55aa */
+ UCHAR qh_fmtc; /* Format code */
+ UCHAR qh_unused1;
+ USHORT qh_hseg; /* Header segment number */
+ USHORT qh_dhseg; /* Duplicate header segment number */
+ USHORT qh_first; /* First logical area data segment */
+ USHORT qh_last; /* Last logical area data segment */
+ UCHAR qh_fmtdate[4]; /* Most recent format date */
+ UCHAR qh_chgdate[4]; /* Most recent tape change date */
+ UCHAR qh_unused2[2];
+ USHORT qh_tstrk; /* Tape segments per track */
+ UCHAR qh_ttcart; /* Tape tracks per cartridge */
+ UCHAR qh_mfside; /* Max floppy sides */
+ UCHAR qh_mftrk; /* Max floppy tracks */
+ UCHAR qh_mfsect; /* Max floppy sector */
+ char qh_tname[44]; /* Tape name (ASCII, space filled) */
+ UCHAR qh_namdate[4]; /* Date tape was given a name */
+ USHORT qh_cprseg; /* Compression map start segment */
+ UCHAR qh_unused3[48];
+ UCHAR qh_refmt; /* Re-format flag */
+ UCHAR qh_unused4;
+ UCHAR qh_iocount[4]; /* I/O count for life of tape */
+ UCHAR qh_unused5[4];
+ UCHAR qh_ffmtdate[4]; /* Date first formatted */
+ USHORT qh_fmtcount; /* Number of times formatted */
+ USHORT qh_badsect; /* Failed sector count */
+ char qh_mfname[44]; /* Manufacturer name if pre-formatted */
+ char qh_mflot[44]; /* Manufacturer lot code */
+ UCHAR qh_unused6[22];
+ ULONG qh_fail[448]; /* Failed sector log */
+ ULONG qh_badmap[6912]; /* Bad sector map */
+} QIC_Header;
+
+/* Volume table of contents entry structure. */
+typedef struct qic_vtbl {
+ UCHAR vt_sig[4]; /* Signature "VTBL" if entry used */
+ USHORT vt_first; /* Starting segment */
+ USHORT vt_last; /* Ending segment */
+ char vt_vname[44]; /* Set name */
+ UCHAR vt_savdate[4]; /* Date saved */
+ UCHAR vt_flags; /* Volume flags */
+ UCHAR vt_multi; /* Multi cartidge sequence no. */
+ UCHAR vt_vext[26]; /* Extension data */
+ char vt_passwd[8]; /* Password for volume */
+ UCHAR vt_dirsize[4]; /* Directory section size */
+ UCHAR vt_dtasize[4]; /* Data section size */
+ USHORT vt_osver; /* Operating System version */
+ char vt_label[16]; /* Source drive label */
+ UCHAR vt_ldev; /* Logical device origin */
+ UCHAR vt_pdev; /* Physical device origin */
+ UCHAR vt_cprtype; /* Compression type */
+ UCHAR vt_ostype; /* Operating System type */
+ UCHAR vt_ostype2; /* Always zero ?? */
+ UCHAR vt_isocpr; /* ISO compression type */
+ UCHAR vt_unused1[4];
+} QIC_VTbl;
+
+/* Data compression map structure. */
+typedef struct qic_dcmap {
+ UCHAR dc_sig[4]; /* Siguature "DCMS" */
+ USHORT dc_mlen; /* Total map length */
+ UCHAR dc_unused1[6];
+ ULONG dc_offset[7421]; /* Byte offsets to segments */
+} QIC_DCMap;
+
+/* System specific file set structures - Unix */
+typedef struct qic_unix_set {
+ UCHAR fsu_perm; /* Permissions */
+ UCHAR fsu_attr2; /* More attributes */
+ UCHAR fsu_ctime[4]; /* Creation time */
+ UCHAR fsu_atime[4]; /* Last access time */
+ UCHAR fsu_inode[4]; /* i-node number */
+ UCHAR fsu_user[4]; /* User number */
+ UCHAR fsu_group[4]; /* Group number */
+ UCHAR fsu_major; /* Major device number */
+ UCHAR fsu_minor; /* Minor device number */
+ UCHAR fsu_nsize; /* Name size */
+ UCHAR fsu_name; /* Entry name starts here */
+} QIC_Unix_Set;
+
+/* File set structure */
+typedef struct qic_fileset {
+ UCHAR fs_size; /* Size of fixed + system size - 1 */
+ UCHAR fs_attr; /* Attributes */
+ UCHAR fs_mtime; /* Modification time */
+ UCHAR fs_dsize[4]; /* Data size */
+} QIC_FileSet;
+
+#endif /* _FTAPE_H_ */