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