|
|
1.1 root 1: /*
2: ** Header file for the VDDC (Versabus Direct Disk Controller) Driver
3: */
4:
5: /*
6: ** DCB Command Codes
7: */
8:
9: #define RD 0x80 /* Read Data */
10: #define FTR 0xc0 /* Full Track Read */
11: #define RAS 0x90 /* Read and Scatter */
12: #define C 0xa0 /* Compare */
13: #define FTC 0xe0 /* Full Track Compare */
14: #define RHDE 0x180 /* Read Header, Data & ECC (not used) */
15: #define WD 0x00 /* Write Data */
16: #define FTW 0x40 /* Full Track Write */
17: #define WTC 0x20 /* Write Then Compare */
18: #define FTWTC 0x60 /* Full Track Write Then Compare */
19: #define GAW 0x10 /* Gather and Write */
20: #define WDE 0x100 /* Write Data & ECC (not used) */
21: #define FSECT 0x900 /* Format Sector */
22: #define GWC 0x30 /* Gather Write & Compare */
23: #define VDSTART 0x800 /* Start drives */
24: #define VDRELEASE 0xa00 /* Stop drives */
25: #define SEEK 0xb00 /* Seek */
26: #define INIT 0xc00 /* Initialize VDDC */
27: #define DIAG 0xd00 /* Diagnose (self-test) VDDC */
28: #define RSTCFG 0xe00 /* Reset/Configure VDDC/DDI/Drive(s) */
29: #define VDSTATUS 0xf00 /* VDDC Status */
30:
31: #define ABORT 0x80000000 /* ABORT active i/o */
32:
33: /*
34: ** Error / Status Symbolic Constants
35: */
36:
37: #define HCRCERR 0x1 /* Header CRC Error */
38: #define HCMPERR 0x2 /* Header Compare Error */
39: #define WPTERR 0x4 /* Write Protect Error/Status */
40: #define SZTIMEOUT 0x8 /* Seize timeout Error */
41: #define DSEEKERR 0x10 /* Disk Seek Error */
42: #define UCDATERR 0x20 /* Uncorrectable Data Error */
43: #define NOTCYLERR 0x40 /* Not on Cylinder Error */
44: #define DRVNRDY 0x80 /* Drive Not Ready Error/Status */
45: #define ALTACC 0x100 /* Alternate (track) accessed Status */
46: #define SEEKSTRT 0x200 /* Seek Started Status */
47: #define INVDADR 0x400 /* Invalid Disk Address Error */
48: #define DNEMEM 0x800 /* Non-Existant Memory Error */
49: #define PARERR 0x1000 /* Memory Parity Error */
50: #define DCOMPERR 0x2000 /* Data Compare Error */
51: #define DDIRDY 0x4000 /* DDI Ready Error/Status */
52: #define OPABRT 0x8000 /* Operator Abort (Host) Error/Status */
53: #define DSERLY 0x10000 /* Data Strobe Early */
54: #define DSLATE 0x20000 /* Data Strobe Late */
55: #define TOPLUS 0x40000 /* Track Offset Plus */
56: #define TOMNUS 0x80000 /* Track Offset Minus */
57: #define CPDCRT 0x100000 /* Cntlr Performed Data Correction */
58: #define HRDERR 0x200000 /* Hard Error */
59: #define SFTERR 0x400000 /* Soft Error (retry succesful) */
60: #define ANYERR 0x800000 /* Any Error */
61: #define INVCMD 0x1000000 /* Programmer error */
62:
63:
64: /*
65: ** DCB Status Symbolic Constants
66: */
67:
68: #define DCBABT 0x10000000 /* DCB Aborted */
69: #define DCBUSC 0x20000000 /* DCB Unsuccesfully Completed */
70: #define DCBCMP 0x40000000 /* DCB Complete */
71: #define DCBSTR 0x80000000 /* DCB Started */
72:
73: /*
74: ** MDCB Status Symbolic Constants
75: */
76:
77: #define CTLRBSY 0x10000000 /* Cntlr Busy */
78: #define INTCCDE 0x60000000 /* Interrupt Cause Code */
79: #define DCBINT 0x80000000 /* DCB Interrupt Flag */
80:
81:
82: /*
83: ** Hard Error Types
84: */
85:
86: #define HTYPES (HCRCERR|HCMPERR|WPTERR|SZTIMEOUT|DSEEKERR|UCDATERR|NOTCYLERR| \
87: DRVNRDY|INVDADR|DNEMEM|PARERR|DCOMPERR)
88:
89:
90: /*
91: ** Errors
92: */
93:
94: #define ERRS 0x3FFF
95: #define CANRETRY (SZTIMEOUT|DSEEKERR|NOTCYLERR|DCOMPERR|UCDATERR| \
96: PARERR|DNEMEM|HCRCERR|HCMPERR)
97: /*
98: ** VDDC Interrupt Modes
99: */
100:
101: #define NOINT 0x0 /* No Interrupt */
102: #define INTERR 0x2 /* Interrupt on Error */
103: #define INTSUC 0x1 /* Interrupt on Success */
104: #define INTDUN 0x3 /* Interrupt on Error or Success */
105:
106: #define CMD_MASK 0xFF0 /* Command code mask */
107: /* When a tabular approach can be used */
108: /* again change this back to 0x1F0 */
109:
110: struct size
111: {
112: daddr_t nblocks;
113: int block0;
114: };
115:
116:
117:
118: #define VDMF 0x8000 /* Manufacturer Fault 1=good sector */
119: #define VDUF 0x4000 /* User Fault 1=good sector */
120: #define VDALT 0x2000 /* Alternate Sector 1=alternate */
121: #define VDWPT 0x1000 /* Write Protect 1=Read Only Sector */
122:
123: /*
124: ** Addr of Memory-Mapped I/O port for VDDC Control Register
125: */
126:
127: /*
128: ** Address of Memory-Mapped I/O Port for VDDC H/W Reset
129: */
130:
131: #define VDDC_RESET(addr) *(addr + 4) = 0; /* reset controller */
132:
133: /*
134: ** Start i/o to/from controller.
135: */
136:
137: #define VDDC_ATTENTION(ctrl,mdcbadr) \
138: { movow(((int)mdcbadr & 0xffff0000)>>16,ctrl) ;\
139: movow( (int)mdcbadr & 0xffff, ctrl+2);\
140: }
141:
142: /*
143: ** Abort controller operation.
144: */
145:
146: #define VDDC_ABORT(ctrl) \
147: { \
148: movow((ABORT & 0xffff0000)>>16,ctrl) ;\
149: movow(ABORT & 0xffff, ctrl+2);\
150: }
151:
152: #define POLLTILLDONE(c, a, x) { vdtimeout = 1000*(x); \
153: uncache((char *)&a); \
154: while (!(a & (DCBCMP | DCBABT))) { \
155: DELAY(1000); \
156: vdtimeout--; \
157: uncache((char *)&a); \
158: if (vdtimeout <= 0) { \
159: printf("VDDC: Controller timeout"); \
160: VDDC_ABORT(c); \
161: DELAY(20000); \
162: uncache((char *)&a); \
163: break; \
164: } \
165: } \
166: }
167:
168:
169: /* Disk Address */
170:
171: typedef struct {
172: char track; /* all 8 bits */
173: char sector; /* low order 5 bits */
174: short cylinder; /* low order 12 bits */
175: } dskadr;
176:
177: /* DCB Trailer Formats */
178:
179: /* Read / Write Trailer */
180:
181: typedef struct {
182: char *memadr; /* memory address */
183: unsigned long wcount; /* 16 bit word count */
184: dskadr disk; /* disk address */
185: } trrw;
186:
187: /* Seek trailer format */
188:
189: typedef struct {
190: dskadr seekaddr;
191: } trseek;
192:
193: /* Format Trailer */
194:
195: typedef struct {
196: char *addr; /* data buffer to be filled on sector*/
197: long nsectors; /* # of sectors to be formatted */
198: dskadr disk; /* Disk physical address info */
199: dskadr hdr; /* Header address info */
200: } trfmt;
201:
202:
203: /* Reset / Configure Trailer */
204:
205: typedef struct {
206: long ncyl; /* # cylinders */
207: long nsurfaces; /* # surfaces */
208: long nsectors; /* # sectors */
209: } treset; /* # of sectors is defined by VDDC */
210: /* as 32/track of 512 data bytes each */
211:
212:
213: /* DCB Format */
214:
215: typedef struct fmtdcb{
216: struct fmtdcb *nxtdcb; /* next dcb in chain or End of Chain */
217: short intflg; /* interrupt settings and flags */
218: short opcode; /* DCB Command code etc... */
219: long operrsta; /* Error & Status info */
220: short fill; /* not used */
221: char devselect; /* Drive selection */
222: char trailcnt; /* Trailer Word Count */
223: long err_memadr; /* Error memory address */
224: short fill2; /* not used */
225: short err_wcount; /* Error word count */
226: char err_trk; /* Error track/sector */
227: char err_sec; /* Error track/sector */
228: short err_cyl; /* Error cylinder adr */
229: union {
230: trseek seektrail; /* seek command trailer */
231: trrw rwtrail; /* read/write trailer */
232: trfmt fmtrail; /* format trailer */
233: treset resetrail; /* reset/configure trailer */
234: } trail;
235: } fmt_dcb;
236:
237:
238: /* MDCB Format */
239:
240: typedef struct {
241: fmt_dcb *firstdcb; /* first dcb in chain */
242: fmt_dcb *procdcb; /* dcb being processed */
243: fmt_dcb *intdcb; /* dcb causing interrupt */
244: long vddcstat; /* VDDC status */
245: } fmt_mdcb;
246:
247:
248: /* the total # of drive types possible */
249: #define NVDDRV 4
250:
251: #define XSD 0
252: #define XFD 1
253: #define SMD 2
254: #define FSD 3
255:
256:
257: typedef struct {
258: long par_start;
259: long par_len;
260: } par_tab;
261:
262: typedef struct {
263: short secsiz; /* Number of bytes in a sector */
264: short nsec; /* Number of sectors per track */
265: short ntrak; /* Number of tracks per cylinder */
266: short ncyl; /* Number of cylinders */
267: char *type_name; /* Name of drive */
268: par_tab fs_a; /* partition a (root file system) */
269: par_tab fs_b; /* partition b (swap) */
270: par_tab fs_c; /* partition c (user data) */
271: par_tab fs_d; /* partition d (maintenance cyls) */
272: par_tab fs_e; /* partition e (all user data area) */
273: par_tab fs_f; /* partition f (whole disk) */
274: par_tab fs_g; /* partition g (non existant) */
275: par_tab fs_h; /* partition h (non existant) */
276: } fs_tab;
277:
278: /* Physical information for known disk drives. */
279: #ifdef VDGENDATA
280: long vddcaddr[] = { 0xf2000, 0xf2100, 0xf2200, 0xf2300 };
281: long vdtimeout = 0;
282:
283: fs_tab vdst[] = {
284: {512, 48, 24, 711, "xsd", /* 515 Mb FSD */
285: {0, 30528}, /* xsd0a cyl 0 - 52 */
286: {30528, 30528}, /* xsd3b cyl 53 - 105 */
287: {61056, 345600}, /*xfsd3c cyl 106 - 705 */
288: {406656, 2880}, /* xfsd3d cyl 706 - 710 */
289: {0, 406656}, /* xfsd3e cyl 0 - 705 */
290: {0, 409536}, /* xfsd3f cyl 0 - 710 */
291: {0, 0}, {0, 0} /* non existant partitions */
292: },
293: {512, 32, 24, 711, "xfd", /* 340 Mb FSD */
294: {0, 20352}, /* xfsd3a cyl 0 - 52 */
295: {20352, 20352}, /* xfsd3b cyl 53 - 105 */
296: {40704, 230400}, /* xfsd3c cyl 106 - 705 */
297: {271104, 1920}, /* xfsd3d cyl 706 - 710 */
298: {0, 271104}, /* xfsd3e cyl 0 - 705 */
299: {0, 273024}, /* xfsd3f cyl 0 - 710 */
300: {0, 0}, {0, 0} /* non existant partitions */
301: },
302: {512, 32, 19, 823, "smd", /* 300 Mb SMD */
303: {0, 20064}, /* smd3a cyl 0 - 65 */
304: {20064, 13680}, /* smd3b cyl 66 - 110 */
305: {33744, 214928}, /* smd3c cyl 111 - 817 */
306: {248672, 1520}, /* smd3d cyl 818 - 822 */
307: {0, 248672}, /* smd3e cyl 0 - 817 */
308: {0, 250192}, /* smd3f cyl 0 - 822 */
309: {0, 0}, {0, 0} /* non existant partitions */
310: },
311: {512, 32, 10, 823, "fsd", /* 160 Mb FSD */
312: {0, 9600}, /* fsd3a cyl 0 - 59 */
313: {0, 12000}, /* fsd3b cyl 60 - 134 */
314: {0, 108480}, /* fsd3c cyl 135 - 812 */
315: {0, 800}, /* fsd3d cyl 813 - 822 */
316: {0, 130080}, /* fsd3e cyl 0 - 812 */
317: {0, 131680}, /* fsd3f cyl 0 - 822 */
318: {0, 0}, {0, 0} /* non existant partitions */
319: }
320: };
321: #else
322: extern long vddcaddr[];
323: extern long vdtimeout = 0;
324:
325: extern fs_tab vdst[];
326: #endif
327:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.