xref: /csrg-svn/sys/dev/scsi/disk.h (revision 57749)
154876Storek /*
254876Storek  * Copyright (c) 1992 The Regents of the University of California.
354876Storek  * All rights reserved.
454876Storek  *
554876Storek  * This software was developed by the Computer Systems Engineering group
654876Storek  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
754876Storek  * contributed to Berkeley.
854876Storek  *
955559Storek  * All advertising materials mentioning features or use of this software
1055559Storek  * must display the following acknowledgement:
1155559Storek  *	This product includes software developed by the University of
1255559Storek  *	California, Lawrence Berkeley Laboratories.
1355559Storek  *
1454876Storek  * %sccs.include.redist.c%
1554876Storek  *
16*57749Storek  *	@(#)disk.h	5.3 (Berkeley) 02/01/93
1754876Storek  *
18*57749Storek  * from: $Header: disk.h,v 1.3 92/12/02 03:43:24 torek Exp $ (LBL)
1954876Storek  */
2054876Storek 
2154876Storek /*
2254876Storek  * SCSI definitions for Direct Access Devices (disks).
2354876Storek  * This includes WORMs and CD-ROMs (although a few commands, such as
2454876Storek  * format or write, are nonsensical on some).
2554876Storek  *
26*57749Storek  * Commands defined in common headers (scsi.h or disktape.h) appear here
27*57749Storek  * as comments.
2854876Storek  */
2954876Storek 
3054876Storek 	/* group 0 */
3154876Storek /*	CMD_TEST_UNIT_READY	0x00	   test unit ready */
3254876Storek #define	CMD_REZERO		0x01	/* rezero unit */
33*57749Storek /*	CMD_REQUEST_SENSE	0x03	   request sense */
3454876Storek #define	CMD_FORMAT_UNIT		0x04	/* format unit (disk) */
3554876Storek #define	CMD_REASSIGN_BLOCKS	0x07	/* reassign blocks (disk, WORM) */
3654876Storek #define	CMD_READ6		0x08	/* read (6 byte cdb) */
3754876Storek #define	CMD_WRITE6		0x0a	/* write (6 byte cdb) */
3854876Storek #define	CMD_SEEK6		0x0b	/* seek (6 byte cdb) */
3954876Storek /*	CMD_INQUIRY		0x12	   inquiry */
40*57749Storek /*	CMD_MODE_SELECT		0x15	   mode select */
4154876Storek #define	CMD_RESERVE		0x16	/* reserve */
4254876Storek #define	CMD_RELEASE		0x17	/* release */
4354876Storek /*	CMD_COPY		0x18	   copy */
44*57749Storek /*	CMD_MODE_SENSE		0x1a	   mode sense */
4554876Storek #define	CMD_SSU			0x1b	/* start/stop unit */
4654876Storek /*	CMD_RECEIVE_DIAG	0x1c	   receive diagnostic results */
4754876Storek /*	CMD_SEND_DIAG		0x1d	   send diagnostic */
4854876Storek #define	CMD_PAMR		0x1e	/* prevent/allow medium removal */
4954876Storek 
5054876Storek 	/* group 1 */
5154876Storek #define	CMD_READ_CAPACITY	0x25	/* read capacity */
5254876Storek #define	CMD_READ10		0x28	/* read (10 byte cdb) */
5354876Storek #define	CMD_WRITE10		0x2a	/* write (10 byte cdb) */
5454876Storek #define	CMD_SEEK10		0x2b	/* write (10 byte cdb) */
5554876Storek #define	CMD_WRITE_VERIFY	0x2e	/* write and verify */
5654876Storek #define	CMD_VERIFY		0x2f	/* verify */
5754876Storek #define	CMD_SEARCH_H		0x30	/* search data high */
5854876Storek #define	CMD_SEARCH_E		0x31	/* search data equal */
5954876Storek #define	CMD_SEARCH_L		0x32	/* search data low */
6054876Storek #define	CMD_SET_LIMITS		0x33	/* set limits */
6154876Storek /*	CMD_COMPARE		0x39	   compare */
6254876Storek #define	CMD_COPY_VERIFY		0x3a	/* copy and verify */
6354876Storek 
6454876Storek /* this one is in van's but not in my 17B documents */
6554876Storek #define	CMD_READ_DEFECT_DATA	0x37	/* read defect data */ /* ??? */
6654876Storek 
6754876Storek /*
6854876Storek  * Structure of a FORMAT UNIT command (i.e., the cdb):
6954876Storek  *	byte 0: opcode<8>
7054876Storek  *	byte 1: lun<3> format_data<1> complete_list<1> defect_list_format<3>
7154876Storek  *	byte 2: vendor unique
7254876Storek  *	byte 3: interleave (MSB)
7354876Storek  *	byte 4: interleave (LSB)
7454876Storek  *	byte 5: control
7554876Storek  */
7654876Storek struct scsi_cdb_fu {
7754876Storek 	u_char	cdb_cmd;		/* SCSI_CMD_FU */
7854876Storek 	u_char	cdb_lun_etc;		/* lun+FD+CL+DLF */
7954876Storek 	u_char	cdb_vu;			/* vendor unique */
8054876Storek 	u_char	cdb_ilvh;		/* interleave (MSB) */
8154876Storek 	u_char	cdb_ilvl;		/* interleave (LSB) */
8254876Storek 	u_char	cdb_ctrl;		/* control byte */
8354876Storek };
8454876Storek 
8554876Storek /*
8654876Storek  * If format data are supplied, they give either additional (cl=0) or
8754876Storek  * new (cl=1) defect list in one of the following formats.
8854876Storek  * Formats 1, 2, and 3 are the same as 0; formats 6 and 7 are
8954876Storek  * vendor unique and reserved, respectively.  (The `backwards'
9054876Storek  * in `backwards compatible'...)
9154876Storek  */
9254876Storek #define	SCSI_DLF_BLOCK	0		/* dlf = blocks */
9354876Storek #define	SCSI_DLF_BFI	4		/* dlf = bytes from index */
9454876Storek #define	SCSI_DLF_PS	5		/* dlf = physical sectors */
9554876Storek 
9654876Storek /*
9754876Storek  * Defect list header, block format (`defect block address').
9854876Storek  *
9954876Storek  * N.B.: this structure is also used for the Reassign Blocks command;
10054876Storek  * there the `defect block address' becomes a `defect logical block address'.
10154876Storek  */
10254876Storek struct scsi_dlf_dba {
10354876Storek 	u_short	dlf_xxx;		/* reserved */
10454876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
10554876Storek 		dlf_lenl;		/* defect list length (LSB) */
10654876Storek 	struct scsi_dlf_dba_desc {
10754876Storek 		u_char	dbah,		/* defect block address (MSB) */
10854876Storek 			dbahm,		/* defect block address */
10954876Storek 			dbalm,		/* defect block address */
11054876Storek 			dbal;		/* defect block address (LSB) */
11154876Storek 	} dlf_dba[1];			/* actually longer */
11254876Storek };
11354876Storek 
11454876Storek /*
11554876Storek  * Defect list header, Bytes From Index format.
11654876Storek  */
11754876Storek struct scsi_dlf_bfi {
11854876Storek 	u_short	dlf_xxx;		/* reserved */
11954876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
12054876Storek 		dlf_lenl;		/* defect list length (LSB) */
12154876Storek 	struct scsi_dlf_bfi_desc {
12254876Storek 		u_char	cylh,		/* cylinder number of defect (MSB) */
12354876Storek 			cylm,		/* cylinder number of defect */
12454876Storek 			cyll,		/* cylinder number of defect (LSB) */
12554876Storek 			head,		/* head number of defect */
12654876Storek 			bfih,		/* defect bytes from index (MSB) */
12754876Storek 			bfihm,		/* defect bytes from index */
12854876Storek 			bfilm,		/* defect bytes from index */
12954876Storek 			bfil;		/* defect bytes from index (LSB) */
13054876Storek 	} dlf_bfi[1];			/* actually longer */
13154876Storek };
13254876Storek 
13354876Storek /*
13454876Storek  * Defect list header, Physical Sector format.
13554876Storek  */
13654876Storek struct scsi_dlf_ps {
13754876Storek 	u_short	dlf_xxx;		/* reserved */
13854876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
13954876Storek 		dlf_lenl;		/* defect list length (LSB) */
14054876Storek 	struct scsi_dlf_ps_desc {
14154876Storek 		u_char	cylh,		/* cylinder number of defect (MSB) */
14254876Storek 			cylm,		/* cylinder number of defect */
14354876Storek 			cyll,		/* cylinder number of defect (LSB) */
14454876Storek 			head,		/* head number of defect */
14554876Storek 			dsnh,		/* defect sector number (MSB) */
14654876Storek 			dsnhm,		/* defect sector number */
14754876Storek 			dsnlm,		/* defect sector number */
14854876Storek 			dsnl;		/* defect sector number (LSB) */
14954876Storek 	} dlf_ps[1];			/* actually longer */
15054876Storek };
15154876Storek 
15254876Storek /*
153*57749Storek  * For MODE SENSE and MODE SELECT: Mode page codes for disks.
15454876Storek  */
155*57749Storek /*				0x00	   vendor specific */
156*57749Storek #define	SCSI_MS_PC_RWERRREC	0x01	/* r/w error recovery parameters */
157*57749Storek /*	SCSI_MS_PC_DR		0x02	   disconnect/reconnect control */
158*57749Storek #define	SCSI_MS_PC_FMT		0x03	/* format parameters */
159*57749Storek #define	SCSI_MS_PC_RDGEOM	0x04	/* Rigid Disk geometry */
160*57749Storek #define	SCSI_MS_PC_FD		0x05	/* flexible disk page */
161*57749Storek /*				0x06	   reserved */
162*57749Storek #define	SCSI_MS_PC_VERRREC	0x07	/* verify error recovery page */
163*57749Storek #define	SCSI_MS_PC_CACHE	0x08	/* cache page */
164*57749Storek /*	SCSI_MS_PC_PDEV		0x09	   peripheral device page */
165*57749Storek /*	SCSI_MS_PC_CTLMODE	0x0a	   control mode page */
166*57749Storek #define	SCSI_MS_PC_MTSUPP	0x0b	/* medium types supported */
167*57749Storek #define	SCSI_MS_PC_NOTCH	0x0c	/* notch page */
168*57749Storek /*				0x0d..0x1f reserved */
169*57749Storek /*				0x20..0x3e vendor specific */
170*57749Storek 
171*57749Storek /*
172*57749Storek  * Structure of a Read/Write Error Recovery mode page.
173*57749Storek  * N.B.: CDC Wren V, at least, does not include write retry & time limit.
174*57749Storek  */
175*57749Storek struct scsi_page_rwerrrec {
176*57749Storek 	u_char	rw_psc,		/* saveable flag + code (0x01) */
177*57749Storek 		rw_len,		/* length (0x0a) */
178*57749Storek 		rw_flags,	/* flags, see below */
179*57749Storek 		rw_read_retry,	/* read retry count */
180*57749Storek 		rw_corr_span,	/* correction span */
181*57749Storek 		rw_hd_off,	/* head offset count */
182*57749Storek 		rw_ds_off,	/* data strobe offset count */
183*57749Storek 		rw_xxx0,	/* reserved */
184*57749Storek 		rw_write_retry,	/* write retry count */
185*57749Storek 		rw_xxx1,	/* reserved */
186*57749Storek 		rw_rtlh,	/* recovery time limit (MSB) */
187*57749Storek 		rw_rtll;	/* recovery time limit (LSB) */
18854876Storek };
189*57749Storek /* rw_flags */
190*57749Storek #define	SCSI_RWE_AWRE	0x80	/* reallocate defective blocks on write */
191*57749Storek #define	SCSI_RWE_ARRE	0x40	/* reallocate defective blocks on read */
192*57749Storek #define	SCSI_RWE_TB	0x20	/* transfer unrecoverable block */
193*57749Storek #define	SCSI_RWE_RC	0x10	/* recovery may not cause delay: may lie */
194*57749Storek #define	SCSI_RWE_EER	0x08	/* use most expedient recovery, not best */
195*57749Storek #define	SCSI_RWE_PER	0x04	/* report recovered errors */
196*57749Storek #define	SCSI_RWE_DTE	0x02	/* stop after recovered error */
197*57749Storek #define	SCSI_RWE_DCR	0x01	/* use ECC for detection only */
19854876Storek 
199*57749Storek /*
200*57749Storek  * Structure of a Format Device mode page.
201*57749Storek  */
202*57749Storek struct scsi_page_fmt {
203*57749Storek 	u_char	fmt_psc,	/* saveable flag + code (0x03) */
204*57749Storek 		fmt_len,	/* length (0x16) */
205*57749Storek 		fmt_tpzh,	/* tracks per zone (MSB) */
206*57749Storek 		fmt_tpzl,	/* tracks per zone (LSB) */
207*57749Storek 		fmt_aspzh,	/* alternate sectors per zone (MSB) */
208*57749Storek 		fmt_aspzl,	/* alternate sectors per zone (LSB) */
209*57749Storek 		fmt_atpzh,	/* alternate tracks per zone (MSB) */
210*57749Storek 		fmt_atpzl,	/* alternate tracks per zone (LSB) */
211*57749Storek 		fmt_atpvh,	/* alternate tracks per volume (MSB) */
212*57749Storek 		fmt_atpvl,	/* alternate tracks per volume (LSB) */
213*57749Storek 		fmt_spth,	/* sectors per track (MSB) */
214*57749Storek 		fmt_sptl,	/* sectors per track (LSB) */
215*57749Storek 		fmt_dbppsh,	/* data bytes per physical sector (MSB) */
216*57749Storek 		fmt_dbppsl,	/* data bytes per physical sector (LSB) */
217*57749Storek 		fmt_ilh,	/* interleave (MSB) */
218*57749Storek 		fmt_ill,	/* interleave (LSB) */
219*57749Storek 		fmt_tsfh,	/* track skew factor (MSB) */
220*57749Storek 		fmt_tsfl,	/* track skew factor (LSB) */
221*57749Storek 		fmt_csfh,	/* cylinder skew factor (MSB) */
222*57749Storek 		fmt_csfl,	/* cylinder skew factor (LSB) */
223*57749Storek 		fmt_flags,	/* flags, see below */
224*57749Storek 		fmt_xxx[3];	/* reserved */
225*57749Storek };
226*57749Storek /* fmt_flags. Note, HSEC|SSEC meaning varies all over the map! */
227*57749Storek #define	SCSI_FMT_HSEC	0x80	/* hard sector */
228*57749Storek #define	SCSI_FMT_SSEC	0x40	/* soft sector */
229*57749Storek #define	SCSI_FMT_RMB	0x20	/* removable media */
230*57749Storek #define	SCSI_FMT_SURF	0x10	/* format by surface (vs. by cylinder) */
231*57749Storek /*			0x0f	   reserved */
23254876Storek 
233*57749Storek /*
234*57749Storek  * Structure of a Rigid Disk Geometry mode page.
235*57749Storek  * N.B.: CDC Wren V, at least, does not include rpm.
236*57749Storek  */
237*57749Storek struct scsi_page_rdgeom {
238*57749Storek 	u_char	rd_psc,		/* saveable flag + code (0x04) */
239*57749Storek 		rd_len,		/* length (0x16) */
240*57749Storek 		rd_ncylh,	/* number of cylinders (MSB) */
241*57749Storek 		rd_ncylm,	/* number of cylinders */
242*57749Storek 		rd_ncyll,	/* number of cylinders (LSB) */
243*57749Storek 		rd_nheads,	/* number of heads */
244*57749Storek 		rd_wpcylh,	/* start cyl for write precomp. (MSB) */
245*57749Storek 		rd_wpcylm,	/* start cyl for write precomp. */
246*57749Storek 		rd_wpcyll,	/* start cyl for write precomp. (LSB) */
247*57749Storek 		rd_rwcylh,	/* start cyl for reduced write current (MSB) */
248*57749Storek 		rd_rwcylm,	/* start cyl for reduced write current */
249*57749Storek 		rd_rwcyll,	/* start cyl for reduced write current (LSB) */
250*57749Storek 		rd_steph,	/* drive step rate (.1 us units) (MSB) */
251*57749Storek 		rd_stepl,	/* drive step rate (LSB) */
252*57749Storek 		rd_lcylh,	/* landing zone cylinder (MSB) */
253*57749Storek 		rd_lcylm,	/* landing zone cylinder */
254*57749Storek 		rd_lcyll,	/* landing zone cylinder (LSB) */
255*57749Storek 		rd_rpl,		/* spindle synch control, see below */
256*57749Storek 		rd_roff,	/* rotational offset (for rpl) */
257*57749Storek 		rd_xxx1,	/* reserved */
258*57749Storek 		rd_rpmh,	/* medium rotation rate (rpm) (MSB) */
259*57749Storek 		rd_rpml,	/* medium rotation rate (rpm) (LSB) */
260*57749Storek 		rd_xxx2[2];	/* reserved */
261*57749Storek };
262*57749Storek /* values for rd_rpl. */
263*57749Storek #define	SCSI_RD_RPL_MASK	0x03	/* mask for RPL field */
264*57749Storek #define	SCSI_RD_RPL_NONE	0x00	/* sync disabled or not supported */
265*57749Storek #define	SCSI_RD_RPL_SLAVE	0x01	/* disk is a Slave */
266*57749Storek #define	SCSI_RD_RPL_MASTER	0x02	/* disk is a Master */
267*57749Storek #define	SCSI_RD_RPL_MCONTROL	0x03	/* disk is a Master Control */
26854876Storek 
26954876Storek /*
270*57749Storek  * Structure of a Verify Error Recovery mode page.
271*57749Storek  */
272*57749Storek struct scsi_page_verrrec {
273*57749Storek 	u_char	v_psc,		/* saveable flag + code (0x07) */
274*57749Storek 		v_len,		/* length (0x0a) */
275*57749Storek 		v_flags,	/* flags, see below */
276*57749Storek 		v_verify_retry,	/* verify retry count */
277*57749Storek 		v_corr_span,	/* verify correction span */
278*57749Storek 		v_xxx[5],	/* reserved */
279*57749Storek 		v_rtlh,		/* verify recovery time limit (MSB) */
280*57749Storek 		v_rtll;		/* verify recovery time limit (LSB) */
281*57749Storek };
282*57749Storek #define	SCSI_V_EER	0x08	/* use most expedient recovery, not best */
283*57749Storek #define	SCSI_V_PER	0x04	/* report recovered errors */
284*57749Storek #define	SCSI_V_DTE	0x02	/* stop after recovered error */
285*57749Storek #define	SCSI_V_DCR	0x01	/* use ECC for detection only */
286*57749Storek 
287*57749Storek /*
288*57749Storek  * Structure of a Caching mode page.
289*57749Storek  */
290*57749Storek struct scsi_page_cache {
291*57749Storek 	u_char	cache_psc,	/* saveable flag + code (0x08) */
292*57749Storek 		cache_len,	/* length (0x0a) */
293*57749Storek 		cache_flags,	/* flags, see below */
294*57749Storek 		cache_reten,	/* cache retention priorities (rd + wr) */
295*57749Storek 		cache_dptlh,	/* disable prefetch transfer length (MSB) */
296*57749Storek 		cache_dptll,	/* disable prefetch transfer length (LSB) */
297*57749Storek 		cache_minpfh,	/* minimum prefetch (MSB) */
298*57749Storek 		cache_minpfl,	/* minimum prefetch (LSB) */
299*57749Storek 		cache_maxpfh,	/* maximum prefetch (MSB) */
300*57749Storek 		cache_maxpfl,	/* maximum prefetch (LSB) */
301*57749Storek 		cache_mpch,	/* maximum prefetch ceiling (MSB) */
302*57749Storek 		cache_mpcl;	/* maximum prefetch ceiling (LSB) */
303*57749Storek };
304*57749Storek #define	SCSI_CACHE_WCE	0x04	/* write cache enable */
305*57749Storek #define	SCSI_CACHE_MF	0x02	/* if set, prefetch depends on xfer length */
306*57749Storek #define	SCSI_CACHE_RCD	0x01	/* read cache disable */
307*57749Storek 
308*57749Storek #define	SCSI_CACHE_RDPOLICY(x) ((x) >> 4)
309*57749Storek #define	SCSI_CACHE_WRPOLICY(x) ((x) & 0xf)
310*57749Storek #define	SCSI_CACHE_DEFAULT	0	/* use target default */
311*57749Storek #define	SCSI_CACHE_KEEPPF	1	/* keep prefetch data over cmd data */
312*57749Storek #define	SCSI_CACHE_KEEPCMD	15	/* keep cmd data over prefetch data */
313*57749Storek 
314*57749Storek /*
315*57749Storek  * Structure of a Control Mode mode page.
316*57749Storek  */
317*57749Storek struct scsi_page_ctlmode {
318*57749Storek 	u_char	cm_psc,		/* saveable flag + code (0x0a) */
319*57749Storek 		cm_len,		/* length (0x06) */
320*57749Storek 		cm_rlec,	/* report log-activity exception condition */
321*57749Storek 		cm_qctl,	/* queue control (below) */
322*57749Storek 		cm_ecaaen,	/* ECA and AEN flags (below) */
323*57749Storek 		cm_xxx,		/* reserved */
324*57749Storek 		cm_aenholdh,	/* AEN holdoff period (ms) (MSB) */
325*57749Storek 		cm_aenholdl;	/* AEN holdoff period (ms) (LSB) */
326*57749Storek };
327*57749Storek #define	SCSI_CM_RLEC	0x01	/* RLEC flag occupies only low bit */
328*57749Storek #define	SCSI_CM_QMOD(x) ((x) >> 4)	/* queue algorithm modifier */
329*57749Storek #define	SCSI_CM_QERR	0x02		/* abort cmd queue after error */
330*57749Storek #define	SCSI_CM_DQUE	0x01		/* disable tagged queueing */
331*57749Storek #define	SCSI_CM_ECA	0x80	/* enable Extended Contingent Alliance */
332*57749Storek #define	SCSI_CM_RAENP	0x04	/* target may do Async Err Notif after init */
333*57749Storek #define	SCSI_CM_UAAENP	0x02	/* target may do AEN for Unit Attention */
334*57749Storek #define	SCSI_CM_EAENP	0x01	/* target may do AEN for deferred errors */
335*57749Storek 
336*57749Storek /*
33754876Storek  * Bits in cdb_lenl for a READ CAPACITY command,
33854876Storek  * and structure returned as data.
33954876Storek  *
34054876Storek  * If PMI is off, the lba in the cdb must be 0.
34154876Storek  */
34254876Storek #define	SCSI_CMD_RC_PMI		0x01	/* Partial Medium Indicator */
34354876Storek 
34454876Storek struct scsi_rc {
34554876Storek 	u_char	rc_lbah;		/* logical block address (MSB) */
34654876Storek 	u_char	rc_lbahm;		/* logical block address */
34754876Storek 	u_char	rc_lbalm;		/* logical block address */
34854876Storek 	u_char	rc_lbal;		/* logical block address (LSB) */
34954876Storek 	u_char	rc_blh;			/* block length (MSB) */
35054876Storek 	u_char	rc_blhm;		/* block length */
35154876Storek 	u_char	rc_bllm;		/* block length */
35254876Storek 	u_char	rc_bll;			/* block length (LSB) */
35354876Storek };
354