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