|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Computer Consoles Inc. ! 7: * ! 8: * Redistribution and use in source and binary forms, with or without ! 9: * modification, are permitted provided that the following conditions ! 10: * are met: ! 11: * 1. Redistributions of source code must retain the above copyright ! 12: * notice, this list of conditions and the following disclaimer. ! 13: * 2. Redistributions in binary form must reproduce the above copyright ! 14: * notice, this list of conditions and the following disclaimer in the ! 15: * documentation and/or other materials provided with the distribution. ! 16: * 3. All advertising materials mentioning features or use of this software ! 17: * must display the following acknowledgement: ! 18: * This product includes software developed by the University of ! 19: * California, Berkeley and its contributors. ! 20: * 4. Neither the name of the University nor the names of its contributors ! 21: * may be used to endorse or promote products derived from this software ! 22: * without specific prior written permission. ! 23: * ! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 34: * SUCH DAMAGE. ! 35: * ! 36: * @(#)vdreg.h 7.7 (Berkeley) 6/28/90 ! 37: */ ! 38: ! 39: /* ! 40: * Versabus VDDC/SMDE disk controller definitions. ! 41: */ ! 42: #define VDDC_SECSIZE 512 /* sector size for VDDC */ ! 43: #define VD_MAXSECSIZE 1024 /* max sector size for SMD/E */ ! 44: ! 45: /* ! 46: * Controller communications block. ! 47: */ ! 48: struct vddevice { ! 49: u_long vdcdr; /* controller device register */ ! 50: u_long vdreset; /* controller reset register */ ! 51: u_long vdcsr; /* control-status register */ ! 52: long vdrstclr; /* reset clear register */ ! 53: u_short vdstatus[16]; /* per-drive status register */ ! 54: u_short vdicf_status; /* status change interupt control format */ ! 55: u_short vdicf_done; /* interrupt complete control format */ ! 56: u_short vdicf_error; /* interrupt error control format */ ! 57: u_short vdicf_success; /* interrupt success control format */ ! 58: u_short vdtcf_mdcb; /* mdcb transfer control format */ ! 59: u_short vdtcf_dcb; /* dcb transfer control format */ ! 60: u_short vdtcf_trail; /* trail transfer control format */ ! 61: u_short vdtcf_data; /* data transfer control format */ ! 62: u_long vdccf; /* controller configuration flags */ ! 63: u_long vdsecsize; /* sector size */ ! 64: u_short vdfill0; ! 65: u_char vdcylskew; /* cylinder to cylinder skew factor */ ! 66: u_char vdtrackskew; /* track to track skew factor */ ! 67: u_long vdfill1; ! 68: u_long vddfr; /* diagnostic flag register */ ! 69: u_long vddda; /* diagnostic dump address */ ! 70: }; ! 71: ! 72: /* controller types */ ! 73: #define VDTYPE_VDDC 1 /* old vddc controller (smd only) */ ! 74: #define VDTYPE_SMDE 2 /* new smde controller (smd-e) */ ! 75: ! 76: /* ! 77: * Controller status definitions. ! 78: */ ! 79: #define CS_SCS 0xf /* status change source (drive number) */ ! 80: #define CS_ELC 0x10 /* error on last command */ ! 81: #define CS_ICC 0x60 /* interupt cause code */ ! 82: #define ICC_NOI 0x00 /* no interupt */ ! 83: #define ICC_DUN 0x20 /* no interupt */ ! 84: #define ICC_ERR 0x40 /* no interupt */ ! 85: #define ICC_SUC 0x60 /* no interupt */ ! 86: #define CS_GO 0x80 /* go bit (controller busy) */ ! 87: #define CS_BE 0x100 /* buss error */ ! 88: #define CS_BOK 0x4000 /* board ok */ ! 89: #define CS_SFL 0x8000 /* system fail */ ! 90: #define CS_LEC 0xff000000 /* last error code */ ! 91: ! 92: /* ! 93: * Drive status definitions. ! 94: */ ! 95: #define STA_UR 0x1 /* unit ready */ ! 96: #define STA_OC 0x2 /* on cylinder */ ! 97: #define STA_SE 0x4 /* seek error */ ! 98: #define STA_DF 0x8 /* drive fault */ ! 99: #define STA_WP 0x10 /* write protected */ ! 100: #define STA_US 0x20 /* unit selected */ ! 101: #define STA_TYPE 0x300 /* drive type: */ ! 102: #define STA_SMD 0x000 /* SMD */ ! 103: #define STA_ESDI 0x100 /* ESDI */ ! 104: ! 105: /* ! 106: * Interupt Control Field definitions. ! 107: */ ! 108: #define ICF_IPL 0x7 /* interupt priority level */ ! 109: #define ICF_IEN 0x8 /* interupt enable */ ! 110: #define ICF_IV 0xff00 /* interupt vector */ ! 111: ! 112: /* ! 113: * Transfer Control Format definitions. ! 114: */ ! 115: #define TCF_AM 0xff /* Address Modifier */ ! 116: #define AM_SNPDA 0x01 /* Standard Non-Privileged Data Access */ ! 117: #define AM_SASA 0x81 /* Standard Ascending Sequential Access */ ! 118: #define AM_ENPDA 0xf1 /* Extended Non-Privileged Data Access */ ! 119: #define AM_EASA 0xe1 /* Extended Ascending Sequential Access */ ! 120: #define TCF_BTE 0x800 /* Block Transfer Enable */ ! 121: ! 122: /* ! 123: * Controller Configuration Flags. ! 124: */ ! 125: #define CCF_STS 0x1 /* sectors per track selectable */ ! 126: #define CCF_EAV 0x2 /* enable auto vector */ ! 127: #define CCF_ERR 0x4 /* enable reset register */ ! 128: #define CCF_RFE 0x8 /* recovery flag enable */ ! 129: #define CCF_XMD 0x60 /* xmd transfer mode (bus size) */ ! 130: #define XMD_8BIT 0x20 /* do only 8 bit transfers */ ! 131: #define XMD_16BIT 0x40 /* do only 16 bit transfers */ ! 132: #define XMD_32BIT 0x60 /* do only 32 bit transfers */ ! 133: #define CCF_DIU 0x80 /* disable initial update of DCB @cmd start */ ! 134: #define CCF_BSZ 0x300 /* burst size */ ! 135: #define BSZ_16WRD 0x000 /* 16 word transfer burst */ ! 136: #define BSZ_12WRD 0x100 /* 12 word transfer burst */ ! 137: #define BSZ_8WRD 0x200 /* 8 word transfer burst */ ! 138: #define BSZ_4WRD 0x300 /* 4 word transfer burst */ ! 139: #define CCF_SEN 0x400 /* cylinder/track skew enable (for format) */ ! 140: #define CCF_ENP 0x1000 /* enable parity */ ! 141: #define CCF_EPE 0x2000 /* enable parity errors */ ! 142: #define CCF_EDE 0x10000 /* error detection enable */ ! 143: #define CCF_ECE 0x20000 /* error correction enable */ ! 144: ! 145: /* ! 146: * Diagnostic register definitions. ! 147: */ ! 148: #define DIA_DC 0x7f /* dump count mask */ ! 149: #define DIA_DWR 0x80 /* dump write/read flag */ ! 150: #define DIA_ARE 0x100 /* auto rebuild enable */ ! 151: #define DIA_CEN 0x200 /* call enable flag */ ! 152: #define DIA_KEY 0xAA550000 /* reset enable key */ ! 153: ! 154: /* ! 155: * Hardware interface flags, in dcb.devselect and d_devflags ! 156: */ ! 157: #define VD_ESDI 0x10 /* drive is on ESDI interface */ ! 158: #define d_devflags d_drivedata[0] /* in disk label */ ! 159: ! 160: /* ! 161: * Error recovery flags. ! 162: */ ! 163: #define VDRF_RTZ 0x0001 /* return to zero */ ! 164: #define VDRF_OCF 0x0002 /* on cylinder false */ ! 165: #define VDRF_OSP 0x0004 /* offset plus */ ! 166: #define VDRF_OSM 0x0008 /* offset minus */ ! 167: #define VDRF_DSE 0x0080 /* data strobe early */ ! 168: #define VDRF_DSL 0x0100 /* data strobe late */ ! 169: ! 170: #define VDRF_NONE 0 ! 171: #define VDRF_NORMAL (VDRF_RTZ|VDRF_OCF|VDRF_OSP|VDRF_OSM|VDRF_DSE|VDRF_DSL) ! 172: ! 173: /* ! 174: * Perform a reset on the controller. ! 175: */ ! 176: #define VDRESET(a,t) { \ ! 177: if ((t) == VDTYPE_SMDE) { \ ! 178: ((struct vddevice *)(a))->vddfr = DIA_KEY|DIA_CEN; \ ! 179: ((struct vddevice *)(a))->vdcdr = (u_long)0xffffffff; \ ! 180: DELAY(5000000); \ ! 181: } else { \ ! 182: ((struct vddevice *)(a))->vdreset = 0; \ ! 183: DELAY(1500000); \ ! 184: } \ ! 185: } ! 186: ! 187: /* ! 188: * Abort a controller operation. ! 189: */ ! 190: #define VDABORT(a,t) { \ ! 191: if ((t) == VDTYPE_VDDC) { \ ! 192: movow((a), (VDOP_ABORT&0xffff0000)>>16) ; \ ! 193: movow((int)(a)+2, VDOP_ABORT&0xffff); \ ! 194: } else \ ! 195: ((struct vddevice *)(a))->vdcdr = (u_long)VDOP_ABORT; \ ! 196: DELAY(1000000); \ ! 197: } ! 198: ! 199: /* ! 200: * Start a command. ! 201: */ ! 202: #define VDGO(a,mdcb,t) {\ ! 203: if ((t) == VDTYPE_VDDC) { \ ! 204: movow((a), ((int)(mdcb)&0xffff0000)>>16) ; \ ! 205: movow((int)((a))+2, (int)(mdcb)&0xffff); \ ! 206: } else \ ! 207: ((struct vddevice *)(a))->vdcdr = (mdcb); \ ! 208: } ! 209: ! 210: /* ! 211: * MDCB layout. ! 212: */ ! 213: struct mdcb { ! 214: struct dcb *mdcb_head; /* first dcb in list */ ! 215: struct dcb *mdcb_busy; /* dcb being processed */ ! 216: struct dcb *mdcb_intr; /* dcb causing interrupt */ ! 217: long mdcb_status; /* status of dcb in mdcb_busy */ ! 218: }; ! 219: ! 220: /* ! 221: * DCB definitions. ! 222: */ ! 223: ! 224: /* ! 225: * A disk address. ! 226: */ ! 227: typedef struct { ! 228: u_char track; /* all 8 bits */ ! 229: u_char sector; /* all 8 bits */ ! 230: u_short cylinder; /* low order 12 bits */ ! 231: } dskadr; ! 232: ! 233: /* ! 234: * DCB trailer formats. ! 235: */ ! 236: /* read/write trailer */ ! 237: struct trrw { ! 238: u_long memadr; /* memory address */ ! 239: u_long wcount; /* 16 bit word count */ ! 240: dskadr disk; /* disk address */ ! 241: }; ! 242: ! 243: /* scatter/gather trailer */ ! 244: #define VDMAXPAGES (MAXPHYS / NBPG) ! 245: struct trsg { ! 246: struct trrw start_addr; ! 247: struct addr_chain { ! 248: u_long nxt_addr; ! 249: u_long nxt_len; ! 250: } addr_chain[VDMAXPAGES + 1]; ! 251: }; ! 252: ! 253: /* seek trailer format */ ! 254: struct trseek { ! 255: dskadr skaddr; ! 256: }; ! 257: ! 258: /* format trailer */ ! 259: struct trfmt { ! 260: char *addr; /* data buffer to be filled on sector*/ ! 261: long nsectors; /* # of sectors to be formatted */ ! 262: dskadr disk; /* disk physical address info */ ! 263: dskadr hdr; /* header address info */ ! 264: }; ! 265: ! 266: /* reset/configure trailer */ ! 267: struct treset { ! 268: long ncyl; /* # cylinders */ ! 269: long nsurfaces; /* # surfaces */ ! 270: long nsectors; /* # sectors */ ! 271: long slip_sec; /* # of slip sectors */ ! 272: long recovery; /* recovery flags */ ! 273: }; ! 274: ! 275: /* ident trailer */ ! 276: struct trid { ! 277: long name; ! 278: long rev; ! 279: long date; ! 280: }; ! 281: ! 282: /* ! 283: * DCB layout. ! 284: */ ! 285: struct dcb { ! 286: struct dcb *nxtdcb; /* next dcb */ ! 287: short intflg; /* interrupt settings and flags */ ! 288: short opcode; /* DCB command code etc... */ ! 289: long operrsta; /* error & status info */ ! 290: short fill; /* not used */ ! 291: char devselect; /* drive selection */ ! 292: char trailcnt; /* trailer Word Count */ ! 293: long err_memadr; /* error memory address */ ! 294: u_char err_code; /* error codes for SMD/E */ ! 295: char fill2; /* not used */ ! 296: short err_wcount; /* error word count */ ! 297: char err_trk; /* error track/sector */ ! 298: char err_sec; /* error track/sector */ ! 299: short err_cyl; /* error cylinder adr */ ! 300: union { ! 301: struct trid idtrail; /* ident command trailer */ ! 302: struct trseek sktrail; /* seek command trailer */ ! 303: struct trsg sgtrail; /* scatter/gather trailer */ ! 304: struct trrw rwtrail; /* read/write trailer */ ! 305: struct trfmt fmtrail; /* format trailer */ ! 306: struct treset rstrail; /* reset/configure trailer */ ! 307: } trail; ! 308: }; ! 309: ! 310: /* ! 311: * smaller DCB with seek trailer only (no scatter-gather). ! 312: */ ! 313: struct skdcb { ! 314: struct dcb *nxtdcb; /* next dcb */ ! 315: short intflg; /* interrupt settings and flags */ ! 316: short opcode; /* DCB command code etc... */ ! 317: long operrsta; /* error & status info */ ! 318: short fill; /* not used */ ! 319: char devselect; /* drive selection */ ! 320: char trailcnt; /* trailer Word Count */ ! 321: long err_memadr; /* error memory address */ ! 322: u_char err_code; /* error codes for SMD/E */ ! 323: char fill2; /* not used */ ! 324: short err_wcount; /* error word count */ ! 325: char err_trk; /* error track/sector */ ! 326: char err_sec; /* error track/sector */ ! 327: short err_cyl; /* error cylinder adr */ ! 328: union { ! 329: struct trseek sktrail; /* seek command trailer */ ! 330: } trail; ! 331: }; ! 332: ! 333: /* ! 334: * DCB command codes. ! 335: */ ! 336: #define VDOP_RD 0x80 /* read data */ ! 337: #define VDOP_FTR 0xc0 /* full track read */ ! 338: #define VDOP_RAS 0x90 /* read and scatter */ ! 339: #define VDOP_RDRAW 0x600 /* read unformatted disk sector */ ! 340: #define VDOP_CMP 0xa0 /* compare */ ! 341: #define VDOP_FTC 0xe0 /* full track compare */ ! 342: #define VDOP_RHDE 0x180 /* read header, data & ecc */ ! 343: #define VDOP_WD 0x00 /* write data */ ! 344: #define VDOP_FTW 0x40 /* full track write */ ! 345: #define VDOP_WTC 0x20 /* write then compare */ ! 346: #define VDOP_FTWTC 0x60 /* full track write then compare */ ! 347: #define VDOP_GAW 0x10 /* gather and write */ ! 348: #define VDOP_WDE 0x100 /* write data & ecc */ ! 349: #define VDOP_FSECT 0x900 /* format sector */ ! 350: #define VDOP_GWC 0x30 /* gather write & compare */ ! 351: #define VDOP_START 0x800 /* start drives */ ! 352: #define VDOP_RELEASE 0xa00 /* stop drives */ ! 353: #define VDOP_SEEK 0xb00 /* seek */ ! 354: #define VDOP_INIT 0xc00 /* initialize controller */ ! 355: #define VDOP_DIAG 0xd00 /* diagnose (self-test) controller */ ! 356: #define VDOP_CONFIG 0xe00 /* reset & configure drive */ ! 357: #define VDOP_STATUS 0xf00 /* get drive status */ ! 358: #define VDOP_IDENT 0x700 /* identify controller */ ! 359: #define VDOP_PROBE 0x500 /* probe drives and update status */ ! 360: ! 361: #define VDOP_ABORT 0x80000000 /* abort current command */ ! 362: ! 363: /* ! 364: * DCB status definitions. ! 365: */ ! 366: #define DCBS_HCRC 0x00000001 /* header crc error */ ! 367: #define DCBS_HCE 0x00000002 /* header compare error */ ! 368: #define DCBS_WPT 0x00000004 /* drive write protected */ ! 369: #define DCBS_CHE 0x00000008 /* controller hardware error */ ! 370: #define DCBS_SKI 0x00000010 /* seek incomplete */ ! 371: #define DCBS_UDE 0x00000020 /* uncorrectable data error */ ! 372: #define DCBS_OCYL 0x00000040 /* off cylinder */ ! 373: #define DCBS_NRDY 0x00000080 /* drive not ready */ ! 374: #define DCBS_ATA 0x00000100 /* alternate track accessed */ ! 375: #define DCBS_SKS 0x00000200 /* seek started */ ! 376: #define DCBS_IVA 0x00000400 /* invalid disk address error */ ! 377: #define DCBS_NEM 0x00000800 /* non-existant memory error */ ! 378: #define DCBS_DPE 0x00001000 /* memory data parity error */ ! 379: #define DCBS_DCE 0x00002000 /* data compare error */ ! 380: #define DCBS_DDI 0x00004000 /* ddi ready */ ! 381: #define DCBS_OAB 0x00008000 /* operation aborted */ ! 382: #define DCBS_DSE 0x00010000 /* data strobe early */ ! 383: #define DCBS_DSL 0x00020000 /* data strobe late */ ! 384: #define DCBS_TOP 0x00040000 /* track offset plus */ ! 385: #define DCBS_TOM 0x00080000 /* track offset minus */ ! 386: #define DCBS_CCD 0x00100000 /* controller corrected data */ ! 387: #define DCBS_HARD 0x00200000 /* hard error */ ! 388: #define DCBS_SOFT 0x00400000 /* soft error (retry succesful) */ ! 389: #define DCBS_ERR 0x00800000 /* composite error */ ! 390: #define DCBS_IVC 0x01000000 /* invalid command error */ ! 391: /* bits 24-27 unused */ ! 392: #define DCBS_BSY 0x10000000 /* controller busy */ ! 393: #define DCBS_ICC 0x60000000 /* interrupt cause code */ ! 394: #define DCBS_INT 0x80000000 /* interrupt generated for this dcb */ ! 395: ! 396: #define VDERRBITS "\20\1HCRC\2HCE\3WPT\4CHE\5DSKI\6UDE\7OCYL\10NRDY\ ! 397: \11ATA\12SKS\13IVA\14NEM\15DPE\16DCE\17DDI\20OAB\21DSE\22DSL\23TOP\24TOM\ ! 398: \25CCD\26HARD\27SOFT\30ERR\31IVC\35ABORTED\36FAIL\37COMPLETE\40STARTED" ! 399: ! 400: /* drive related errors */ ! 401: #define VDERR_DRIVE (DCBS_SKI|DCBS_OCYL|DCBS_NRDY|DCBS_IVA) ! 402: /* controller related errors */ ! 403: #define VDERR_CTLR (DCBS_CHE|DCBS_OAB|DCBS_IVC|DCBS_NEM) ! 404: /* potentially recoverable errors */ ! 405: #define VDERR_RETRY \ ! 406: (VDERR_DRIVE|VDERR_CTLR|DCBS_DCE|DCBS_DPE|DCBS_HCRC|DCBS_HCE) ! 407: /* uncorrected data errors */ ! 408: #define VDERR_HARD (VDERR_RETRY|DCBS_WPT|DCBS_UDE) ! 409: ! 410: /* ! 411: * DCB status codes. ! 412: */ ! 413: #define DCBS_ABORT 0x10000000 /* dcb aborted */ ! 414: #define DCBS_FAIL 0x20000000 /* dcb unsuccesfully completed */ ! 415: #define DCBS_DONE 0x40000000 /* dcb complete */ ! 416: #define DCBS_START 0x80000000 /* dcb started */ ! 417: ! 418: /* ! 419: * DCB interrupt control. ! 420: */ ! 421: #define DCBINT_NONE 0x0 /* don't interrupt */ ! 422: #define DCBINT_ERR 0x2 /* interrupt on error */ ! 423: #define DCBINT_SUC 0x1 /* interrupt on success */ ! 424: #define DCBINT_DONE (DCBINT_ERR|DCBINT_SUC) ! 425: #define DCBINT_PBA 0x4 /* proceed before acknowledge */ ! 426: ! 427: /* ! 428: * Sector formats. ! 429: */ ! 430: typedef union { ! 431: struct { ! 432: dskadr hdr_addr; ! 433: short smd_crc; ! 434: } smd; ! 435: struct { ! 436: dskadr physical; ! 437: dskadr logical; ! 438: long smd_e_crc; ! 439: } smd_e; ! 440: } fmt_hdr; ! 441: ! 442: /* Sector Header bit assignments */ ! 443: #define VDMF 0x8000 /* Manufacturer Fault 1=good sector */ ! 444: #define VDUF 0x4000 /* User Fault 1=good sector */ ! 445: #define VDALT 0x2000 /* Alternate Sector 1=alternate */ ! 446: #define VDWPT 0x1000 /* Write Protect 1=Read Only Sector */ ! 447: ! 448: /* input register assignments for DIOCWFORMAT ioctl */ ! 449: #define dk_op df_reg[0] /* opcode */ ! 450: #define dk_althdr df_reg[1] /* alt. sect. dskadr, in an int! */ ! 451: #define dk_fmtflags df_reg[2] /* header format flags */ ! 452: ! 453: /* output register assignments for DIOCWFORMAT ioctl */ ! 454: #define dk_operrsta df_reg[0] /* dcb operrsta */ ! 455: #define dk_ecodecnt df_reg[1] /* smd-e ecode and error word count */ ! 456: #define dk_ecode(ecodecnt) ((u_long)(ecodecnt) >> 2) ! 457: #define dk_errcnt(ecodecnt) (((ecodecnt) & 0xffff) << 1) ! 458: #define dk_erraddr df_reg[2] /* error dskadr, in an int! */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.