xref: /netbsd-src/sys/dev/scsipi/scsi_tape.h (revision 7c7c171d130af9949261bc7dce2150a03c3d239c)
1 /*	$NetBSD: scsi_tape.h,v 1.14 1998/02/13 08:28:43 enami Exp $	*/
2 
3 /*
4  * Copyright (c) 1994 Charles Hannum.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Charles Hannum.
17  * 4. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Originally written by Julian Elischer (julian@tfs.com)
34  * for TRW Financial Systems.
35  *
36  * TRW Financial Systems, in accordance with their agreement with Carnegie
37  * Mellon University, makes this software available to CMU to distribute
38  * or use in any manner that they see fit as long as this message is kept with
39  * the software. For this reason TFS also grants any other persons or
40  * organisations permission to use or modify this software.
41  *
42  * TFS supplies this software to be publicly redistributed
43  * on the understanding that TFS is not responsible for the correct
44  * functioning of this software in any circumstances.
45  *
46  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
47  */
48 
49 /*
50  * SCSI tape interface description
51  */
52 
53 /*
54  * SCSI command formats
55  */
56 
57 #define	READ			0x08
58 #define WRITE			0x0a
59 struct scsi_rw_tape {
60 	u_int8_t opcode;
61 	u_int8_t byte2;
62 #define	SRW_FIXED		0x01
63 	u_int8_t len[3];
64 	u_int8_t control;
65 };
66 
67 #define	SPACE			0x11
68 struct scsi_space {
69 	u_int8_t opcode;
70 	u_int8_t byte2;
71 #define	SS_CODE			0x03
72 #define SP_BLKS			0x00
73 #define SP_FILEMARKS		0x01
74 #define SP_SEQ_FILEMARKS	0x02
75 #define	SP_EOM			0x03
76 	u_int8_t number[3];
77 	u_int8_t control;
78 };
79 
80 #define	WRITE_FILEMARKS		0x10
81 struct scsi_write_filemarks {
82 	u_int8_t opcode;
83 	u_int8_t byte2;
84 	u_int8_t number[3];
85 	u_int8_t control;
86 };
87 
88 #define REWIND			0x01
89 struct scsi_rewind {
90 	u_int8_t opcode;
91 	u_int8_t byte2;
92 #define	SR_IMMED		0x01
93 	u_int8_t unused[3];
94 	u_int8_t control;
95 };
96 
97 #define LOAD			0x1b
98 struct scsi_load {
99 	u_int8_t opcode;
100 	u_int8_t byte2;
101 #define	SL_IMMED		0x01
102 	u_int8_t unused[2];
103 	u_int8_t how;
104 #define LD_UNLOAD		0x00
105 #define LD_LOAD			0x01
106 #define LD_RETENSION		0x02
107 	u_int8_t control;
108 };
109 
110 #define	ERASE			0x19
111 struct scsi_erase {
112 	u_int8_t opcode;
113 	u_int8_t byte2;
114 #define	SE_LONG			0x01
115 #define	SE_IMMED		0x02
116 	u_int8_t unused[3];
117 	u_int8_t control;
118 };
119 
120 #define	READ_BLOCK_LIMITS	0x05
121 struct scsi_block_limits {
122 	u_int8_t opcode;
123 	u_int8_t byte2;
124 	u_int8_t unused[3];
125 	u_int8_t control;
126 };
127 
128 struct scsi_block_limits_data {
129 	u_int8_t reserved;
130 	u_int8_t max_length[3];		/* Most significant */
131 	u_int8_t min_length[2];		/* Most significant */
132 };
133 
134 /* See SCSI-II spec 9.3.3.1 */
135 struct scsi_tape_dev_conf_page {
136 	u_int8_t pagecode;	/* 0x10 */
137 	u_int8_t pagelength;	/* 0x0e */
138 	u_int8_t byte2;
139 #define	SMT_CAP			0x40	/* change active partition */
140 #define	SMT_CAF			0x20	/* change active format */
141 #define	SMT_AFMASK		0x1f	/* active format mask */
142 	u_int8_t active_partition;
143 	u_int8_t wb_full_ratio;
144 	u_int8_t rb_empty_ratio;
145 	u_int8_t wrdelay_time[2];
146 	u_int8_t byte8;
147 #define	SMT_DBR			0x80	/* data buffer recovery */
148 #define	SMT_BIS			0x40	/* block identifiers supported */
149 #define	SMT_RSMK		0x20	/* report setmarks */
150 #define	SMT_AVC			0x10	/* automatic velocity control */
151 #define SMT_SOCF_MASK		0xc0	/* stop on consecutive formats */
152 #define	SMT_RBO			0x20	/* recover buffer order */
153 #define	SMT_REW			0x10	/* report early warning */
154 	u_int8_t gap_size;
155 	u_int8_t byte10;
156 #define	SMT_EODDEFINED		0xe0	/* EOD defined */
157 #define	SMT_EEG			0x10	/* enable EOD generation */
158 #define	SMT_SEW			0x80	/* synchronize at early warning */
159 	u_int8_t ew_bufsize[3];
160 	u_int8_t sel_comp_alg;
161 #define	SMT_COMP_NONE		0x00
162 #define	SMT_COMP_DEFAULT	0x01
163 	u_int8_t reserved;
164 };
165 
166 /* from SCSI-3: SSC-Rev10 (6/97) */
167 struct scsi_tape_dev_compression_page {
168 	u_int8_t pagecode;	/* 0x0f */
169 	u_int8_t pagelength;	/* 0x0e */
170 	u_int8_t dce_dcc;
171 #define	DCP_DCE			0x80	/* enable compression */
172 #define	DCP_DCC			0x40	/* compression capable */
173 	u_int8_t dde_red;
174 #define	DCP_DDE			0x80	/* enable decompression */
175 /* There's a lot of gup about bits 5,6 for reporting exceptions */
176 /* in transitions between compressed and uncompressed data- but */
177 /* mostly we want the default (0), which is to report a MEDIUM	*/
178 /* ERROR when a read transitions into data that can't be de-	*/
179 /* compressed */
180 	u_int8_t comp_alg[4];		/* compression algorithm */
181 	u_int8_t decomp_alg[4];		/* de-"" */
182 	u_int8_t reserved[4];
183 };
184 
185 /* defines for the device specific byte in the mode select/sense header */
186 #define	SMH_DSP_SPEED		0x0F
187 #define	SMH_DSP_BUFF_MODE	0x70
188 #define	SMH_DSP_BUFF_MODE_OFF	0x00
189 #define	SMH_DSP_BUFF_MODE_ON	0x10
190 #define	SMH_DSP_BUFF_MODE_MLTI	0x20
191 #define	SMH_DSP_WRITE_PROT	0x80
192 
193 /* A special for the CIPHER ST150S(old drive) */
194 struct block_desc_cipher {
195 	u_int8_t density;
196 	u_int8_t nblocks[3];
197 	u_int8_t reserved;
198 	u_int8_t blklen[3];
199 	u_int8_t other;
200 #define ST150_SEC		0x01	/* soft error count */
201 #define	SR150_AUI		0x02	/* autoload inhibit */
202 };
203 
204 
205 #define	READ_POSITION	0x34
206 struct scsi_tape_read_position {
207 	u_int8_t opcode;		/* READ_POSITION */
208 	u_int8_t byte1;			/* set LSB to read hardware block pos */
209 	u_int8_t reserved[8];
210 };
211 
212 #define	LOCATE		0x2B
213 
214 /**********************************************************************
215 			from the scsi2 spec
216                 Value Tracks Density(bpi) Code Type  Reference     Note
217                 0x1     9       800       NRZI  R    X3.22-1983    2
218                 0x2     9      1600       PE    R    X3.39-1986    2
219                 0x3     9      6250       GCR   R    X3.54-1986    2
220                 0x5    4/9     8000       GCR   C    X3.136-1986   1
221                 0x6     9      3200       PE    R    X3.157-1987   2
222                 0x7     4      6400       IMFM  C    X3.116-1986   1
223                 0x8     4      8000       GCR   CS   X3.158-1986   1
224                 0x9    18     37871       GCR   C    X3B5/87-099   2
225                 0xA    22      6667       MFM   C    X3B5/86-199   1
226                 0xB     4      1600       PE    C    X3.56-1986    1
227                 0xC    24     12690       GCR   C    HI-TC1        1,5
228                 0xD    24     25380       GCR   C    HI-TC2        1,5
229                 0xF    15     10000       GCR   C    QIC-120       1,5
230                 0x10   18     10000       GCR   C    QIC-150       1,5
231                 0x11   26     16000       GCR   C    QIC-320(525?) 1,5
232                 0x12   30     51667       RLL   C    QIC-1350      1,5
233                 0x13    1     61000       DDS   CS    X3B5/88-185A 4
234                 0x14    1     43245       RLL   CS    X3.202-1991  4
235                 0x15    1     45434       RLL   CS    ECMA TC17    4
236                 0x16   48     10000       MFM   C     X3.193-1990  1
237                 0x17   48     42500       MFM   C     X3B5/91-174  1
238 		0x45   73     67733	  RLL	C     QIC3095
239 
240                 where Code means:
241                 NRZI Non Return to Zero, change on ones
242                 GCR  Group Code Recording
243                 PE   Phase Encoded
244                 IMFM Inverted Modified Frequency Modulation
245                 MFM  Modified Frequency Modulation
246                 DDS  Dat Data Storage
247                 RLL  Run Length Encoding
248 
249                 where Type means:
250                 R    Reel-to-Reel
251                 C    Cartridge
252                 CS   cassette
253 
254                 where Notes means:
255                 1    Serial Recorded
256                 2    Parallel Recorded
257                 3    Old format know as QIC-11
258                 4    Helical Scan
259                 5    Not ANSI standard, rather industry standard.
260 ********************************************************************/
261 
262 #define	HALFINCH_800	0x01
263 #define	HALFINCH_1600	0x02
264 #define	HALFINCH_6250	0x03
265 #define	QIC_11		0x04	/* from Archive 150S Theory of Op. XXX	*/
266 #define QIC_24		0x05	/* may be bad, works for CIPHER ST150S XXX */
267 #define QIC_120		0x0f
268 #define QIC_150		0x10
269 #define QIC_320		0x11
270 #define QIC_525		0x11
271 #define QIC_1320	0x12
272 #define DDS		0x13
273 #define DAT_1		0x13
274 #define QIC_3095	0x45
275