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