154876Storek /* 2*63144Sbostic * Copyright (c) 1992, 1993 3*63144Sbostic * The Regents of the University of California. 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*63144Sbostic * @(#)disk.h 8.1 (Berkeley) 06/10/93 1754876Storek * 1859533Storek * from: $Header: disk.h,v 1.4 93/04/30 00:04:10 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 * 2657749Storek * Commands defined in common headers (scsi.h or disktape.h) appear here 2757749Storek * as comments. 2854876Storek */ 2954876Storek 3054876Storek /* group 0 */ 3154876Storek /* CMD_TEST_UNIT_READY 0x00 test unit ready */ 3254876Storek #define CMD_REZERO 0x01 /* rezero unit */ 3357749Storek /* 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 */ 4057749Storek /* CMD_MODE_SELECT 0x15 mode select */ 4154876Storek #define CMD_RESERVE 0x16 /* reserve */ 4254876Storek #define CMD_RELEASE 0x17 /* release */ 4354876Storek /* CMD_COPY 0x18 copy */ 4457749Storek /* 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 /* 15357749Storek * For MODE SENSE and MODE SELECT: Mode page codes for disks. 15454876Storek */ 15557749Storek /* 0x00 vendor specific */ 15657749Storek #define SCSI_MS_PC_RWERRREC 0x01 /* r/w error recovery parameters */ 15757749Storek /* SCSI_MS_PC_DR 0x02 disconnect/reconnect control */ 15857749Storek #define SCSI_MS_PC_FMT 0x03 /* format parameters */ 15957749Storek #define SCSI_MS_PC_RDGEOM 0x04 /* Rigid Disk geometry */ 16057749Storek #define SCSI_MS_PC_FD 0x05 /* flexible disk page */ 16157749Storek /* 0x06 reserved */ 16257749Storek #define SCSI_MS_PC_VERRREC 0x07 /* verify error recovery page */ 16357749Storek #define SCSI_MS_PC_CACHE 0x08 /* cache page */ 16457749Storek /* SCSI_MS_PC_PDEV 0x09 peripheral device page */ 16557749Storek /* SCSI_MS_PC_CTLMODE 0x0a control mode page */ 16657749Storek #define SCSI_MS_PC_MTSUPP 0x0b /* medium types supported */ 16757749Storek #define SCSI_MS_PC_NOTCH 0x0c /* notch page */ 16857749Storek /* 0x0d..0x1f reserved */ 16957749Storek /* 0x20..0x3e vendor specific */ 17059533Storek #define SCSI_MS_PC_CDCCACHECTL 0x38 /* CDC (Wren) cache control page */ 17157749Storek 17257749Storek /* 17357749Storek * Structure of a Read/Write Error Recovery mode page. 17457749Storek * N.B.: CDC Wren V, at least, does not include write retry & time limit. 17557749Storek */ 17657749Storek struct scsi_page_rwerrrec { 17759533Storek u_char rw_flags, /* flags, see below */ 17857749Storek rw_read_retry, /* read retry count */ 17957749Storek rw_corr_span, /* correction span */ 18057749Storek rw_hd_off, /* head offset count */ 18157749Storek rw_ds_off, /* data strobe offset count */ 18257749Storek rw_xxx0, /* reserved */ 18357749Storek rw_write_retry, /* write retry count */ 18457749Storek rw_xxx1, /* reserved */ 18557749Storek rw_rtlh, /* recovery time limit (MSB) */ 18657749Storek rw_rtll; /* recovery time limit (LSB) */ 18754876Storek }; 18857749Storek /* rw_flags */ 18957749Storek #define SCSI_RWE_AWRE 0x80 /* reallocate defective blocks on write */ 19057749Storek #define SCSI_RWE_ARRE 0x40 /* reallocate defective blocks on read */ 19157749Storek #define SCSI_RWE_TB 0x20 /* transfer unrecoverable block */ 19257749Storek #define SCSI_RWE_RC 0x10 /* recovery may not cause delay: may lie */ 19357749Storek #define SCSI_RWE_EER 0x08 /* use most expedient recovery, not best */ 19457749Storek #define SCSI_RWE_PER 0x04 /* report recovered errors */ 19557749Storek #define SCSI_RWE_DTE 0x02 /* stop after recovered error */ 19657749Storek #define SCSI_RWE_DCR 0x01 /* use ECC for detection only */ 19754876Storek 19857749Storek /* 19957749Storek * Structure of a Format Device mode page. 20057749Storek */ 20157749Storek struct scsi_page_fmt { 20259533Storek u_char fmt_tpzh, /* tracks per zone (MSB) */ 20357749Storek fmt_tpzl, /* tracks per zone (LSB) */ 20457749Storek fmt_aspzh, /* alternate sectors per zone (MSB) */ 20557749Storek fmt_aspzl, /* alternate sectors per zone (LSB) */ 20657749Storek fmt_atpzh, /* alternate tracks per zone (MSB) */ 20757749Storek fmt_atpzl, /* alternate tracks per zone (LSB) */ 20857749Storek fmt_atpvh, /* alternate tracks per volume (MSB) */ 20957749Storek fmt_atpvl, /* alternate tracks per volume (LSB) */ 21057749Storek fmt_spth, /* sectors per track (MSB) */ 21157749Storek fmt_sptl, /* sectors per track (LSB) */ 21257749Storek fmt_dbppsh, /* data bytes per physical sector (MSB) */ 21357749Storek fmt_dbppsl, /* data bytes per physical sector (LSB) */ 21457749Storek fmt_ilh, /* interleave (MSB) */ 21557749Storek fmt_ill, /* interleave (LSB) */ 21657749Storek fmt_tsfh, /* track skew factor (MSB) */ 21757749Storek fmt_tsfl, /* track skew factor (LSB) */ 21857749Storek fmt_csfh, /* cylinder skew factor (MSB) */ 21957749Storek fmt_csfl, /* cylinder skew factor (LSB) */ 22057749Storek fmt_flags, /* flags, see below */ 22157749Storek fmt_xxx[3]; /* reserved */ 22257749Storek }; 22357749Storek /* fmt_flags. Note, HSEC|SSEC meaning varies all over the map! */ 22457749Storek #define SCSI_FMT_HSEC 0x80 /* hard sector */ 22557749Storek #define SCSI_FMT_SSEC 0x40 /* soft sector */ 22657749Storek #define SCSI_FMT_RMB 0x20 /* removable media */ 22757749Storek #define SCSI_FMT_SURF 0x10 /* format by surface (vs. by cylinder) */ 22857749Storek /* 0x0f reserved */ 22954876Storek 23057749Storek /* 23157749Storek * Structure of a Rigid Disk Geometry mode page. 23257749Storek * N.B.: CDC Wren V, at least, does not include rpm. 23357749Storek */ 23457749Storek struct scsi_page_rdgeom { 23559533Storek u_char rd_ncylh, /* number of cylinders (MSB) */ 23657749Storek rd_ncylm, /* number of cylinders */ 23757749Storek rd_ncyll, /* number of cylinders (LSB) */ 23857749Storek rd_nheads, /* number of heads */ 23957749Storek rd_wpcylh, /* start cyl for write precomp. (MSB) */ 24057749Storek rd_wpcylm, /* start cyl for write precomp. */ 24157749Storek rd_wpcyll, /* start cyl for write precomp. (LSB) */ 24257749Storek rd_rwcylh, /* start cyl for reduced write current (MSB) */ 24357749Storek rd_rwcylm, /* start cyl for reduced write current */ 24457749Storek rd_rwcyll, /* start cyl for reduced write current (LSB) */ 24557749Storek rd_steph, /* drive step rate (.1 us units) (MSB) */ 24657749Storek rd_stepl, /* drive step rate (LSB) */ 24757749Storek rd_lcylh, /* landing zone cylinder (MSB) */ 24857749Storek rd_lcylm, /* landing zone cylinder */ 24957749Storek rd_lcyll, /* landing zone cylinder (LSB) */ 25057749Storek rd_rpl, /* spindle synch control, see below */ 25157749Storek rd_roff, /* rotational offset (for rpl) */ 25257749Storek rd_xxx1, /* reserved */ 25357749Storek rd_rpmh, /* medium rotation rate (rpm) (MSB) */ 25457749Storek rd_rpml, /* medium rotation rate (rpm) (LSB) */ 25557749Storek rd_xxx2[2]; /* reserved */ 25657749Storek }; 25757749Storek /* values for rd_rpl. */ 25857749Storek #define SCSI_RD_RPL_MASK 0x03 /* mask for RPL field */ 25957749Storek #define SCSI_RD_RPL_NONE 0x00 /* sync disabled or not supported */ 26057749Storek #define SCSI_RD_RPL_SLAVE 0x01 /* disk is a Slave */ 26157749Storek #define SCSI_RD_RPL_MASTER 0x02 /* disk is a Master */ 26257749Storek #define SCSI_RD_RPL_MCONTROL 0x03 /* disk is a Master Control */ 26354876Storek 26454876Storek /* 26557749Storek * Structure of a Verify Error Recovery mode page. 26657749Storek */ 26757749Storek struct scsi_page_verrrec { 26859533Storek u_char v_flags, /* flags, see below */ 26957749Storek v_verify_retry, /* verify retry count */ 27057749Storek v_corr_span, /* verify correction span */ 27157749Storek v_xxx[5], /* reserved */ 27257749Storek v_rtlh, /* verify recovery time limit (MSB) */ 27357749Storek v_rtll; /* verify recovery time limit (LSB) */ 27457749Storek }; 27557749Storek #define SCSI_V_EER 0x08 /* use most expedient recovery, not best */ 27657749Storek #define SCSI_V_PER 0x04 /* report recovered errors */ 27757749Storek #define SCSI_V_DTE 0x02 /* stop after recovered error */ 27857749Storek #define SCSI_V_DCR 0x01 /* use ECC for detection only */ 27957749Storek 28057749Storek /* 28157749Storek * Structure of a Caching mode page. 28257749Storek */ 28357749Storek struct scsi_page_cache { 28459533Storek u_char cache_flags, /* flags, see below */ 28557749Storek cache_reten, /* cache retention priorities (rd + wr) */ 28657749Storek cache_dptlh, /* disable prefetch transfer length (MSB) */ 28757749Storek cache_dptll, /* disable prefetch transfer length (LSB) */ 28857749Storek cache_minpfh, /* minimum prefetch (MSB) */ 28957749Storek cache_minpfl, /* minimum prefetch (LSB) */ 29057749Storek cache_maxpfh, /* maximum prefetch (MSB) */ 29157749Storek cache_maxpfl, /* maximum prefetch (LSB) */ 29257749Storek cache_mpch, /* maximum prefetch ceiling (MSB) */ 29357749Storek cache_mpcl; /* maximum prefetch ceiling (LSB) */ 29457749Storek }; 29557749Storek #define SCSI_CACHE_WCE 0x04 /* write cache enable */ 29657749Storek #define SCSI_CACHE_MF 0x02 /* if set, prefetch depends on xfer length */ 29757749Storek #define SCSI_CACHE_RCD 0x01 /* read cache disable */ 29857749Storek 29957749Storek #define SCSI_CACHE_RDPOLICY(x) ((x) >> 4) 30057749Storek #define SCSI_CACHE_WRPOLICY(x) ((x) & 0xf) 30157749Storek #define SCSI_CACHE_DEFAULT 0 /* use target default */ 30257749Storek #define SCSI_CACHE_KEEPPF 1 /* keep prefetch data over cmd data */ 30357749Storek #define SCSI_CACHE_KEEPCMD 15 /* keep cmd data over prefetch data */ 30457749Storek 30557749Storek /* 30657749Storek * Structure of a Control Mode mode page. 30757749Storek */ 30857749Storek struct scsi_page_ctlmode { 30959533Storek u_char cm_rlec, /* report log-activity exception condition */ 31057749Storek cm_qctl, /* queue control (below) */ 31157749Storek cm_ecaaen, /* ECA and AEN flags (below) */ 31257749Storek cm_xxx, /* reserved */ 31357749Storek cm_aenholdh, /* AEN holdoff period (ms) (MSB) */ 31457749Storek cm_aenholdl; /* AEN holdoff period (ms) (LSB) */ 31557749Storek }; 31657749Storek #define SCSI_CM_RLEC 0x01 /* RLEC flag occupies only low bit */ 31757749Storek #define SCSI_CM_QMOD(x) ((x) >> 4) /* queue algorithm modifier */ 31857749Storek #define SCSI_CM_QERR 0x02 /* abort cmd queue after error */ 31957749Storek #define SCSI_CM_DQUE 0x01 /* disable tagged queueing */ 32057749Storek #define SCSI_CM_ECA 0x80 /* enable Extended Contingent Alliance */ 32157749Storek #define SCSI_CM_RAENP 0x04 /* target may do Async Err Notif after init */ 32257749Storek #define SCSI_CM_UAAENP 0x02 /* target may do AEN for Unit Attention */ 32357749Storek #define SCSI_CM_EAENP 0x01 /* target may do AEN for deferred errors */ 32457749Storek 32557749Storek /* 32659533Storek * Structure of a CDC-specific Cache Control mode page. 32759533Storek */ 32859533Storek struct scsi_page_CDCcachectlmode { 32959533Storek u_char ccm_flags, /* flags (below) */ 33059533Storek ccm_pfthresh, /* prefetch threshold */ 33159533Storek ccm_maxthresh, /* maximum threshold (?) */ 33259533Storek ccm_maxpfmult, /* maximum prefetch multiplier */ 33359533Storek ccm_minthresh, /* minimum thresold (?) */ 33459533Storek ccm_minpfmult, /* minimum prefetch multiplier */ 33559533Storek ccm_xxx[8]; /* reserved */ 33659533Storek }; 33759533Storek #define SCSI_CDC_CCM_WIE 0x40 /* write index enable */ 33859533Storek #define SCSI_CDC_CCM_CE 0x10 /* cache enable */ 33959533Storek #define SCSI_CDC_CCM_TBLSZ(x) ((x) & 0xf) /* table size */ 34059533Storek 34159533Storek /* 34254876Storek * Bits in cdb_lenl for a READ CAPACITY command, 34354876Storek * and structure returned as data. 34454876Storek * 34554876Storek * If PMI is off, the lba in the cdb must be 0. 34654876Storek */ 34754876Storek #define SCSI_CMD_RC_PMI 0x01 /* Partial Medium Indicator */ 34854876Storek 34954876Storek struct scsi_rc { 35054876Storek u_char rc_lbah; /* logical block address (MSB) */ 35154876Storek u_char rc_lbahm; /* logical block address */ 35254876Storek u_char rc_lbalm; /* logical block address */ 35354876Storek u_char rc_lbal; /* logical block address (LSB) */ 35454876Storek u_char rc_blh; /* block length (MSB) */ 35554876Storek u_char rc_blhm; /* block length */ 35654876Storek u_char rc_bllm; /* block length */ 35754876Storek u_char rc_bll; /* block length (LSB) */ 35854876Storek }; 359