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