| #ifndef __TS_MTIO_H__ |
| #define __TS_MTIO_H__ |
| |
| #include <sys/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 sys/mtio.h and are supported in ST as well. |
| * See sys/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 _SYS_MTIO_H |
| #define MTIOCTOP MTIOCODE('a') /* perform tape op */ |
| #endif /* _SYS_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 /* __TS_MTIO_H__ */ |