|
|
1.1 root 1: /*
2: * MASSBUS device address routines
3: *
4: * interrupt vectors are all in the nexus code;
5: * they come for the adapter, not the device
6: */
7:
8: #include "mkconf.h"
9:
10: /*
11: * addressing stuff
12: */
13:
14: static char *mbafields[] = {
15: "mb", "drive", NULL
16: };
17:
18: #define a_adp addr[0] /* MBA number */
19: #define a_drive addr[1] /* drive within MBA */
20:
21: #define NMBD 8 /* max drives per massbus */
22: #define NMBA 10 /* enough */
23:
24: static Dev *mbdev[NMBD][NMBA];
25: static int mbamax;
26:
27: static newmbdev(), mbaputtab();
28:
29: mbasyntax(dp, ap, n)
30: register Dev *dp;
31: char **ap;
32: int n;
33: {
34: char *p;
35:
36: if ((p = keyread(dp->addr, ap, n, mbafields)) != NULL) {
37: fprint(STDERR, "%s %d: bad field %s\n", dp->mdev->name, dp->id, p);
38: errs++;
39: return (1);
40: }
41: if (dp->a_drive < 0 || dp->a_drive >= NMBD) {
42: fprint(STDERR, "%s %d: only %d drives per massbus\n", dp->mdev->name, dp->id, NMBD);
43: errs++;
44: return (1);
45: }
46: return (0);
47: }
48:
49: mbafixup(dp)
50: register Dev *dp;
51: {
52: register Dev *ep;
53:
54: for (ep = dlist; ep; ep = ep->next)
55: if (ep->mdev->adptype == dp->mdev->atype
56: && ep->id == dp->a_adp)
57: break;
58: if (ep == NULL) {
59: fprint(2, "%s %d: orphan massbus device\n", dp->mdev->name, dp->id);
60: errs++;
61: return;
62: }
63: dp->parent = ep;
64: newmbdev(dp);
65: }
66:
67: mbaputaddr(fd, dp)
68: int fd;
69: register Dev *dp;
70: {
71: register int count;
72: register Mdev *mp;
73:
74: mbaputtab(fd);
75: mp = dp->mdev;
76: count = 0;
77: fprint(fd, "struct mbaddr %saddr[] = {\n", mp->tag);
78: for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) {
79: while (count++ < dp->id)
80: fprint(fd, "\t{-1, -1},\n");
81: fprint(fd, "\t{%ld, %ld},\n", dp->a_drive, dp->a_adp);
82: }
83: count *= mp->rept;
84: fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count);
85: putstrs(fd, mp, count);
86:
87: }
88:
89: static
90: newmbdev(dp)
91: register Dev *dp;
92: {
93: register Dev *ep;
94:
95: ep = dp->parent;
96: if (ep->id > mbamax)
97: mbamax = ep->id;
98: if (ep->id >= NMBA) {
99: fprint(STDERR, "%s %d: too many mbas, max %d\n", ep->mdev->tag, ep->id, NMBA);
100: errs++;
101: return;
102: }
103: mbdev[dp->a_drive][ep->id] = dp;
104: }
105:
106: static
107: mbaputtab(fd)
108: int fd;
109: {
110: static int done;
111: register int i, j;
112: register Dev *dp;
113:
114: if (done++)
115: return;
116: for (i = 0; i <= mbamax; i++)
117: for (j = 0; j < NMBD; j++)
118: if ((dp = mbdev[j][i]) != NULL)
119: fprint(fd, "extern %s0int();\n", dp->mdev->tag);
120: fprint(fd, "char mbaid[][%d] = {\n", NMBD);
121: for (i = 0; i <= mbamax; i++) {
122: for (j = 0; j < NMBD; j++) {
123: if ((dp = mbdev[j][i]) == NULL)
124: fprint(fd, " 0%o,", (i<<3)|j); /* stray track */
125: else
126: fprint(fd, " %d,", dp->id);
127: }
128: fprint(fd, "\n");
129: }
130: fprint(fd, "};\nint mbastray();\nint (*mbavec[][%d])() = {\n", NMBD);
131: for (i = 0; i <= mbamax; i++) {
132: for (j = 0; j < NMBD; j++) {
133: if ((dp = mbdev[j][i]) == NULL)
134: fprint(fd, " mbastray,");
135: else
136: fprint(fd, " %s0int,", dp->mdev->tag);
137: }
138: fprint(fd, "\n");
139: }
140: fprint(fd, "};\n");
141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.