|
|
1.1 ! root 1: /* ! 2: ** Header file for the VDDC (Versabus Direct Disk Controller) Driver ! 3: */ ! 4: ! 5: #define NSECPTRK 32 /* #sectors/track - fixed by VDDC */ ! 6: #define SECTSIZ 512 /* sector size fixed by VDDC */ ! 7: #define L2SIZ 9 /* log2 of sector size */ ! 8: #define L2BSIZ 10 /* log2 of block size */ ! 9: #define NVDDRV 3 /* number of drive types supported */ ! 10: ! 11: /* ! 12: ** DCB Command Codes ! 13: */ ! 14: ! 15: #define RD 0x80 /* Read Data */ ! 16: #define FTR 0xc0 /* Full Track Read */ ! 17: #define RAS 0x90 /* Read and Scatter */ ! 18: #define C 0xa0 /* Compare */ ! 19: #define FTC 0xe0 /* Full Track Compare */ ! 20: #define RHDE 0x180 /* Read Header, Data & ECC (not used) */ ! 21: #define WD 0x00 /* Write Data */ ! 22: #define FTW 0x40 /* Full Track Write */ ! 23: #define WTC 0x20 /* Write Then Compare */ ! 24: #define FTWTC 0x60 /* Full Track Write Then Compare */ ! 25: #define GAW 0x10 /* Gather and Write */ ! 26: #define WDE 0x100 /* Write Data & ECC (not used) */ ! 27: #define FSECT 0x900 /* Format Sector */ ! 28: #define GWC 0x30 /* Gather Write & Compare */ ! 29: #define VDSTART 0x800 /* Start drives */ ! 30: #define VDRELEASE 0xa00 /* Stop drives */ ! 31: #define SEEK 0xb00 /* Seek */ ! 32: #define INIT 0xc00 /* Initialize VDDC */ ! 33: #define DIAG 0xd00 /* Diagnose (self-test) VDDC */ ! 34: #define RSTCFG 0xe00 /* Reset/Configure VDDC/DDI/Drive(s) */ ! 35: #define VDSTATUS 0xf00 /* VDDC Status */ ! 36: #define ABORT 0x80000000 /* To be written to VDDC Cntrl Register */ ! 37: ! 38: /* ! 39: ** Error / Status Symbolic Constants ! 40: */ ! 41: ! 42: #define HCRCERR 0x1 /* Header CRC Error */ ! 43: #define HCMPERR 0x2 /* Header Compare Error */ ! 44: #define WPTERR 0x4 /* Write Protect Error/Status */ ! 45: #define SZTIMEOUT 0x8 /* Seize timeout Error */ ! 46: #define DSEEKERR 0x10 /* Disk Seek Error */ ! 47: #define UCDATERR 0x20 /* Uncorrectable Data Error */ ! 48: #define NOTCYLERR 0x40 /* Not on Cylinder Error */ ! 49: #define DRVNRDY 0x80 /* Drive Not Ready Error/Status */ ! 50: #define ALTACC 0x100 /* Alternate (track) accessed Status */ ! 51: #define SEEKSTRT 0x200 /* Seek Started Status */ ! 52: #define INVDADR 0x400 /* Invalid Disk Address Error */ ! 53: #define DNEMEM 0x800 /* Non-Existant Memory Error */ ! 54: #define PARERR 0x1000 /* Memory Parity Error */ ! 55: #define DCOMPERR 0x2000 /* Data Compare Error */ ! 56: #define DDIRDY 0x4000 /* DDI Ready Error/Status */ ! 57: #define OPABRT 0x8000 /* Operator Abort (Host) Error/Status */ ! 58: #define DSERLY 0x10000 /* Data Strobe Early */ ! 59: #define DSLATE 0x20000 /* Data Strobe Late */ ! 60: #define TOPLUS 0x40000 /* Track Offset Plus */ ! 61: #define TOMNUS 0x80000 /* Track Offset Minus */ ! 62: #define CPDCRT 0x100000 /* Cntlr Performed Data Correction */ ! 63: #define HRDERR 0x200000 /* Hard Error */ ! 64: #define SFTERR 0x400000 /* Soft Error (retry succesful) */ ! 65: #define ANYERR 0x800000 /* Any Error */ ! 66: ! 67: /* ! 68: ** DCB Status Symbolic Constants ! 69: */ ! 70: ! 71: #define DCBABT 0x10000000 /* DCB Aborted */ ! 72: #define DCBUSC 0x20000000 /* DCB Unsuccesfully Completed */ ! 73: #define DCBCMP 0x40000000 /* DCB Complete */ ! 74: #define DCBSTR 0x80000000 /* DCB Started */ ! 75: ! 76: /* ! 77: ** MDCB Status Symbolic Constants ! 78: */ ! 79: ! 80: #define CTLRBSY 0x10000000 /* Cntlr Busy */ ! 81: #define INTCCDE 0x60000000 /* Interrupt Cause Code */ ! 82: #define DCBINT 0x80000000 /* DCB Interrupt Flag */ ! 83: ! 84: ! 85: /* ! 86: ** Hard Error Types ! 87: */ ! 88: ! 89: #define HTYPES (HCRCERR|HCMPERR|WPTERR|SZTIMEOUT|DSEEKERR|UCDATERR|NOTCYLERR| \ ! 90: DRVNRDY|INVDADR|DNEMEM|PARERR|DCOMPERR) ! 91: ! 92: ! 93: /* ! 94: ** Errors ! 95: */ ! 96: ! 97: #define ERRS 0x3FFF ! 98: #define CANRETRY (SZTIMEOUT|DSEEKERR|NOTCYLERR|DCOMPERR|UCDATERR| \ ! 99: PARERR|DNEMEM|HCRCERR|HCMPERR) ! 100: /* ! 101: ** VDDC Interrupt Modes ! 102: */ ! 103: ! 104: #define NOINT 0x0 /* No Interrupt */ ! 105: #define INTERR 0x2 /* Interrupt on Error */ ! 106: #define INTSUC 0x1 /* Interrupt on Success */ ! 107: #define INTDUN 0x3 /* Interrupt on Error or Success */ ! 108: ! 109: #define CMD_MASK 0xFF0 /* Command code mask */ ! 110: /* When a tabular approach can be used */ ! 111: /* again change this back to 0x1F0 */ ! 112: ! 113: struct size ! 114: { ! 115: daddr_t nblocks; ! 116: int block0; ! 117: }; ! 118: ! 119: ! 120: ! 121: #define VDMF 0x8000 /* Manufacturer Fault 1=good sector */ ! 122: #define VDUF 0x4000 /* User Fault 1=good sector */ ! 123: #define VDALT 0x2000 /* Alternate Sector 1=alternate */ ! 124: #define VDWPT 0x1000 /* Write Protect 1=Read Only Sector */ ! 125: ! 126: /* ! 127: ** Addr of Memory-Mapped I/O port for VDDC Control Register ! 128: */ ! 129: ! 130: /* ! 131: ** Address of Memory-Mapped I/O Port for VDDC H/W Reset ! 132: */ ! 133: ! 134: #define VDDC_RESET(addr) *(addr + 4) = 0; /* reset controller */ ! 135: ! 136: /* ! 137: ** Start i/o to/from controller. ! 138: */ ! 139: ! 140: #define VDDC_ATTENTION(ctrl,mdcbadr) \ ! 141: { movow(((int)mdcbadr & 0xffff0000)>>16,ctrl) ;\ ! 142: movow( (int)mdcbadr & 0xffff, ctrl+2);\ ! 143: } ! 144: ! 145: /* ! 146: ** Abort controller operation. ! 147: */ ! 148: ! 149: #define VDDC_ABORT(ctrl) \ ! 150: { \ ! 151: movow((ABORT & 0xffff0000)>>16,ctrl) ;\ ! 152: movow(ABORT & 0xffff, ctrl+2);\ ! 153: } ! 154: ! 155: #define POLLTILLDONE(c, a, x) { vdtimeout = 1000*(x); \ ! 156: uncache((char *)&a); \ ! 157: while (!(a & (DCBCMP | DCBABT))) { \ ! 158: DELAY(1000); \ ! 159: vdtimeout--; \ ! 160: uncache((char *)&a); \ ! 161: if (vdtimeout <= 0) { \ ! 162: printf("VDDC controller timeout"); \ ! 163: VDDC_ABORT(c); \ ! 164: break; \ ! 165: } \ ! 166: } \ ! 167: } ! 168: ! 169: static long vddcaddr[4] = { 0xf2000, 0xf2100, 0xf2200, 0xf2300 }; ! 170: ! 171: /* Disk Address */ ! 172: ! 173: typedef struct { ! 174: char track; /* all 8 bits */ ! 175: char sector; /* low order 5 bits */ ! 176: short cylinder; /* low order 12 bits */ ! 177: } dskadr; ! 178: ! 179: /* DCB Trailer Formats */ ! 180: ! 181: /* Read / Write Trailer */ ! 182: ! 183: typedef struct { ! 184: char *memadr; /* memory address */ ! 185: long wcount; /* 16 bit word count */ ! 186: dskadr disk; /* disk address */ ! 187: } trrw; ! 188: ! 189: /* Seek trailer format */ ! 190: ! 191: typedef struct { ! 192: dskadr seekaddr; ! 193: } trseek; ! 194: ! 195: /* Format Trailer */ ! 196: ! 197: typedef struct { ! 198: char *addr; /* data buffer to be filled on sector*/ ! 199: long nsectors; /* # of sectors to be formatted */ ! 200: dskadr disk; /* Disk physical address info */ ! 201: dskadr hdr; /* Header address info */ ! 202: } trfmt; ! 203: ! 204: ! 205: /* Reset / Configure Trailer */ ! 206: ! 207: typedef struct { ! 208: long ncyl; /* # cylinders */ ! 209: long nsurfaces; /* # surfaces */ ! 210: } treset; /* # of sectors is defined by VDDC */ ! 211: /* to be 32/track of 512 data bytes each */ ! 212: ! 213: ! 214: /* DCB Format */ ! 215: ! 216: typedef struct fmtdcb{ ! 217: struct fmtdcb *nxtdcb; /* next dcb in chain or End of Chain */ ! 218: short intflg; /* interrupt settings and flags */ ! 219: short opcode; /* DCB Command code etc... */ ! 220: long operrsta; /* Error & Status info */ ! 221: short fill; /* not used */ ! 222: char devselect; /* Drive selection */ ! 223: char trailcnt; /* Trailer Word Count */ ! 224: long err_memadr; /* Error memory address */ ! 225: short fill2; /* not used */ ! 226: short err_wcount; /* Error word count */ ! 227: char err_trk; /* Error track/sector */ ! 228: char err_sec; /* Error track/sector */ ! 229: short err_cyl; /* Error cylinder adr */ ! 230: union { ! 231: trseek seektrail; /* seek command trailer */ ! 232: trrw rwtrail; /* read/write trailer */ ! 233: trfmt fmtrail; /* format trailer */ ! 234: treset resetrail; /* reset/configure trailer */ ! 235: } trail; ! 236: } fmt_dcb; ! 237: ! 238: ! 239: /* MDCB Format */ ! 240: ! 241: typedef struct { ! 242: fmt_dcb *firstdcb; /* first dcb in chain */ ! 243: fmt_dcb *procdcb; /* dcb being processed */ ! 244: fmt_dcb *intdcb; /* dcb causing interrupt */ ! 245: long vddcstat; /* VDDC status */ ! 246: } fmt_mdcb; ! 247: ! 248: static long vdtimeout = 0; ! 249:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.