1 /* 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1982, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * from: Utah $Hdr: rdreg.h 1.2 90/10/12$ 39 * 40 * from: @(#)rdreg.h 7.3 (Berkeley) 2/25/91 41 * $Id: rdreg.h,v 1.2 1993/05/22 07:56:47 cgd Exp $ 42 */ 43 44 struct rd_iocmd { 45 char c_pad; 46 char c_unit; 47 char c_volume; 48 char c_saddr; 49 short c_hiaddr; 50 long c_addr; 51 char c_nop2; 52 char c_slen; 53 long c_len; 54 char c_cmd; 55 char c_pad2; 56 }; 57 58 struct rd_rscmd { 59 char c_unit; 60 char c_sram; 61 char c_ram; 62 char c_cmd; 63 }; 64 65 struct rd_stat { 66 char c_vu; 67 char c_pend; 68 short c_ref; 69 short c_fef; 70 short c_aef; 71 short c_ief; 72 union { 73 char cu_raw[10]; 74 struct { 75 short cu_msw; 76 long cu_lsl; 77 } cu_sva; 78 struct { 79 long cu_cyhd; 80 short cu_sect; 81 } cu_tva; 82 } c_pf; 83 }; 84 #define c_raw c_pf.cu_raw 85 #define c_blk c_pf.cu_sva.cu_lsl /* for now */ 86 #define c_tva c_pf.cu_tva 87 88 struct rd_ssmcmd { 89 char c_unit; 90 char c_cmd; 91 short c_refm; 92 short c_fefm; 93 short c_aefm; 94 short c_iefm; 95 }; 96 97 struct rd_srcmd { 98 char c_unit; 99 char c_nop; 100 char c_cmd; 101 char c_param; 102 }; 103 104 struct rd_clearcmd { 105 char c_unit; 106 char c_cmd; 107 }; 108 109 struct rd_describe { 110 u_int d_iuw:16, /* controller: installed unit word */ 111 d_cmaxxfr:16, /* controller: max transfer rate (Kb) */ 112 d_ctype:8, /* controller: controller type */ 113 d_utype:8, /* unit: unit type */ 114 d_name:24, /* unit: name (6 BCD digits) */ 115 d_sectsize:16, /* unit: # of bytes per block (sector) */ 116 d_blkbuf:8, /* unit: # of blocks which can be buffered */ 117 d_burstsize:8, /* unit: recommended burst size */ 118 d_blocktime:16, /* unit: block time (u-sec) */ 119 d_uavexfr:16, /* unit: average transfer rate (Kb) */ 120 d_retry:16, /* unit: optimal retry time (1/100-sec) */ 121 d_access:16, /* unit: access time param (1/100-sec) */ 122 d_maxint:8, /* unit: maximum interleave */ 123 d_fvbyte:8, /* unit: fixed volume byte */ 124 d_rvbyte:8, /* unit: removeable volume byte */ 125 d_maxcyl:24, /* volume: maximum cylinder */ 126 d_maxhead:8, /* volume: maximum head */ 127 d_maxsect:16, /* volume: maximum sector on track */ 128 d_maxvsecth:16, /* volume: maximum sector on volume (MSW) */ 129 d_maxvsectl:32, /* volume: maximum sector on volume (LSWs) */ 130 d_interleave:8; /* volume: current interleave */ 131 }; 132 133 /* indicies into rdinfo -- order is arbitrary */ 134 #define RD7945A 0 135 #define RD9134D 1 136 #define RD9122S 2 137 #define RD7912P 3 138 #define RD7914P 4 139 #define RD7958A 5 140 #define RD7957A 6 141 #define RD7933H 7 142 #define RD9134L 8 143 #define RD7936H 9 144 #define RD7937H 10 145 #define RD7914CT 11 146 #define RD7946A 12 147 #define RD9122D 13 148 #define RD7957B 14 149 #define RD7958B 15 150 #define RD7959B 16 151 152 /* HW ids */ 153 #define RD7946AID 0x220 /* also 7945A */ 154 #define RD9134DID 0x221 /* also 9122S */ 155 #define RD9134LID 0x222 /* also 9122D */ 156 #define RD7912PID 0x209 157 #define RD7914CTID 0x20A 158 #define RD7914PID 0x20B 159 #define RD7958AID 0x22B 160 #define RD7957AID 0x22A 161 #define RD7933HID 0x212 162 #define RD7936HID 0x213 /* just guessing -- as of yet unknown */ 163 #define RD7937HID 0x214 164 #define RD7957BID 0x22C /* another guess based on 7958B */ 165 #define RD7958BID 0x22D 166 #define RD7959BID 0x22E /* another guess based on 7958B */ 167 #define RD2200AID 0x22F 168 #define RD2203AID 0x230 /* yet another guess */ 169 170 #define NRD7945ABPT (32 >> (DEV_BSHIFT-8)) 171 #define NRD7945ATRK 7 172 #define NRD9134DBPT (32 >> (DEV_BSHIFT-8)) 173 #define NRD9134DTRK 6 174 #define NRD9122SBPT (16 >> (DEV_BSHIFT-8)) 175 #define NRD9122STRK 2 176 #define NRD7912PBPT (64 >> (DEV_BSHIFT-8)) 177 #define NRD7912PTRK 7 178 #define NRD7914PBPT (64 >> (DEV_BSHIFT-8)) 179 #define NRD7914PTRK 7 180 #define NRD7933HBPT (92 >> (DEV_BSHIFT-8)) 181 #define NRD7933HTRK 13 182 #define NRD9134LBPT (32 >> (DEV_BSHIFT-8)) 183 #define NRD9134LTRK 5 184 185 /* 186 * Several HP drives have an odd number of 256 byte sectors per track. 187 * This makes it rather difficult to break them into 512 and 1024 byte blocks. 188 * So...we just do like HPUX and don't bother to respect hardware track/head 189 * boundries -- we just mold the disk so that we use the entire capacity. 190 * HPUX also sometimes doen't abide by cylinder boundries, we attempt to 191 * whenever possible. 192 * 193 * DISK REAL (256 BPS) HPUX (1024 BPS) BSD (512 BPS) 194 * SPT x HD x CYL SPT x HD x CYL SPT x HD x CYL 195 * ----- --------------- --------------- -------------- 196 * 7936: 123 x 7 x 1396 25 x 7 x 1716 123 x 7 x 698 197 * 7937: 123 x 13 x 1396 25 x 16 x 1395 123 x 13 x 698 198 * 199 * 7957A: 63 x 5 x 1013 11 x 7 x 1036 22 x 7 x 1036 200 * 7958A: 63 x 8 x 1013 21 x 6 x 1013 36 x 7 x 1013 201 * 202 * 7957B: 63 x 4 x 1269 9 x 7 x 1269 18 x 7 x 1269 203 * 7958B: 63 x 6 x 1572 21 x 9 x 786 42 x 9 x 786 204 * 7959B: 63 x 12 x 1572 21 x 9 x 1572 42 x 9 x 1572 205 * 206 * 2200A: 113 x 8 x 1449 113 x 2 x 1449 113 x 4 x 1449 207 * 2203A: 113 x 16 x 1449 113 x 4 x 1449 113 x 8 x 1449 208 */ 209 #if DEV_BSIZE == 512 210 # define NRD7936HBPT 123 211 # define NRD7936HTRK 7 212 # define NRD7937HBPT 123 213 # define NRD7937HTRK 13 214 # define NRD7957ABPT 22 215 # define NRD7957ATRK 7 216 # define NRD7958ABPT 36 217 # define NRD7958ATRK 7 218 # define NRD7957BBPT 18 219 # define NRD7957BTRK 7 220 # define NRD7958BBPT 42 221 # define NRD7958BTRK 9 222 # define NRD7959BBPT 42 223 # define NRD7959BTRK 9 224 # define NRD2200ABPT 113 225 # define NRD2200ATRK 4 226 # define NRD2203ABPT 113 227 # define NRD2203ATRK 8 228 #endif 229 #if DEV_BSIZE == 1024 230 # define NRD7957ABPT 11 231 # define NRD7957ATRK 7 232 # define NRD7958ABPT 21 233 # define NRD7958ATRK 6 234 # define NRD7957BBPT 9 235 # define NRD7957BTRK 7 236 # define NRD7958BBPT 21 237 # define NRD7958BTRK 9 238 # define NRD7959BBPT 21 239 # define NRD7959BTRK 9 240 # define NRD2200ABPT 113 241 # define NRD2200ATRK 2 242 # define NRD2203ABPT 113 243 # define NRD2203ATRK 4 244 #endif 245 246 /* controller "unit" number */ 247 #define RDCTLR 15 248 249 /* convert 512 byte count into DEV_BSIZE count */ 250 #define RDSZ(x) ((x) >> (DEV_BSHIFT-9)) 251 252 /* convert block number into sector number and back */ 253 #define RDBTOS(x) ((x) << (DEV_BSHIFT-8)) 254 #define RDSTOB(x) ((x) >> (DEV_BSHIFT-8)) 255 256 /* extract cyl/head/sect info from three-vector address */ 257 #define RDCYL(tva) ((u_long)(tva).cu_cyhd >> 8) 258 #define RDHEAD(tva) ((tva).cu_cyhd & 0xFF) 259 #define RDSECT(tva) ((tva).cu_sect) 260 261 #define REF_MASK 0x0 262 #define FEF_MASK 0x0 263 #define AEF_MASK 0x0 264 #define IEF_MASK 0xF970 265 266 #define FEF_CU 0x4000 /* cross-unit */ 267 #define FEF_DR 0x0080 /* diagnostic result */ 268 #define FEF_IMR 0x0008 /* internal maintenance release */ 269 #define FEF_PF 0x0002 /* power fail */ 270 #define FEF_REXMT 0x0001 /* retransmit */ 271 #define AEF_UD 0x0040 /* unrecoverable data */ 272 #define IEF_RRMASK 0xe000 /* request release bits */ 273 #define IEF_MD 0x0020 /* marginal data */ 274 #define IEF_RD 0x0010 /* recoverable data */ 275 276 #define C_READ 0x00 277 #define C_RAM 0x00 /* single vector (i.e. sector number) */ 278 #define C_WRITE 0x02 279 #define C_CLEAR 0x08 280 #define C_STATUS 0x0d 281 #define C_SADDR 0x10 282 #define C_SLEN 0x18 283 #define C_SUNIT(x) (0x20 | (x)) 284 #define C_SVOL(x) (0x40 | (x)) 285 #define C_NOP 0x34 286 #define C_DESC 0x35 287 #define C_SREL 0x3b 288 #define C_SSM 0x3e 289 #define C_SRAM 0x48 290 #define C_REL 0x140 291 292 #define C_CMD 0x05 293 #define C_EXEC 0x0e 294 #define C_QSTAT 0x10 295 #define C_TCMD 0x12 296