|
|
1.1 root 1: /*
2: * MSCP device address routines
3: */
4:
5: #include "mkconf.h"
6:
7: /*
8: * addressing stuff
9: */
10:
11: #define a_adp addr[0] /* controller number */
12: #define a_unit addr[1] /* unit number */
13: #define a_type addr[2] /* controller type */
14:
15: mscpsyntax(dp, ap, n)
16: register Dev *dp;
17: register char **ap;
18: register int n;
19: {
20: register int i;
21: register Mdev *mp;
22:
23: dp->a_type = dp->a_unit = -1;
24: while (--n > 0) {
25: if (strcmp(*ap, "unit") == 0) {
26: if (--n < 0) {
27: fprint(STDERR, "%s %d: no unit number\n",
28: dp->mdev->name, dp->id);
29: errs++;
30: return (1);
31: }
32: dp->a_unit = nconv(*++ap);
33: ap++;
34: continue;
35: }
36: if ((mp = mdlook(*ap)) == NULL
37: || mp->adptype != AMSCP) {
38: fprint(STDERR, "%s %d: bad word %s\n",
39: dp->mdev->name, dp->id, *ap);
40: errs++;
41: return (1);
42: }
43: if (--n < 0) {
44: fprint(STDERR, "%s %d: no ctl number\n",
45: dp->mdev->name, dp->id);
46: errs++;
47: return (1);
48: }
49: for (i = 0; i <= nmscp; i++)
50: if (mscpsw[i].dev == mp)
51: break;
52: if (i > nmscp) {
53: fprint(STDERR, "%s %d %s: mscp gok\n",
54: dp->mdev->name, dp->id, mp->name);
55: errs++;
56: return (1);
57: }
58: dp->a_type = i;
59: dp->a_adp = nconv(*++ap);
60: ++ap;
61: }
62: if (dp->a_type < 0 || dp->a_unit < 0) {
63: fprint(STDERR, "%s %d: missing ctl or unit\n",
64: dp->mdev->name, dp->id);
65: errs++;
66: return (1);
67: }
68: return (0);
69: }
70:
71: mscpfixup(dp)
72: register Dev *dp;
73: {
74: register Dev *ep;
75:
76: for (ep = dlist; ep; ep = ep->next)
77: if (ep->mdev->adptype == dp->mdev->atype
78: && ep->id == dp->a_adp)
79: break;
80: if (ep == NULL) {
81: fprint(STDERR, "%s %d: orphan mscp device\n", dp->mdev->name, dp->id);
82: errs++;
83: return;
84: }
85: dp->parent = ep;
86: }
87:
88: mscpputaddr(fd, dp)
89: int fd;
90: register Dev *dp;
91: {
92: register int count;
93: register Mdev *mp;
94: static int didtab = 0;
95:
96: if (didtab == 0) {
97: mscptab(fd);
98: didtab++;
99: }
100: mp = dp->mdev;
101: count = 0;
102: fprint(fd, "struct msaddr %saddr[] = {\n", mp->tag);
103: for (mp = dp->mdev; dp && dp->mdev == mp; dp = dp->next) {
104: while (count++ < dp->id)
105: fprint(fd, "\t{-1},\n");
106: fprint(fd, "\t{%ld, %ld, %ld},\n", dp->a_adp, dp->a_type, dp->a_unit);
107: }
108: count *= mp->rept;
109: fprint(fd, "};\nint %scnt = %d;\n", mp->tag, count);
110: putstrs(fd, mp, count);
111: }
112:
113: /*
114: * write the mscp port table
115: * do it here so it only exists if there are mscp devices
116: *
117: * assume <sys/mscp.h> was included in cfdata.h or something
118: */
119:
120: mscptab(fd)
121: int fd;
122: {
123: register int i;
124: register int max;
125:
126: max = 0;
127: for (i = 0; i <= nmscp; i++)
128: if (mscpsw[i].used) {
129: fprint(fd, "extern struct msportsw %sport;\n", mscpsw[i].dev->tag);
130: max = i;
131: }
132: fprint(fd, "int nmsport = %d;\nstruct msportsw *msportsw[] = {\n", max+1);
133: for (i = 0; i <= max; i++)
134: if (mscpsw[i].used)
135: fprint(fd, "\t&%sport,\t/* %d */\n",
136: mscpsw[i].dev->tag, i);
137: else
138: fprint(fd, "\tNULL,\n");
139: fprint(fd, "};\n");
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.