|
|
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.