Annotation of researchv10no/sys/mkconf/mbadev.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.