xref: /csrg-svn/sys/dev/scsi/disk.h (revision 55559)
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  *
9*55559Storek  * All advertising materials mentioning features or use of this software
10*55559Storek  * must display the following acknowledgement:
11*55559Storek  *	This product includes software developed by the University of
12*55559Storek  *	California, Lawrence Berkeley Laboratories.
13*55559Storek  *
1454876Storek  * %sccs.include.redist.c%
1554876Storek  *
16*55559Storek  *	@(#)disk.h	5.2 (Berkeley) 07/23/92
1754876Storek  *
1854876Storek  * from: $Header: disk.h,v 1.2 92/05/15 11:23:58 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  *
2654876Storek  * Commands defined in the common header (scsi.h) appear here as comments.
2754876Storek  */
2854876Storek 
2954876Storek 	/* group 0 */
3054876Storek /*	CMD_TEST_UNIT_READY	0x00	   test unit ready */
3154876Storek #define	CMD_REZERO		0x01	/* rezero unit */
3254876Storek /*	CMD_REQUEST_SENSE	0x03	/* request sense */
3354876Storek #define	CMD_FORMAT_UNIT		0x04	/* format unit (disk) */
3454876Storek #define	CMD_REASSIGN_BLOCKS	0x07	/* reassign blocks (disk, WORM) */
3554876Storek #define	CMD_READ6		0x08	/* read (6 byte cdb) */
3654876Storek #define	CMD_WRITE6		0x0a	/* write (6 byte cdb) */
3754876Storek #define	CMD_SEEK6		0x0b	/* seek (6 byte cdb) */
3854876Storek /*	CMD_INQUIRY		0x12	   inquiry */
3954876Storek #define	CMD_MODE_SELECT		0x15	/* mode select */
4054876Storek #define	CMD_RESERVE		0x16	/* reserve */
4154876Storek #define	CMD_RELEASE		0x17	/* release */
4254876Storek /*	CMD_COPY		0x18	   copy */
4354876Storek #define	CMD_MODE_SENSE		0x1a	/* mode sense */
4454876Storek #define	CMD_SSU			0x1b	/* start/stop unit */
4554876Storek /*	CMD_RECEIVE_DIAG	0x1c	   receive diagnostic results */
4654876Storek /*	CMD_SEND_DIAG		0x1d	   send diagnostic */
4754876Storek #define	CMD_PAMR		0x1e	/* prevent/allow medium removal */
4854876Storek 
4954876Storek 	/* group 1 */
5054876Storek #define	CMD_READ_CAPACITY	0x25	/* read capacity */
5154876Storek #define	CMD_READ10		0x28	/* read (10 byte cdb) */
5254876Storek #define	CMD_WRITE10		0x2a	/* write (10 byte cdb) */
5354876Storek #define	CMD_SEEK10		0x2b	/* write (10 byte cdb) */
5454876Storek #define	CMD_WRITE_VERIFY	0x2e	/* write and verify */
5554876Storek #define	CMD_VERIFY		0x2f	/* verify */
5654876Storek #define	CMD_SEARCH_H		0x30	/* search data high */
5754876Storek #define	CMD_SEARCH_E		0x31	/* search data equal */
5854876Storek #define	CMD_SEARCH_L		0x32	/* search data low */
5954876Storek #define	CMD_SET_LIMITS		0x33	/* set limits */
6054876Storek /*	CMD_COMPARE		0x39	   compare */
6154876Storek #define	CMD_COPY_VERIFY		0x3a	/* copy and verify */
6254876Storek 
6354876Storek /* this one is in van's but not in my 17B documents */
6454876Storek #define	CMD_READ_DEFECT_DATA	0x37	/* read defect data */ /* ??? */
6554876Storek 
6654876Storek /*
6754876Storek  * Structure of a FORMAT UNIT command (i.e., the cdb):
6854876Storek  *	byte 0: opcode<8>
6954876Storek  *	byte 1: lun<3> format_data<1> complete_list<1> defect_list_format<3>
7054876Storek  *	byte 2: vendor unique
7154876Storek  *	byte 3: interleave (MSB)
7254876Storek  *	byte 4: interleave (LSB)
7354876Storek  *	byte 5: control
7454876Storek  */
7554876Storek struct scsi_cdb_fu {
7654876Storek 	u_char	cdb_cmd;		/* SCSI_CMD_FU */
7754876Storek 	u_char	cdb_lun_etc;		/* lun+FD+CL+DLF */
7854876Storek 	u_char	cdb_vu;			/* vendor unique */
7954876Storek 	u_char	cdb_ilvh;		/* interleave (MSB) */
8054876Storek 	u_char	cdb_ilvl;		/* interleave (LSB) */
8154876Storek 	u_char	cdb_ctrl;		/* control byte */
8254876Storek };
8354876Storek 
8454876Storek /*
8554876Storek  * If format data are supplied, they give either additional (cl=0) or
8654876Storek  * new (cl=1) defect list in one of the following formats.
8754876Storek  * Formats 1, 2, and 3 are the same as 0; formats 6 and 7 are
8854876Storek  * vendor unique and reserved, respectively.  (The `backwards'
8954876Storek  * in `backwards compatible'...)
9054876Storek  */
9154876Storek #define	SCSI_DLF_BLOCK	0		/* dlf = blocks */
9254876Storek #define	SCSI_DLF_BFI	4		/* dlf = bytes from index */
9354876Storek #define	SCSI_DLF_PS	5		/* dlf = physical sectors */
9454876Storek 
9554876Storek /*
9654876Storek  * Defect list header, block format (`defect block address').
9754876Storek  *
9854876Storek  * N.B.: this structure is also used for the Reassign Blocks command;
9954876Storek  * there the `defect block address' becomes a `defect logical block address'.
10054876Storek  */
10154876Storek struct scsi_dlf_dba {
10254876Storek 	u_short	dlf_xxx;		/* reserved */
10354876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
10454876Storek 		dlf_lenl;		/* defect list length (LSB) */
10554876Storek 	struct scsi_dlf_dba_desc {
10654876Storek 		u_char	dbah,		/* defect block address (MSB) */
10754876Storek 			dbahm,		/* defect block address */
10854876Storek 			dbalm,		/* defect block address */
10954876Storek 			dbal;		/* defect block address (LSB) */
11054876Storek 	} dlf_dba[1];			/* actually longer */
11154876Storek };
11254876Storek 
11354876Storek /*
11454876Storek  * Defect list header, Bytes From Index format.
11554876Storek  */
11654876Storek struct scsi_dlf_bfi {
11754876Storek 	u_short	dlf_xxx;		/* reserved */
11854876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
11954876Storek 		dlf_lenl;		/* defect list length (LSB) */
12054876Storek 	struct scsi_dlf_bfi_desc {
12154876Storek 		u_char	cylh,		/* cylinder number of defect (MSB) */
12254876Storek 			cylm,		/* cylinder number of defect */
12354876Storek 			cyll,		/* cylinder number of defect (LSB) */
12454876Storek 			head,		/* head number of defect */
12554876Storek 			bfih,		/* defect bytes from index (MSB) */
12654876Storek 			bfihm,		/* defect bytes from index */
12754876Storek 			bfilm,		/* defect bytes from index */
12854876Storek 			bfil;		/* defect bytes from index (LSB) */
12954876Storek 	} dlf_bfi[1];			/* actually longer */
13054876Storek };
13154876Storek 
13254876Storek /*
13354876Storek  * Defect list header, Physical Sector format.
13454876Storek  */
13554876Storek struct scsi_dlf_ps {
13654876Storek 	u_short	dlf_xxx;		/* reserved */
13754876Storek 	u_char	dlf_lenh,		/* defect list length (MSB) */
13854876Storek 		dlf_lenl;		/* defect list length (LSB) */
13954876Storek 	struct scsi_dlf_ps_desc {
14054876Storek 		u_char	cylh,		/* cylinder number of defect (MSB) */
14154876Storek 			cylm,		/* cylinder number of defect */
14254876Storek 			cyll,		/* cylinder number of defect (LSB) */
14354876Storek 			head,		/* head number of defect */
14454876Storek 			dsnh,		/* defect sector number (MSB) */
14554876Storek 			dsnhm,		/* defect sector number */
14654876Storek 			dsnlm,		/* defect sector number */
14754876Storek 			dsnl;		/* defect sector number (LSB) */
14854876Storek 	} dlf_ps[1];			/* actually longer */
14954876Storek };
15054876Storek 
15154876Storek /*
15254876Storek  * Structure of data passed via a MODE SELECT command.
15354876Storek  */
15454876Storek struct scsi_ms {
15554876Storek 	u_char	ms_xxx0,		/* reserved */
15654876Storek 		ms_mt,			/* medium type */
15754876Storek 		ms_xxx1,		/* reserved */
15854876Storek 		ms_bdl;			/* block descriptor length */
15954876Storek 	struct scsi_ms_b_desc {
16054876Storek 		u_char	dc,		/* density code */
16154876Storek 			nbh,		/* number of blocks (MSB) */
16254876Storek 			nbm,		/* number of blocks */
16354876Storek 			nbl,		/* number of blocks (LSB) */
16454876Storek 			xxx,		/* reserved */
16554876Storek 			blh,		/* block length (MSB) */
16654876Storek 			blm,		/* block length */
16754876Storek 			bll;		/* block length (LSB) */
16854876Storek 	} ms_bd[1];			/* actually longer */
16954876Storek 	/* followed by vendor unique bytes */
17054876Storek };
17154876Storek 
17254876Storek /* values for the Medium Type field - disks */
17354876Storek #define	SCSI_CMD_MS_MT_DEFAULT	0x00	/* whatever is current */
17454876Storek #define	SCSI_CMD_MS_MT_SS	0x01	/* single sided, unspecified medium */
17554876Storek #define	SCSI_CMD_MS_MT_DS	0x02	/* double sided, unspecified medium */
17654876Storek #define	SCSI_CMD_MS_MT_8SSSD	0x05	/* 8" floppy, SSSD (X3.73-1980) */
17754876Storek #define	SCSI_CMD_MS_MT_8DSSD	0x06	/* 8" floppy, DSSD (X3B8-140) */
17854876Storek #define	SCSI_CMD_MS_MT_8SSDD	0x09	/* 8" floppy, SSDD (X3B8/78-139) */
17954876Storek #define	SCSI_CMD_MS_MT_8DSDD	0x0a	/* 8" floppy, DSDD (X3.121-1984) */
18054876Storek #define	SCSI_CMD_MS_MT_5SSSD	0x0d	/* 5.25" floppy, SSSD (X3.82-1980) */
18154876Storek #define	SCSI_CMD_MS_MT_5DSDD	0x12	/* 5.25" floppy, DSDD (X3.125-1984) */
18254876Storek #define	SCSI_CMD_MS_MT_5DSDD96	0x16	/* 5.25", DSDD, 96tpi (X3.126-198X) */
18354876Storek #define	SCSI_CMD_MS_MT_5DSQD	0x1a	/* 5.25", DSQD, 96tpi (DIS 8630) */
18454876Storek #define	SCSI_CMD_MS_MT_3DS	0x1e	/* 3.5", double sided (X3.137-198X) */
18554876Storek 
18654876Storek /* values for the Medium Type field - tapes */
18754876Storek #define	SCSI_CMD_MS_MT_QIC_12T	0x40	/* 0.25", 12 tracks */
18854876Storek #define	SCSI_CMD_MS_MT_QIC_24T	0x44	/* 0.25", 24 tracks */
18954876Storek 
19054876Storek /*
19154876Storek  * Bits in cdb_lenl for a READ CAPACITY command,
19254876Storek  * and structure returned as data.
19354876Storek  *
19454876Storek  * If PMI is off, the lba in the cdb must be 0.
19554876Storek  */
19654876Storek #define	SCSI_CMD_RC_PMI		0x01	/* Partial Medium Indicator */
19754876Storek 
19854876Storek struct scsi_rc {
19954876Storek 	u_char	rc_lbah;		/* logical block address (MSB) */
20054876Storek 	u_char	rc_lbahm;		/* logical block address */
20154876Storek 	u_char	rc_lbalm;		/* logical block address */
20254876Storek 	u_char	rc_lbal;		/* logical block address (LSB) */
20354876Storek 	u_char	rc_blh;			/* block length (MSB) */
20454876Storek 	u_char	rc_blhm;		/* block length */
20554876Storek 	u_char	rc_bllm;		/* block length */
20654876Storek 	u_char	rc_bll;			/* block length (LSB) */
20754876Storek };
208