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 * 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 5.3 (Berkeley) 02/01/93 17 * 18 * from: $Header: disk.h,v 1.3 92/12/02 03:43:24 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 171 /* 172 * Structure of a Read/Write Error Recovery mode page. 173 * N.B.: CDC Wren V, at least, does not include write retry & time limit. 174 */ 175 struct scsi_page_rwerrrec { 176 u_char rw_psc, /* saveable flag + code (0x01) */ 177 rw_len, /* length (0x0a) */ 178 rw_flags, /* flags, see below */ 179 rw_read_retry, /* read retry count */ 180 rw_corr_span, /* correction span */ 181 rw_hd_off, /* head offset count */ 182 rw_ds_off, /* data strobe offset count */ 183 rw_xxx0, /* reserved */ 184 rw_write_retry, /* write retry count */ 185 rw_xxx1, /* reserved */ 186 rw_rtlh, /* recovery time limit (MSB) */ 187 rw_rtll; /* recovery time limit (LSB) */ 188 }; 189 /* rw_flags */ 190 #define SCSI_RWE_AWRE 0x80 /* reallocate defective blocks on write */ 191 #define SCSI_RWE_ARRE 0x40 /* reallocate defective blocks on read */ 192 #define SCSI_RWE_TB 0x20 /* transfer unrecoverable block */ 193 #define SCSI_RWE_RC 0x10 /* recovery may not cause delay: may lie */ 194 #define SCSI_RWE_EER 0x08 /* use most expedient recovery, not best */ 195 #define SCSI_RWE_PER 0x04 /* report recovered errors */ 196 #define SCSI_RWE_DTE 0x02 /* stop after recovered error */ 197 #define SCSI_RWE_DCR 0x01 /* use ECC for detection only */ 198 199 /* 200 * Structure of a Format Device mode page. 201 */ 202 struct scsi_page_fmt { 203 u_char fmt_psc, /* saveable flag + code (0x03) */ 204 fmt_len, /* length (0x16) */ 205 fmt_tpzh, /* tracks per zone (MSB) */ 206 fmt_tpzl, /* tracks per zone (LSB) */ 207 fmt_aspzh, /* alternate sectors per zone (MSB) */ 208 fmt_aspzl, /* alternate sectors per zone (LSB) */ 209 fmt_atpzh, /* alternate tracks per zone (MSB) */ 210 fmt_atpzl, /* alternate tracks per zone (LSB) */ 211 fmt_atpvh, /* alternate tracks per volume (MSB) */ 212 fmt_atpvl, /* alternate tracks per volume (LSB) */ 213 fmt_spth, /* sectors per track (MSB) */ 214 fmt_sptl, /* sectors per track (LSB) */ 215 fmt_dbppsh, /* data bytes per physical sector (MSB) */ 216 fmt_dbppsl, /* data bytes per physical sector (LSB) */ 217 fmt_ilh, /* interleave (MSB) */ 218 fmt_ill, /* interleave (LSB) */ 219 fmt_tsfh, /* track skew factor (MSB) */ 220 fmt_tsfl, /* track skew factor (LSB) */ 221 fmt_csfh, /* cylinder skew factor (MSB) */ 222 fmt_csfl, /* cylinder skew factor (LSB) */ 223 fmt_flags, /* flags, see below */ 224 fmt_xxx[3]; /* reserved */ 225 }; 226 /* fmt_flags. Note, HSEC|SSEC meaning varies all over the map! */ 227 #define SCSI_FMT_HSEC 0x80 /* hard sector */ 228 #define SCSI_FMT_SSEC 0x40 /* soft sector */ 229 #define SCSI_FMT_RMB 0x20 /* removable media */ 230 #define SCSI_FMT_SURF 0x10 /* format by surface (vs. by cylinder) */ 231 /* 0x0f reserved */ 232 233 /* 234 * Structure of a Rigid Disk Geometry mode page. 235 * N.B.: CDC Wren V, at least, does not include rpm. 236 */ 237 struct scsi_page_rdgeom { 238 u_char rd_psc, /* saveable flag + code (0x04) */ 239 rd_len, /* length (0x16) */ 240 rd_ncylh, /* number of cylinders (MSB) */ 241 rd_ncylm, /* number of cylinders */ 242 rd_ncyll, /* number of cylinders (LSB) */ 243 rd_nheads, /* number of heads */ 244 rd_wpcylh, /* start cyl for write precomp. (MSB) */ 245 rd_wpcylm, /* start cyl for write precomp. */ 246 rd_wpcyll, /* start cyl for write precomp. (LSB) */ 247 rd_rwcylh, /* start cyl for reduced write current (MSB) */ 248 rd_rwcylm, /* start cyl for reduced write current */ 249 rd_rwcyll, /* start cyl for reduced write current (LSB) */ 250 rd_steph, /* drive step rate (.1 us units) (MSB) */ 251 rd_stepl, /* drive step rate (LSB) */ 252 rd_lcylh, /* landing zone cylinder (MSB) */ 253 rd_lcylm, /* landing zone cylinder */ 254 rd_lcyll, /* landing zone cylinder (LSB) */ 255 rd_rpl, /* spindle synch control, see below */ 256 rd_roff, /* rotational offset (for rpl) */ 257 rd_xxx1, /* reserved */ 258 rd_rpmh, /* medium rotation rate (rpm) (MSB) */ 259 rd_rpml, /* medium rotation rate (rpm) (LSB) */ 260 rd_xxx2[2]; /* reserved */ 261 }; 262 /* values for rd_rpl. */ 263 #define SCSI_RD_RPL_MASK 0x03 /* mask for RPL field */ 264 #define SCSI_RD_RPL_NONE 0x00 /* sync disabled or not supported */ 265 #define SCSI_RD_RPL_SLAVE 0x01 /* disk is a Slave */ 266 #define SCSI_RD_RPL_MASTER 0x02 /* disk is a Master */ 267 #define SCSI_RD_RPL_MCONTROL 0x03 /* disk is a Master Control */ 268 269 /* 270 * Structure of a Verify Error Recovery mode page. 271 */ 272 struct scsi_page_verrrec { 273 u_char v_psc, /* saveable flag + code (0x07) */ 274 v_len, /* length (0x0a) */ 275 v_flags, /* flags, see below */ 276 v_verify_retry, /* verify retry count */ 277 v_corr_span, /* verify correction span */ 278 v_xxx[5], /* reserved */ 279 v_rtlh, /* verify recovery time limit (MSB) */ 280 v_rtll; /* verify recovery time limit (LSB) */ 281 }; 282 #define SCSI_V_EER 0x08 /* use most expedient recovery, not best */ 283 #define SCSI_V_PER 0x04 /* report recovered errors */ 284 #define SCSI_V_DTE 0x02 /* stop after recovered error */ 285 #define SCSI_V_DCR 0x01 /* use ECC for detection only */ 286 287 /* 288 * Structure of a Caching mode page. 289 */ 290 struct scsi_page_cache { 291 u_char cache_psc, /* saveable flag + code (0x08) */ 292 cache_len, /* length (0x0a) */ 293 cache_flags, /* flags, see below */ 294 cache_reten, /* cache retention priorities (rd + wr) */ 295 cache_dptlh, /* disable prefetch transfer length (MSB) */ 296 cache_dptll, /* disable prefetch transfer length (LSB) */ 297 cache_minpfh, /* minimum prefetch (MSB) */ 298 cache_minpfl, /* minimum prefetch (LSB) */ 299 cache_maxpfh, /* maximum prefetch (MSB) */ 300 cache_maxpfl, /* maximum prefetch (LSB) */ 301 cache_mpch, /* maximum prefetch ceiling (MSB) */ 302 cache_mpcl; /* maximum prefetch ceiling (LSB) */ 303 }; 304 #define SCSI_CACHE_WCE 0x04 /* write cache enable */ 305 #define SCSI_CACHE_MF 0x02 /* if set, prefetch depends on xfer length */ 306 #define SCSI_CACHE_RCD 0x01 /* read cache disable */ 307 308 #define SCSI_CACHE_RDPOLICY(x) ((x) >> 4) 309 #define SCSI_CACHE_WRPOLICY(x) ((x) & 0xf) 310 #define SCSI_CACHE_DEFAULT 0 /* use target default */ 311 #define SCSI_CACHE_KEEPPF 1 /* keep prefetch data over cmd data */ 312 #define SCSI_CACHE_KEEPCMD 15 /* keep cmd data over prefetch data */ 313 314 /* 315 * Structure of a Control Mode mode page. 316 */ 317 struct scsi_page_ctlmode { 318 u_char cm_psc, /* saveable flag + code (0x0a) */ 319 cm_len, /* length (0x06) */ 320 cm_rlec, /* report log-activity exception condition */ 321 cm_qctl, /* queue control (below) */ 322 cm_ecaaen, /* ECA and AEN flags (below) */ 323 cm_xxx, /* reserved */ 324 cm_aenholdh, /* AEN holdoff period (ms) (MSB) */ 325 cm_aenholdl; /* AEN holdoff period (ms) (LSB) */ 326 }; 327 #define SCSI_CM_RLEC 0x01 /* RLEC flag occupies only low bit */ 328 #define SCSI_CM_QMOD(x) ((x) >> 4) /* queue algorithm modifier */ 329 #define SCSI_CM_QERR 0x02 /* abort cmd queue after error */ 330 #define SCSI_CM_DQUE 0x01 /* disable tagged queueing */ 331 #define SCSI_CM_ECA 0x80 /* enable Extended Contingent Alliance */ 332 #define SCSI_CM_RAENP 0x04 /* target may do Async Err Notif after init */ 333 #define SCSI_CM_UAAENP 0x02 /* target may do AEN for Unit Attention */ 334 #define SCSI_CM_EAENP 0x01 /* target may do AEN for deferred errors */ 335 336 /* 337 * Bits in cdb_lenl for a READ CAPACITY command, 338 * and structure returned as data. 339 * 340 * If PMI is off, the lba in the cdb must be 0. 341 */ 342 #define SCSI_CMD_RC_PMI 0x01 /* Partial Medium Indicator */ 343 344 struct scsi_rc { 345 u_char rc_lbah; /* logical block address (MSB) */ 346 u_char rc_lbahm; /* logical block address */ 347 u_char rc_lbalm; /* logical block address */ 348 u_char rc_lbal; /* logical block address (LSB) */ 349 u_char rc_blh; /* block length (MSB) */ 350 u_char rc_blhm; /* block length */ 351 u_char rc_bllm; /* block length */ 352 u_char rc_bll; /* block length (LSB) */ 353 }; 354