xref: /original-bsd/sys/dev/scsi/disk.h (revision 3705696b)
1 /*
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This software was developed by the Computer Systems Engineering group
6  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7  * contributed to Berkeley.
8  *
9  * All advertising materials mentioning features or use of this software
10  * must display the following acknowledgement:
11  *	This product includes software developed by the University of
12  *	California, Lawrence Berkeley Laboratories.
13  *
14  * %sccs.include.redist.c%
15  *
16  *	@(#)disk.h	8.1 (Berkeley) 06/10/93
17  *
18  * from: $Header: disk.h,v 1.4 93/04/30 00:04:10 torek Exp $ (LBL)
19  */
20 
21 /*
22  * SCSI definitions for Direct Access Devices (disks).
23  * This includes WORMs and CD-ROMs (although a few commands, such as
24  * format or write, are nonsensical on some).
25  *
26  * Commands defined in common headers (scsi.h or disktape.h) appear here
27  * as comments.
28  */
29 
30 	/* group 0 */
31 /*	CMD_TEST_UNIT_READY	0x00	   test unit ready */
32 #define	CMD_REZERO		0x01	/* rezero unit */
33 /*	CMD_REQUEST_SENSE	0x03	   request sense */
34 #define	CMD_FORMAT_UNIT		0x04	/* format unit (disk) */
35 #define	CMD_REASSIGN_BLOCKS	0x07	/* reassign blocks (disk, WORM) */
36 #define	CMD_READ6		0x08	/* read (6 byte cdb) */
37 #define	CMD_WRITE6		0x0a	/* write (6 byte cdb) */
38 #define	CMD_SEEK6		0x0b	/* seek (6 byte cdb) */
39 /*	CMD_INQUIRY		0x12	   inquiry */
40 /*	CMD_MODE_SELECT		0x15	   mode select */
41 #define	CMD_RESERVE		0x16	/* reserve */
42 #define	CMD_RELEASE		0x17	/* release */
43 /*	CMD_COPY		0x18	   copy */
44 /*	CMD_MODE_SENSE		0x1a	   mode sense */
45 #define	CMD_SSU			0x1b	/* start/stop unit */
46 /*	CMD_RECEIVE_DIAG	0x1c	   receive diagnostic results */
47 /*	CMD_SEND_DIAG		0x1d	   send diagnostic */
48 #define	CMD_PAMR		0x1e	/* prevent/allow medium removal */
49 
50 	/* group 1 */
51 #define	CMD_READ_CAPACITY	0x25	/* read capacity */
52 #define	CMD_READ10		0x28	/* read (10 byte cdb) */
53 #define	CMD_WRITE10		0x2a	/* write (10 byte cdb) */
54 #define	CMD_SEEK10		0x2b	/* write (10 byte cdb) */
55 #define	CMD_WRITE_VERIFY	0x2e	/* write and verify */
56 #define	CMD_VERIFY		0x2f	/* verify */
57 #define	CMD_SEARCH_H		0x30	/* search data high */
58 #define	CMD_SEARCH_E		0x31	/* search data equal */
59 #define	CMD_SEARCH_L		0x32	/* search data low */
60 #define	CMD_SET_LIMITS		0x33	/* set limits */
61 /*	CMD_COMPARE		0x39	   compare */
62 #define	CMD_COPY_VERIFY		0x3a	/* copy and verify */
63 
64 /* this one is in van's but not in my 17B documents */
65 #define	CMD_READ_DEFECT_DATA	0x37	/* read defect data */ /* ??? */
66 
67 /*
68  * Structure of a FORMAT UNIT command (i.e., the cdb):
69  *	byte 0: opcode<8>
70  *	byte 1: lun<3> format_data<1> complete_list<1> defect_list_format<3>
71  *	byte 2: vendor unique
72  *	byte 3: interleave (MSB)
73  *	byte 4: interleave (LSB)
74  *	byte 5: control
75  */
76 struct scsi_cdb_fu {
77 	u_char	cdb_cmd;		/* SCSI_CMD_FU */
78 	u_char	cdb_lun_etc;		/* lun+FD+CL+DLF */
79 	u_char	cdb_vu;			/* vendor unique */
80 	u_char	cdb_ilvh;		/* interleave (MSB) */
81 	u_char	cdb_ilvl;		/* interleave (LSB) */
82 	u_char	cdb_ctrl;		/* control byte */
83 };
84 
85 /*
86  * If format data are supplied, they give either additional (cl=0) or
87  * new (cl=1) defect list in one of the following formats.
88  * Formats 1, 2, and 3 are the same as 0; formats 6 and 7 are
89  * vendor unique and reserved, respectively.  (The `backwards'
90  * in `backwards compatible'...)
91  */
92 #define	SCSI_DLF_BLOCK	0		/* dlf = blocks */
93 #define	SCSI_DLF_BFI	4		/* dlf = bytes from index */
94 #define	SCSI_DLF_PS	5		/* dlf = physical sectors */
95 
96 /*
97  * Defect list header, block format (`defect block address').
98  *
99  * N.B.: this structure is also used for the Reassign Blocks command;
100  * there the `defect block address' becomes a `defect logical block address'.
101  */
102 struct scsi_dlf_dba {
103 	u_short	dlf_xxx;		/* reserved */
104 	u_char	dlf_lenh,		/* defect list length (MSB) */
105 		dlf_lenl;		/* defect list length (LSB) */
106 	struct scsi_dlf_dba_desc {
107 		u_char	dbah,		/* defect block address (MSB) */
108 			dbahm,		/* defect block address */
109 			dbalm,		/* defect block address */
110 			dbal;		/* defect block address (LSB) */
111 	} dlf_dba[1];			/* actually longer */
112 };
113 
114 /*
115  * Defect list header, Bytes From Index format.
116  */
117 struct scsi_dlf_bfi {
118 	u_short	dlf_xxx;		/* reserved */
119 	u_char	dlf_lenh,		/* defect list length (MSB) */
120 		dlf_lenl;		/* defect list length (LSB) */
121 	struct scsi_dlf_bfi_desc {
122 		u_char	cylh,		/* cylinder number of defect (MSB) */
123 			cylm,		/* cylinder number of defect */
124 			cyll,		/* cylinder number of defect (LSB) */
125 			head,		/* head number of defect */
126 			bfih,		/* defect bytes from index (MSB) */
127 			bfihm,		/* defect bytes from index */
128 			bfilm,		/* defect bytes from index */
129 			bfil;		/* defect bytes from index (LSB) */
130 	} dlf_bfi[1];			/* actually longer */
131 };
132 
133 /*
134  * Defect list header, Physical Sector format.
135  */
136 struct scsi_dlf_ps {
137 	u_short	dlf_xxx;		/* reserved */
138 	u_char	dlf_lenh,		/* defect list length (MSB) */
139 		dlf_lenl;		/* defect list length (LSB) */
140 	struct scsi_dlf_ps_desc {
141 		u_char	cylh,		/* cylinder number of defect (MSB) */
142 			cylm,		/* cylinder number of defect */
143 			cyll,		/* cylinder number of defect (LSB) */
144 			head,		/* head number of defect */
145 			dsnh,		/* defect sector number (MSB) */
146 			dsnhm,		/* defect sector number */
147 			dsnlm,		/* defect sector number */
148 			dsnl;		/* defect sector number (LSB) */
149 	} dlf_ps[1];			/* actually longer */
150 };
151 
152 /*
153  * For MODE SENSE and MODE SELECT: Mode page codes for disks.
154  */
155 /*				0x00	   vendor specific */
156 #define	SCSI_MS_PC_RWERRREC	0x01	/* r/w error recovery parameters */
157 /*	SCSI_MS_PC_DR		0x02	   disconnect/reconnect control */
158 #define	SCSI_MS_PC_FMT		0x03	/* format parameters */
159 #define	SCSI_MS_PC_RDGEOM	0x04	/* Rigid Disk geometry */
160 #define	SCSI_MS_PC_FD		0x05	/* flexible disk page */
161 /*				0x06	   reserved */
162 #define	SCSI_MS_PC_VERRREC	0x07	/* verify error recovery page */
163 #define	SCSI_MS_PC_CACHE	0x08	/* cache page */
164 /*	SCSI_MS_PC_PDEV		0x09	   peripheral device page */
165 /*	SCSI_MS_PC_CTLMODE	0x0a	   control mode page */
166 #define	SCSI_MS_PC_MTSUPP	0x0b	/* medium types supported */
167 #define	SCSI_MS_PC_NOTCH	0x0c	/* notch page */
168 /*				0x0d..0x1f reserved */
169 /*				0x20..0x3e vendor specific */
170 #define	SCSI_MS_PC_CDCCACHECTL	0x38	/* CDC (Wren) cache control page */
171 
172 /*
173  * Structure of a Read/Write Error Recovery mode page.
174  * N.B.: CDC Wren V, at least, does not include write retry & time limit.
175  */
176 struct scsi_page_rwerrrec {
177 	u_char	rw_flags,	/* flags, see below */
178 		rw_read_retry,	/* read retry count */
179 		rw_corr_span,	/* correction span */
180 		rw_hd_off,	/* head offset count */
181 		rw_ds_off,	/* data strobe offset count */
182 		rw_xxx0,	/* reserved */
183 		rw_write_retry,	/* write retry count */
184 		rw_xxx1,	/* reserved */
185 		rw_rtlh,	/* recovery time limit (MSB) */
186 		rw_rtll;	/* recovery time limit (LSB) */
187 };
188 /* rw_flags */
189 #define	SCSI_RWE_AWRE	0x80	/* reallocate defective blocks on write */
190 #define	SCSI_RWE_ARRE	0x40	/* reallocate defective blocks on read */
191 #define	SCSI_RWE_TB	0x20	/* transfer unrecoverable block */
192 #define	SCSI_RWE_RC	0x10	/* recovery may not cause delay: may lie */
193 #define	SCSI_RWE_EER	0x08	/* use most expedient recovery, not best */
194 #define	SCSI_RWE_PER	0x04	/* report recovered errors */
195 #define	SCSI_RWE_DTE	0x02	/* stop after recovered error */
196 #define	SCSI_RWE_DCR	0x01	/* use ECC for detection only */
197 
198 /*
199  * Structure of a Format Device mode page.
200  */
201 struct scsi_page_fmt {
202 	u_char	fmt_tpzh,	/* tracks per zone (MSB) */
203 		fmt_tpzl,	/* tracks per zone (LSB) */
204 		fmt_aspzh,	/* alternate sectors per zone (MSB) */
205 		fmt_aspzl,	/* alternate sectors per zone (LSB) */
206 		fmt_atpzh,	/* alternate tracks per zone (MSB) */
207 		fmt_atpzl,	/* alternate tracks per zone (LSB) */
208 		fmt_atpvh,	/* alternate tracks per volume (MSB) */
209 		fmt_atpvl,	/* alternate tracks per volume (LSB) */
210 		fmt_spth,	/* sectors per track (MSB) */
211 		fmt_sptl,	/* sectors per track (LSB) */
212 		fmt_dbppsh,	/* data bytes per physical sector (MSB) */
213 		fmt_dbppsl,	/* data bytes per physical sector (LSB) */
214 		fmt_ilh,	/* interleave (MSB) */
215 		fmt_ill,	/* interleave (LSB) */
216 		fmt_tsfh,	/* track skew factor (MSB) */
217 		fmt_tsfl,	/* track skew factor (LSB) */
218 		fmt_csfh,	/* cylinder skew factor (MSB) */
219 		fmt_csfl,	/* cylinder skew factor (LSB) */
220 		fmt_flags,	/* flags, see below */
221 		fmt_xxx[3];	/* reserved */
222 };
223 /* fmt_flags. Note, HSEC|SSEC meaning varies all over the map! */
224 #define	SCSI_FMT_HSEC	0x80	/* hard sector */
225 #define	SCSI_FMT_SSEC	0x40	/* soft sector */
226 #define	SCSI_FMT_RMB	0x20	/* removable media */
227 #define	SCSI_FMT_SURF	0x10	/* format by surface (vs. by cylinder) */
228 /*			0x0f	   reserved */
229 
230 /*
231  * Structure of a Rigid Disk Geometry mode page.
232  * N.B.: CDC Wren V, at least, does not include rpm.
233  */
234 struct scsi_page_rdgeom {
235 	u_char	rd_ncylh,	/* number of cylinders (MSB) */
236 		rd_ncylm,	/* number of cylinders */
237 		rd_ncyll,	/* number of cylinders (LSB) */
238 		rd_nheads,	/* number of heads */
239 		rd_wpcylh,	/* start cyl for write precomp. (MSB) */
240 		rd_wpcylm,	/* start cyl for write precomp. */
241 		rd_wpcyll,	/* start cyl for write precomp. (LSB) */
242 		rd_rwcylh,	/* start cyl for reduced write current (MSB) */
243 		rd_rwcylm,	/* start cyl for reduced write current */
244 		rd_rwcyll,	/* start cyl for reduced write current (LSB) */
245 		rd_steph,	/* drive step rate (.1 us units) (MSB) */
246 		rd_stepl,	/* drive step rate (LSB) */
247 		rd_lcylh,	/* landing zone cylinder (MSB) */
248 		rd_lcylm,	/* landing zone cylinder */
249 		rd_lcyll,	/* landing zone cylinder (LSB) */
250 		rd_rpl,		/* spindle synch control, see below */
251 		rd_roff,	/* rotational offset (for rpl) */
252 		rd_xxx1,	/* reserved */
253 		rd_rpmh,	/* medium rotation rate (rpm) (MSB) */
254 		rd_rpml,	/* medium rotation rate (rpm) (LSB) */
255 		rd_xxx2[2];	/* reserved */
256 };
257 /* values for rd_rpl. */
258 #define	SCSI_RD_RPL_MASK	0x03	/* mask for RPL field */
259 #define	SCSI_RD_RPL_NONE	0x00	/* sync disabled or not supported */
260 #define	SCSI_RD_RPL_SLAVE	0x01	/* disk is a Slave */
261 #define	SCSI_RD_RPL_MASTER	0x02	/* disk is a Master */
262 #define	SCSI_RD_RPL_MCONTROL	0x03	/* disk is a Master Control */
263 
264 /*
265  * Structure of a Verify Error Recovery mode page.
266  */
267 struct scsi_page_verrrec {
268 	u_char	v_flags,	/* flags, see below */
269 		v_verify_retry,	/* verify retry count */
270 		v_corr_span,	/* verify correction span */
271 		v_xxx[5],	/* reserved */
272 		v_rtlh,		/* verify recovery time limit (MSB) */
273 		v_rtll;		/* verify recovery time limit (LSB) */
274 };
275 #define	SCSI_V_EER	0x08	/* use most expedient recovery, not best */
276 #define	SCSI_V_PER	0x04	/* report recovered errors */
277 #define	SCSI_V_DTE	0x02	/* stop after recovered error */
278 #define	SCSI_V_DCR	0x01	/* use ECC for detection only */
279 
280 /*
281  * Structure of a Caching mode page.
282  */
283 struct scsi_page_cache {
284 	u_char	cache_flags,	/* flags, see below */
285 		cache_reten,	/* cache retention priorities (rd + wr) */
286 		cache_dptlh,	/* disable prefetch transfer length (MSB) */
287 		cache_dptll,	/* disable prefetch transfer length (LSB) */
288 		cache_minpfh,	/* minimum prefetch (MSB) */
289 		cache_minpfl,	/* minimum prefetch (LSB) */
290 		cache_maxpfh,	/* maximum prefetch (MSB) */
291 		cache_maxpfl,	/* maximum prefetch (LSB) */
292 		cache_mpch,	/* maximum prefetch ceiling (MSB) */
293 		cache_mpcl;	/* maximum prefetch ceiling (LSB) */
294 };
295 #define	SCSI_CACHE_WCE	0x04	/* write cache enable */
296 #define	SCSI_CACHE_MF	0x02	/* if set, prefetch depends on xfer length */
297 #define	SCSI_CACHE_RCD	0x01	/* read cache disable */
298 
299 #define	SCSI_CACHE_RDPOLICY(x) ((x) >> 4)
300 #define	SCSI_CACHE_WRPOLICY(x) ((x) & 0xf)
301 #define	SCSI_CACHE_DEFAULT	0	/* use target default */
302 #define	SCSI_CACHE_KEEPPF	1	/* keep prefetch data over cmd data */
303 #define	SCSI_CACHE_KEEPCMD	15	/* keep cmd data over prefetch data */
304 
305 /*
306  * Structure of a Control Mode mode page.
307  */
308 struct scsi_page_ctlmode {
309 	u_char	cm_rlec,	/* report log-activity exception condition */
310 		cm_qctl,	/* queue control (below) */
311 		cm_ecaaen,	/* ECA and AEN flags (below) */
312 		cm_xxx,		/* reserved */
313 		cm_aenholdh,	/* AEN holdoff period (ms) (MSB) */
314 		cm_aenholdl;	/* AEN holdoff period (ms) (LSB) */
315 };
316 #define	SCSI_CM_RLEC	0x01	/* RLEC flag occupies only low bit */
317 #define	SCSI_CM_QMOD(x) ((x) >> 4)	/* queue algorithm modifier */
318 #define	SCSI_CM_QERR	0x02		/* abort cmd queue after error */
319 #define	SCSI_CM_DQUE	0x01		/* disable tagged queueing */
320 #define	SCSI_CM_ECA	0x80	/* enable Extended Contingent Alliance */
321 #define	SCSI_CM_RAENP	0x04	/* target may do Async Err Notif after init */
322 #define	SCSI_CM_UAAENP	0x02	/* target may do AEN for Unit Attention */
323 #define	SCSI_CM_EAENP	0x01	/* target may do AEN for deferred errors */
324 
325 /*
326  * Structure of a CDC-specific Cache Control mode page.
327  */
328 struct scsi_page_CDCcachectlmode {
329 	u_char	ccm_flags,	/* flags (below) */
330 		ccm_pfthresh,	/* prefetch threshold */
331 		ccm_maxthresh,	/* maximum threshold (?) */
332 		ccm_maxpfmult,	/* maximum prefetch multiplier */
333 		ccm_minthresh,	/* minimum thresold (?) */
334 		ccm_minpfmult,	/* minimum prefetch multiplier */
335 		ccm_xxx[8];	/* reserved */
336 };
337 #define	SCSI_CDC_CCM_WIE 0x40	/* write index enable */
338 #define	SCSI_CDC_CCM_CE	 0x10	/* cache enable */
339 #define	SCSI_CDC_CCM_TBLSZ(x) ((x) & 0xf) /* table size */
340 
341 /*
342  * Bits in cdb_lenl for a READ CAPACITY command,
343  * and structure returned as data.
344  *
345  * If PMI is off, the lba in the cdb must be 0.
346  */
347 #define	SCSI_CMD_RC_PMI		0x01	/* Partial Medium Indicator */
348 
349 struct scsi_rc {
350 	u_char	rc_lbah;		/* logical block address (MSB) */
351 	u_char	rc_lbahm;		/* logical block address */
352 	u_char	rc_lbalm;		/* logical block address */
353 	u_char	rc_lbal;		/* logical block address (LSB) */
354 	u_char	rc_blh;			/* block length (MSB) */
355 	u_char	rc_blhm;		/* block length */
356 	u_char	rc_bllm;		/* block length */
357 	u_char	rc_bll;			/* block length (LSB) */
358 };
359