1 /* 2 * Copyright (c) 1992 The Regents of the University of California. 3 * 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 * %sccs.include.redist.c% 10 * 11 * @(#)disk.h 5.1 (Berkeley) 07/10/92 12 * 13 * from: $Header: disk.h,v 1.2 92/05/15 11:23:58 torek Exp $ (LBL) 14 */ 15 16 /* 17 * SCSI definitions for Direct Access Devices (disks). 18 * This includes WORMs and CD-ROMs (although a few commands, such as 19 * format or write, are nonsensical on some). 20 * 21 * Commands defined in the common header (scsi.h) appear here as comments. 22 */ 23 24 /* group 0 */ 25 /* CMD_TEST_UNIT_READY 0x00 test unit ready */ 26 #define CMD_REZERO 0x01 /* rezero unit */ 27 /* CMD_REQUEST_SENSE 0x03 /* request sense */ 28 #define CMD_FORMAT_UNIT 0x04 /* format unit (disk) */ 29 #define CMD_REASSIGN_BLOCKS 0x07 /* reassign blocks (disk, WORM) */ 30 #define CMD_READ6 0x08 /* read (6 byte cdb) */ 31 #define CMD_WRITE6 0x0a /* write (6 byte cdb) */ 32 #define CMD_SEEK6 0x0b /* seek (6 byte cdb) */ 33 /* CMD_INQUIRY 0x12 inquiry */ 34 #define CMD_MODE_SELECT 0x15 /* mode select */ 35 #define CMD_RESERVE 0x16 /* reserve */ 36 #define CMD_RELEASE 0x17 /* release */ 37 /* CMD_COPY 0x18 copy */ 38 #define CMD_MODE_SENSE 0x1a /* mode sense */ 39 #define CMD_SSU 0x1b /* start/stop unit */ 40 /* CMD_RECEIVE_DIAG 0x1c receive diagnostic results */ 41 /* CMD_SEND_DIAG 0x1d send diagnostic */ 42 #define CMD_PAMR 0x1e /* prevent/allow medium removal */ 43 44 /* group 1 */ 45 #define CMD_READ_CAPACITY 0x25 /* read capacity */ 46 #define CMD_READ10 0x28 /* read (10 byte cdb) */ 47 #define CMD_WRITE10 0x2a /* write (10 byte cdb) */ 48 #define CMD_SEEK10 0x2b /* write (10 byte cdb) */ 49 #define CMD_WRITE_VERIFY 0x2e /* write and verify */ 50 #define CMD_VERIFY 0x2f /* verify */ 51 #define CMD_SEARCH_H 0x30 /* search data high */ 52 #define CMD_SEARCH_E 0x31 /* search data equal */ 53 #define CMD_SEARCH_L 0x32 /* search data low */ 54 #define CMD_SET_LIMITS 0x33 /* set limits */ 55 /* CMD_COMPARE 0x39 compare */ 56 #define CMD_COPY_VERIFY 0x3a /* copy and verify */ 57 58 /* this one is in van's but not in my 17B documents */ 59 #define CMD_READ_DEFECT_DATA 0x37 /* read defect data */ /* ??? */ 60 61 /* 62 * Structure of a FORMAT UNIT command (i.e., the cdb): 63 * byte 0: opcode<8> 64 * byte 1: lun<3> format_data<1> complete_list<1> defect_list_format<3> 65 * byte 2: vendor unique 66 * byte 3: interleave (MSB) 67 * byte 4: interleave (LSB) 68 * byte 5: control 69 */ 70 struct scsi_cdb_fu { 71 u_char cdb_cmd; /* SCSI_CMD_FU */ 72 u_char cdb_lun_etc; /* lun+FD+CL+DLF */ 73 u_char cdb_vu; /* vendor unique */ 74 u_char cdb_ilvh; /* interleave (MSB) */ 75 u_char cdb_ilvl; /* interleave (LSB) */ 76 u_char cdb_ctrl; /* control byte */ 77 }; 78 79 /* 80 * If format data are supplied, they give either additional (cl=0) or 81 * new (cl=1) defect list in one of the following formats. 82 * Formats 1, 2, and 3 are the same as 0; formats 6 and 7 are 83 * vendor unique and reserved, respectively. (The `backwards' 84 * in `backwards compatible'...) 85 */ 86 #define SCSI_DLF_BLOCK 0 /* dlf = blocks */ 87 #define SCSI_DLF_BFI 4 /* dlf = bytes from index */ 88 #define SCSI_DLF_PS 5 /* dlf = physical sectors */ 89 90 /* 91 * Defect list header, block format (`defect block address'). 92 * 93 * N.B.: this structure is also used for the Reassign Blocks command; 94 * there the `defect block address' becomes a `defect logical block address'. 95 */ 96 struct scsi_dlf_dba { 97 u_short dlf_xxx; /* reserved */ 98 u_char dlf_lenh, /* defect list length (MSB) */ 99 dlf_lenl; /* defect list length (LSB) */ 100 struct scsi_dlf_dba_desc { 101 u_char dbah, /* defect block address (MSB) */ 102 dbahm, /* defect block address */ 103 dbalm, /* defect block address */ 104 dbal; /* defect block address (LSB) */ 105 } dlf_dba[1]; /* actually longer */ 106 }; 107 108 /* 109 * Defect list header, Bytes From Index format. 110 */ 111 struct scsi_dlf_bfi { 112 u_short dlf_xxx; /* reserved */ 113 u_char dlf_lenh, /* defect list length (MSB) */ 114 dlf_lenl; /* defect list length (LSB) */ 115 struct scsi_dlf_bfi_desc { 116 u_char cylh, /* cylinder number of defect (MSB) */ 117 cylm, /* cylinder number of defect */ 118 cyll, /* cylinder number of defect (LSB) */ 119 head, /* head number of defect */ 120 bfih, /* defect bytes from index (MSB) */ 121 bfihm, /* defect bytes from index */ 122 bfilm, /* defect bytes from index */ 123 bfil; /* defect bytes from index (LSB) */ 124 } dlf_bfi[1]; /* actually longer */ 125 }; 126 127 /* 128 * Defect list header, Physical Sector format. 129 */ 130 struct scsi_dlf_ps { 131 u_short dlf_xxx; /* reserved */ 132 u_char dlf_lenh, /* defect list length (MSB) */ 133 dlf_lenl; /* defect list length (LSB) */ 134 struct scsi_dlf_ps_desc { 135 u_char cylh, /* cylinder number of defect (MSB) */ 136 cylm, /* cylinder number of defect */ 137 cyll, /* cylinder number of defect (LSB) */ 138 head, /* head number of defect */ 139 dsnh, /* defect sector number (MSB) */ 140 dsnhm, /* defect sector number */ 141 dsnlm, /* defect sector number */ 142 dsnl; /* defect sector number (LSB) */ 143 } dlf_ps[1]; /* actually longer */ 144 }; 145 146 /* 147 * Structure of data passed via a MODE SELECT command. 148 */ 149 struct scsi_ms { 150 u_char ms_xxx0, /* reserved */ 151 ms_mt, /* medium type */ 152 ms_xxx1, /* reserved */ 153 ms_bdl; /* block descriptor length */ 154 struct scsi_ms_b_desc { 155 u_char dc, /* density code */ 156 nbh, /* number of blocks (MSB) */ 157 nbm, /* number of blocks */ 158 nbl, /* number of blocks (LSB) */ 159 xxx, /* reserved */ 160 blh, /* block length (MSB) */ 161 blm, /* block length */ 162 bll; /* block length (LSB) */ 163 } ms_bd[1]; /* actually longer */ 164 /* followed by vendor unique bytes */ 165 }; 166 167 /* values for the Medium Type field - disks */ 168 #define SCSI_CMD_MS_MT_DEFAULT 0x00 /* whatever is current */ 169 #define SCSI_CMD_MS_MT_SS 0x01 /* single sided, unspecified medium */ 170 #define SCSI_CMD_MS_MT_DS 0x02 /* double sided, unspecified medium */ 171 #define SCSI_CMD_MS_MT_8SSSD 0x05 /* 8" floppy, SSSD (X3.73-1980) */ 172 #define SCSI_CMD_MS_MT_8DSSD 0x06 /* 8" floppy, DSSD (X3B8-140) */ 173 #define SCSI_CMD_MS_MT_8SSDD 0x09 /* 8" floppy, SSDD (X3B8/78-139) */ 174 #define SCSI_CMD_MS_MT_8DSDD 0x0a /* 8" floppy, DSDD (X3.121-1984) */ 175 #define SCSI_CMD_MS_MT_5SSSD 0x0d /* 5.25" floppy, SSSD (X3.82-1980) */ 176 #define SCSI_CMD_MS_MT_5DSDD 0x12 /* 5.25" floppy, DSDD (X3.125-1984) */ 177 #define SCSI_CMD_MS_MT_5DSDD96 0x16 /* 5.25", DSDD, 96tpi (X3.126-198X) */ 178 #define SCSI_CMD_MS_MT_5DSQD 0x1a /* 5.25", DSQD, 96tpi (DIS 8630) */ 179 #define SCSI_CMD_MS_MT_3DS 0x1e /* 3.5", double sided (X3.137-198X) */ 180 181 /* values for the Medium Type field - tapes */ 182 #define SCSI_CMD_MS_MT_QIC_12T 0x40 /* 0.25", 12 tracks */ 183 #define SCSI_CMD_MS_MT_QIC_24T 0x44 /* 0.25", 24 tracks */ 184 185 /* 186 * Bits in cdb_lenl for a READ CAPACITY command, 187 * and structure returned as data. 188 * 189 * If PMI is off, the lba in the cdb must be 0. 190 */ 191 #define SCSI_CMD_RC_PMI 0x01 /* Partial Medium Indicator */ 192 193 struct scsi_rc { 194 u_char rc_lbah; /* logical block address (MSB) */ 195 u_char rc_lbahm; /* logical block address */ 196 u_char rc_lbalm; /* logical block address */ 197 u_char rc_lbal; /* logical block address (LSB) */ 198 u_char rc_blh; /* block length (MSB) */ 199 u_char rc_blhm; /* block length */ 200 u_char rc_bllm; /* block length */ 201 u_char rc_bll; /* block length (LSB) */ 202 }; 203