Annotation of 43BSDReno/sys/hp300/autoconf.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 University of Utah.
                      3:  * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
                      4:  * All rights reserved.
                      5:  *
                      6:  * This code is derived from software contributed to Berkeley by
                      7:  * the Systems Programming Group of the University of Utah Computer
                      8:  * Science Department.
                      9:  *
                     10:  * Redistribution is only permitted until one year after the first shipment
                     11:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
                     12:  * binary forms are permitted provided that: (1) source distributions retain
                     13:  * this entire copyright notice and comment, and (2) distributions including
                     14:  * binaries display the following acknowledgement:  This product includes
                     15:  * software developed by the University of California, Berkeley and its
                     16:  * contributors'' in the documentation or other materials provided with the
                     17:  * distribution and in all advertising materials mentioning features or use
                     18:  * of this software.  Neither the name of the University nor the names of
                     19:  * its contributors may be used to endorse or promote products derived from
                     20:  * this software without specific prior written permission.
                     21:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     22:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     23:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     24:  *
                     25:  * from: Utah $Hdr: autoconf.c 1.25 89/10/07$
                     26:  *
                     27:  *     @(#)autoconf.c  7.2 (Berkeley) 5/25/90
                     28:  */
                     29: 
                     30: /*
                     31:  * Setup the system to run on the current machine.
                     32:  *
                     33:  * Configure() is called at boot time.  Available
                     34:  * devices are determined (from possibilities mentioned in ioconf.c),
                     35:  * and the drivers are initialized.
                     36:  */
                     37: 
                     38: #include "param.h"
                     39: #include "systm.h"
                     40: #include "map.h"
                     41: #include "buf.h"
                     42: #include "dkstat.h"
                     43: #include "vm.h"
                     44: #include "conf.h"
                     45: #include "dmap.h"
                     46: #include "reboot.h"
                     47: 
                     48: #include "pte.h"
                     49: #include "cpu.h"
                     50: #include "isr.h"
                     51: #include "../hpdev/device.h"
                     52: #include "../hpdev/grfioctl.h"
                     53: #include "../hpdev/grfvar.h"
                     54: 
                     55: /*
                     56:  * The following several variables are related to
                     57:  * the configuration process, and are used in initializing
                     58:  * the machine.
                     59:  */
                     60: int    cold;               /* if 1, still working on cold-start */
                     61: int    dkn;                /* number of iostat dk numbers assigned so far */
                     62: int    cpuspeed = MHZ_8;   /* relative cpu speed */
                     63: struct isr isrqueue[NISR];
                     64: struct hp_hw sc_table[MAX_CTLR];
                     65: 
                     66: extern int internalhpib;
                     67: 
                     68: #ifdef DEBUG
                     69: int    acdebug = 0;
                     70: #endif
                     71: 
                     72: /*
                     73:  * Determine mass storage and memory configuration for a machine.
                     74:  */
                     75: configure()
                     76: {
                     77:        register struct hp_hw *hw;
                     78:        int found;
                     79: 
                     80:        /*
                     81:         * XXX: these should be consolidated into some kind of table
                     82:         */
                     83:        hilinit();
                     84:        isrinit();
                     85:        dmainit();
                     86: 
                     87:        /*
                     88:         * Look over each hardware device actually found and attempt
                     89:         * to match it with an ioconf.c table entry.
                     90:         */
                     91:        for (hw = sc_table; hw->hw_type; hw++) {
                     92:                if (hw->hw_type & CONTROLLER)
                     93:                        found = find_controller(hw);
                     94:                else
                     95:                        found = find_device(hw);
                     96: #ifdef DEBUG
                     97:                if (!found) {
                     98:                        int sc = addrtosc((u_int)hw->hw_addr);
                     99: 
                    100:                        printf("unconfigured %s ", hw->hw_name);
                    101:                        if (sc < 256)
                    102:                                printf("at sc%d\n", sc);
                    103:                        else
                    104:                                printf("csr at %x\n", sc);
                    105:                }
                    106: #endif
                    107:        }
                    108: 
                    109: #include "cd.h"
                    110: #if NCD > 0
                    111:        /*
                    112:         * Now deal with concatenated disks
                    113:         */
                    114:        find_cdevices();
                    115: #endif
                    116: 
                    117: #if GENERIC
                    118:        if ((boothowto & RB_ASKNAME) == 0)
                    119:                setroot();
                    120:        setconf();
                    121: #else
                    122:        setroot();
                    123: #endif
                    124:        swapconf();
                    125:        cold = 0;
                    126: }
                    127: 
                    128: #define dr_type(d, s)  \
                    129:        (strcmp((d)->d_name, (s)) == 0)
                    130: 
                    131: #define same_hw_ctlr(hw, hc) \
                    132:        ((hw)->hw_type == HPIB && dr_type((hc)->hp_driver, "hpib") || \
                    133:         (hw)->hw_type == SCSI && dr_type((hc)->hp_driver, "scsi"))
                    134: 
                    135: find_controller(hw)
                    136:        register struct hp_hw *hw;
                    137: {
                    138:        register struct hp_ctlr *hc;
                    139:        struct hp_ctlr *match_c;
                    140:        caddr_t oaddr;
                    141:        int sc;
                    142: 
                    143: #ifdef DEBUG
                    144:        if (acdebug)
                    145:                printf("find_controller: hw: %s at sc%d (%x), type %x...",
                    146:                       hw->hw_name, hw->hw_sc, hw->hw_addr, hw->hw_type);
                    147: #endif
                    148:        sc = hw->hw_sc;
                    149:        match_c = NULL;
                    150:        for (hc = hp_cinit; hc->hp_driver; hc++) {
                    151:                if (hc->hp_alive)
                    152:                        continue;
                    153:                /*
                    154:                 * Make sure we are looking at the right
                    155:                 * controller type.
                    156:                 */
                    157:                if (!same_hw_ctlr(hw, hc))
                    158:                        continue;
                    159:                /*
                    160:                 * Exact match; all done
                    161:                 */
                    162:                if ((int)hc->hp_addr == sc) {
                    163:                        match_c = hc;
                    164:                        break;
                    165:                }
                    166:                /*
                    167:                 * Wildcard; possible match so remember first instance
                    168:                 * but continue looking for exact match.
                    169:                 */
                    170:                if ((int)hc->hp_addr == WILD_CARD_CTLR && match_c == NULL)
                    171:                        match_c = hc;
                    172:        }
                    173: #ifdef DEBUG
                    174:        if (acdebug) {
                    175:                if (match_c)
                    176:                        printf("found %s%d\n",
                    177:                               match_c->hp_driver->d_name,
                    178:                               match_c->hp_unit);
                    179:                else
                    180:                        printf("not found\n");
                    181:        }
                    182: #endif
                    183:        /*
                    184:         * Didn't find an ioconf entry for this piece of hardware,
                    185:         * just ignore it.
                    186:         */
                    187:        if (match_c == NULL)
                    188:                return(0);
                    189:        /*
                    190:         * Found a match, attempt to initialize and configure all attached
                    191:         * slaves.  Note, we can still fail if HW won't initialize.
                    192:         */
                    193:        hc = match_c;
                    194:        oaddr = hc->hp_addr;
                    195:        hc->hp_addr = hw->hw_addr;
                    196:        if ((*hc->hp_driver->d_init)(hc)) {
                    197:                hc->hp_alive = 1;
                    198:                printf("%s%d", hc->hp_driver->d_name, hc->hp_unit);
                    199:                sc = addrtosc((u_int)hc->hp_addr);
                    200:                if (sc < 256)
                    201:                        printf(" at sc%d,", sc);
                    202:                else
                    203:                        printf(" csr 0x%x,", sc);
                    204:                printf(" ipl %d", hc->hp_ipl);
                    205:                if (hc->hp_flags)
                    206:                        printf(" flags 0x%x", hc->hp_flags);
                    207:                printf("\n");
                    208:                find_slaves(hc);
                    209:        } else
                    210:                hc->hp_addr = oaddr;
                    211:        return(1);
                    212: }
                    213: 
                    214: find_device(hw)
                    215:        register struct hp_hw *hw;
                    216: {
                    217:        register struct hp_device *hd;
                    218:        struct hp_device *match_d;
                    219:        caddr_t oaddr;
                    220:        int sc;
                    221: 
                    222: #ifdef DEBUG
                    223:        if (acdebug)
                    224:                printf("find_device: hw: %s at sc%d (%x), type %x...",
                    225:                       hw->hw_name, hw->hw_sc, hw->hw_addr, hw->hw_type);
                    226: #endif
                    227:        match_d = NULL;
                    228:        for (hd = hp_dinit; hd->hp_driver; hd++) {
                    229:                if (hd->hp_alive)
                    230:                        continue;
                    231:                /* Must not be a slave */
                    232:                if (hd->hp_cdriver)
                    233:                        continue;
                    234:                /*
                    235:                 * XXX: A graphics device that was found as part of the
                    236:                 * console init will have the hp_addr field already set
                    237:                 * (i.e. no longer the select code).  Gotta perform a
                    238:                 * slightly different check for an exact match.
                    239:                 */
                    240:                if (hw->hw_type == BITMAP && hd->hp_addr >= (caddr_t)IOBASE) {
                    241:                        /* must be an exact match */
                    242:                        if (hd->hp_addr == hw->hw_addr) {
                    243:                                match_d = hd;
                    244:                                break;
                    245:                        }
                    246:                        continue;
                    247:                }
                    248:                sc = (int) hd->hp_addr;
                    249:                /*
                    250:                 * Exact match; all done.
                    251:                 */
                    252:                if (sc > 0 && sc == hw->hw_sc) {
                    253:                        match_d = hd;
                    254:                        break;
                    255:                }
                    256:                /*
                    257:                 * Wildcard; possible match so remember first instance
                    258:                 * but continue looking for exact match.
                    259:                 */
                    260:                if (sc == 0 && same_hw_device(hw, hd) && match_d == NULL)
                    261:                        match_d = hd;
                    262:        }
                    263: #ifdef DEBUG
                    264:        if (acdebug) {
                    265:                if (match_d)
                    266:                        printf("found %s%d\n",
                    267:                               match_d->hp_driver->d_name,
                    268:                               match_d->hp_unit);
                    269:                else
                    270:                        printf("not found\n");
                    271:        }
                    272: #endif
                    273:        /*
                    274:         * Didn't find an ioconf entry for this piece
                    275:         * of hardware, just ignore it.
                    276:         */
                    277:        if (match_d == NULL)
                    278:                return(0);
                    279:        /*
                    280:         * Found a match, attempt to initialize.
                    281:         * Note, we can still fail if HW won't initialize.
                    282:         */
                    283:        hd = match_d;
                    284:        oaddr = hd->hp_addr;
                    285:        hd->hp_addr = hw->hw_addr;
                    286:        if ((*hd->hp_driver->d_init)(hd)) {
                    287:                hd->hp_alive = 1;
                    288:                printf("%s%d", hd->hp_driver->d_name, hd->hp_unit);
                    289:                sc = addrtosc((u_int)hd->hp_addr);
                    290:                if (sc < 32)
                    291:                        printf(" at sc%d", sc);
                    292:                else
                    293:                        printf(" csr 0x%x", sc);
                    294:                if (hd->hp_ipl)
                    295:                        printf(", ipl %d", hd->hp_ipl);
                    296:                if (hd->hp_flags)
                    297:                        printf(", flags 0x%x", hd->hp_flags);
                    298:                printf("\n");
                    299:        } else
                    300:                hd->hp_addr = oaddr;
                    301:        return(1);
                    302: }
                    303: 
                    304: find_slaves(hc)
                    305:        struct hp_ctlr *hc;
                    306: {
                    307:        /*
                    308:         * The SCSI bus is structured very much like the HP-IB 
                    309:         * except that the host adaptor is slave 7 so we only want
                    310:         * to look at the first 6 slaves.
                    311:         */
                    312:        if (dr_type(hc->hp_driver, "hpib"))
                    313:                find_busslaves(hc, MAXSLAVES);
                    314:        else if (dr_type(hc->hp_driver, "scsi"))
                    315:                find_busslaves(hc, MAXSLAVES-1);
                    316: }
                    317: 
                    318: /*
                    319:  * Search each BUS controller found for slaves attached to it.
                    320:  * The bad news is that we don't know how to uniquely identify all slaves
                    321:  * (e.g. PPI devices on HP-IB).  The good news is that we can at least
                    322:  * differentiate those from slaves we can identify.  At worst (a totally
                    323:  * wildcarded entry) this will cause us to locate such a slave at the first
                    324:  * unused position instead of where it really is.  To save grief, non-
                    325:  * identifing devices should always be fully qualified.
                    326:  */
                    327: find_busslaves(hc, maxslaves)
                    328:        register struct hp_ctlr *hc;
                    329:        int maxslaves;
                    330: {
                    331:        register int s;
                    332:        register struct hp_device *hd;
                    333:        struct hp_device *match_s;
                    334:        int new_s, new_c, old_s, old_c;
                    335:        int rescan;
                    336:        
                    337: #ifdef DEBUG
                    338:        if (acdebug)
                    339:                printf("find_busslaves: for %s%d\n",
                    340:                       hc->hp_driver->d_name, hc->hp_unit);
                    341: #endif
                    342:        for (s = 0; s < maxslaves; s++) {
                    343:                rescan = 1;
                    344:                match_s = NULL;
                    345:                for (hd = hp_dinit; hd->hp_driver; hd++) {
                    346:                        /*
                    347:                         * Rule out the easy ones:
                    348:                         * 1. slave already assigned or not a slave
                    349:                         * 2. not of the proper type
                    350:                         * 3. controller specified but not this one
                    351:                         * 4. slave specified but not this one
                    352:                         */
                    353:                        if (hd->hp_alive || hd->hp_cdriver == NULL)
                    354:                                continue;
                    355:                        if (!dr_type(hc->hp_driver, hd->hp_cdriver->d_name))
                    356:                                continue;
                    357:                        if (hd->hp_ctlr >= 0 && hd->hp_ctlr != hc->hp_unit)
                    358:                                continue;
                    359:                        if (hd->hp_slave >= 0 && hd->hp_slave != s)
                    360:                                continue;
                    361:                        /*
                    362:                         * Case 0: first possible match.
                    363:                         * Remember it and keep looking for better.
                    364:                         */
                    365:                        if (match_s == NULL) {
                    366:                                match_s = hd;
                    367:                                new_c = hc->hp_unit;
                    368:                                new_s = s;
                    369:                                continue;
                    370:                        }
                    371:                        /*
                    372:                         * Case 1: exact match.
                    373:                         * All done.  Note that we do not attempt any other
                    374:                         * matches if this one fails.  This allows us to
                    375:                         * "reserve" locations for dynamic addition of
                    376:                         * disk/tape drives by fully qualifing the location.
                    377:                         */
                    378:                        if (hd->hp_slave == s && hd->hp_ctlr == hc->hp_unit) {
                    379:                                match_s = hd;
                    380:                                rescan = 0;
                    381:                                break;
                    382:                        }
                    383:                        /*
                    384:                         * Case 2: right controller, wildcarded slave.
                    385:                         * Remember first and keep looking for an exact match.
                    386:                         */
                    387:                        if (hd->hp_ctlr == hc->hp_unit &&
                    388:                            match_s->hp_ctlr < 0) {
                    389:                                match_s = hd;
                    390:                                new_s = s;
                    391:                                continue;
                    392:                        }
                    393:                        /*
                    394:                         * Case 3: right slave, wildcarded controller.
                    395:                         * Remember and keep looking for a better match.
                    396:                         */
                    397:                        if (hd->hp_slave == s &&
                    398:                            match_s->hp_ctlr < 0 && match_s->hp_slave < 0) {
                    399:                                match_s = hd;
                    400:                                new_c = hc->hp_unit;
                    401:                                continue;
                    402:                        }
                    403:                        /*
                    404:                         * OW: we had a totally wildcarded spec.
                    405:                         * If we got this far, we have found a possible
                    406:                         * match already (match_s != NULL) so there is no
                    407:                         * reason to remember this one.
                    408:                         */
                    409:                        continue;
                    410:                }
                    411:                /*
                    412:                 * Found a match.  We need to set hp_ctlr/hp_slave properly
                    413:                 * for the init routines but we also need to remember all
                    414:                 * the old values in case this doesn't pan out.
                    415:                 */
                    416:                if (match_s) {
                    417:                        hd = match_s;
                    418:                        old_c = hd->hp_ctlr;
                    419:                        old_s = hd->hp_slave;
                    420:                        if (hd->hp_ctlr < 0)
                    421:                                hd->hp_ctlr = new_c;
                    422:                        if (hd->hp_slave < 0)
                    423:                                hd->hp_slave = new_s;
                    424: #ifdef DEBUG
                    425:                        if (acdebug)
                    426:                                printf("looking for %s%d at slave %d...",
                    427:                                       hd->hp_driver->d_name,
                    428:                                       hd->hp_unit, hd->hp_slave);
                    429: #endif
                    430: 
                    431:                        if ((*hd->hp_driver->d_init)(hd)) {
                    432: #ifdef DEBUG
                    433:                                if (acdebug)
                    434:                                        printf("found\n");
                    435: #endif
                    436:                                printf("%s%d at %s%d, slave %d",
                    437:                                       hd->hp_driver->d_name, hd->hp_unit,
                    438:                                       hc->hp_driver->d_name, hd->hp_ctlr,
                    439:                                       hd->hp_slave);
                    440:                                if (hd->hp_flags)
                    441:                                        printf(" flags 0x%x", hd->hp_flags);
                    442:                                printf("\n");
                    443:                                hd->hp_alive = 1;
                    444:                                if (hd->hp_dk && dkn < DK_NDRIVE)
                    445:                                        hd->hp_dk = dkn++;
                    446:                                else
                    447:                                        hd->hp_dk = -1;
                    448:                                rescan = 1;
                    449:                        } else {
                    450: #ifdef DEBUG
                    451:                                if (acdebug)
                    452:                                        printf("not found\n");
                    453: #endif
                    454:                                hd->hp_ctlr = old_c;
                    455:                                hd->hp_slave = old_s;
                    456:                        }
                    457:                        /*
                    458:                         * XXX: This should be handled better.
                    459:                         * Re-scan a slave.  There are two reasons to do this.
                    460:                         * 1. It is possible to have both a tape and disk
                    461:                         *    (e.g. 7946) or two disks (e.g. 9122) at the
                    462:                         *    same slave address.  Here we need to rescan
                    463:                         *    looking only at entries with a different
                    464:                         *    physical unit number (hp_flags).
                    465:                         * 2. It is possible that an init failed because the
                    466:                         *    slave was there but of the wrong type.  In this
                    467:                         *    case it may still be possible to match the slave
                    468:                         *    to another ioconf entry of a different type.
                    469:                         *    Here we need to rescan looking only at entries
                    470:                         *    of different types.
                    471:                         * In both cases we avoid looking at undesirable
                    472:                         * ioconf entries of the same type by setting their
                    473:                         * alive fields to -1.
                    474:                         */
                    475:                        if (rescan) {
                    476:                                for (hd = hp_dinit; hd->hp_driver; hd++) {
                    477:                                        if (hd->hp_alive)
                    478:                                                continue;
                    479:                                        if (match_s->hp_alive == 1) {   /* 1 */
                    480:                                                if (hd->hp_flags == match_s->hp_flags)
                    481:                                                        hd->hp_alive = -1;
                    482:                                        } else {                        /* 2 */
                    483:                                                if (hd->hp_driver == match_s->hp_driver)
                    484:                                                        hd->hp_alive = -1;
                    485:                                        }
                    486:                                }
                    487:                                s--;
                    488:                                continue;
                    489:                        }
                    490:                }
                    491:                /*
                    492:                 * Reset bogon alive fields prior to attempting next slave
                    493:                 */
                    494:                for (hd = hp_dinit; hd->hp_driver; hd++)
                    495:                        if (hd->hp_alive == -1)
                    496:                                hd->hp_alive = 0;
                    497:        }
                    498: }
                    499: 
                    500: sctoaddr(addr)
                    501:        register int addr;
                    502: {
                    503:        if (addr == 7 && internalhpib)
                    504:                addr = internalhpib;
                    505:        else if (addr < 32)
                    506:                addr = IOV(EXTIOBASE + (addr * IOCARDSIZE));
                    507:        else
                    508:                addr = IOV(addr);
                    509:        return(addr);
                    510: }
                    511: 
                    512: addrtosc(addr)
                    513:        register u_int addr;
                    514: {
                    515: #if defined(HP360) || defined(HP370)
                    516:        extern char grfregs[];
                    517: 
                    518:        if (addr == (u_int)grfregs)
                    519:                addr = 132;
                    520:        else
                    521: #endif
                    522:        if (addr == internalhpib)
                    523:                addr = 7;
                    524:        else if (addr >= IOV(IOBASE)) {
                    525:                addr = UNIOV(addr);
                    526:                if (addr >= EXTIOBASE)
                    527:                        addr = (addr - EXTIOBASE) / IOCARDSIZE;
                    528:        }
                    529:        return((int)addr);
                    530: }
                    531: 
                    532: same_hw_device(hw, hd)
                    533:        struct hp_hw *hw;
                    534:        struct hp_device *hd;
                    535: {
                    536:        int found = 0;
                    537: 
                    538:        switch (hw->hw_type) {
                    539:        case HPIB:
                    540:        case RD:
                    541:        case PPI:
                    542:        case CT:
                    543:                found = dr_type(hd->hp_driver, "hpib");
                    544:                break;
                    545:        case BITMAP:
                    546:                found = dr_type(hd->hp_driver, "grf");
                    547:                break;
                    548:        case NET:
                    549:                found = dr_type(hd->hp_driver, "le");
                    550:                break;
                    551:        case COMMDCA:
                    552:                found = dr_type(hd->hp_driver, "dca");
                    553:                break;
                    554:        case COMMDCL:
                    555:                found = dr_type(hd->hp_driver, "dcl");
                    556:                break;
                    557:        case COMMDCM:
                    558:                found = dr_type(hd->hp_driver, "dcm");
                    559:                break;
                    560:        case SCSI:
                    561:                found = dr_type(hd->hp_driver, "scsi");
                    562:                break;
                    563:        case FPA:    /* Unsupported so far */
                    564:        case VME:
                    565:        case FLINK:
                    566:        case MISC:
                    567:                break;
                    568:        }
                    569:        return(found);
                    570: }
                    571: 
                    572: find_devs()
                    573: {
                    574:        short sc;
                    575:        u_char *id_reg;
                    576:        register int addr;
                    577:        register struct hp_hw *hw;
                    578: 
                    579:        hw = sc_table;
                    580:        for (sc = -1; sc < 32; sc++) {
                    581: #if defined(HP360) || defined(HP370)
                    582:                /*
                    583:                 * XXX: special check for bit-mapped display
                    584:                 * at SC132 in DIO II space on the 340.
                    585:                 */
                    586:                if (sc == -1 && machineid == HP_340) {
                    587:                        extern struct pte Grfmap[];
                    588:                        extern char grfregs[];
                    589: 
                    590:                        physaccess(Grfmap, (caddr_t)DIOIIBASE,
                    591:                                   DIOIICSIZE, PG_RW|PG_CI);
                    592:                        addr = (int) grfregs;
                    593:                        /*
                    594:                         * Nothing there or not a display,
                    595:                         * try the usual internal display address.
                    596:                         */
                    597:                        if (badaddr((caddr_t)addr) ||
                    598:                            (((u_char *)addr)[1] & 0xff) != 57)
                    599:                                addr = IOV(GRFIADDR);
                    600:                } else
                    601: #endif
                    602:                /*
                    603:                 * Probe all select codes + internal display addr
                    604:                 */
                    605:                if (sc == -1)
                    606:                        addr = IOV(GRFIADDR);
                    607:                else
                    608:                        addr = sctoaddr(sc);
                    609:                if (badaddr((caddr_t)addr))
                    610:                        continue;
                    611: 
                    612:                id_reg = (u_char *) addr;
                    613:                hw->hw_id = id_reg[1] & 0xff;
                    614:                hw->hw_sc = sc;
                    615:                hw->hw_addr = (char *) addr;
                    616:                /*
                    617:                 * Internal HP-IB on some machines (345/375) doesn't return
                    618:                 * consistant id info so we use the info gleaned from the
                    619:                 * boot ROMs SYSFLAG.
                    620:                 */
                    621:                if (sc == 7 && internalhpib) {
                    622:                        hw->hw_name = "98624A";
                    623:                        hw->hw_type = HPIB;
                    624:                        hw++;
                    625:                        continue;
                    626:                }
                    627:                /*
                    628:                 * XXX: the following could be in a big static table
                    629:                 */
                    630:                switch (hw->hw_id) {
                    631:                /* Null device? */
                    632:                case 0:
                    633:                        break;
                    634:                case 2:
                    635:                case 128+2:
                    636:                        hw->hw_name = "98626A";
                    637:                        hw->hw_type = COMMDCA;
                    638:                        break;
                    639:                case 3:
                    640:                        hw->hw_name = "98622A";
                    641:                        hw->hw_type = MISC;
                    642:                        break;
                    643:                case 4:
                    644:                        hw->hw_name = "98623A";
                    645:                        hw->hw_type = MISC;
                    646:                        break;
                    647:                case 5:
                    648:                case 128+5:
                    649:                        hw->hw_name = "98642A";
                    650:                        hw->hw_type = COMMDCM;
                    651:                        break;
                    652:                case 6:
                    653:                        hw->hw_name = "Parallel Port";
                    654:                        hw->hw_type = PPORT;
                    655:                        break;
                    656:                case 7:
                    657:                case 39:
                    658:                case 71:
                    659:                case 103:
                    660:                        hw->hw_name = "98265A";
                    661:                        hw->hw_type = SCSI;
                    662:                        break;
                    663:                case 8:
                    664:                        hw->hw_name = "98625B";
                    665:                        hw->hw_type = HPIB;
                    666:                        break;
                    667:                case 9:
                    668:                        hw->hw_name = "98287A";
                    669:                        hw->hw_type = KEYBOARD;
                    670:                        break;
                    671:                case 10:
                    672:                        hw->hw_name = "98635A";
                    673:                        hw->hw_type = FPA;
                    674:                        break;
                    675:                case 11:
                    676:                        hw->hw_name = "Timer";
                    677:                        hw->hw_type = MISC;
                    678:                        break;
                    679:                case 18:
                    680:                        hw->hw_name = "98640A";
                    681:                        hw->hw_type = MISC;
                    682:                        break;
                    683:                case 21:
                    684:                        hw->hw_name = "98643A";
                    685:                        hw->hw_type = NET;
                    686:                        break;
                    687:                case 22:
                    688:                        hw->hw_name = "98659A";
                    689:                        hw->hw_type = MISC;
                    690:                        break;
                    691:                case 25:
                    692:                        hw->hw_name = "237";
                    693:                        hw->hw_type = BITMAP;
                    694:                        break;
                    695:                case 26:
                    696:                        hw->hw_name = "Quad";
                    697:                        hw->hw_type = MISC;
                    698:                        break;
                    699:                case 27:
                    700:                        hw->hw_name = "98253A";
                    701:                        hw->hw_type = MISC;
                    702:                        break;
                    703:                case 28:
                    704:                        hw->hw_name = "98627A";
                    705:                        hw->hw_type = BITMAP;
                    706:                        break;
                    707:                case 29:
                    708:                        hw->hw_name = "98633A";
                    709:                        hw->hw_type = BITMAP;
                    710:                        break;
                    711:                case 30:
                    712:                        hw->hw_name = "98259A";
                    713:                        hw->hw_type = MISC;
                    714:                        break;
                    715:                case 31:
                    716:                        hw->hw_name = "8741";
                    717:                        hw->hw_type = MISC;
                    718:                        break;
                    719:                case 49:
                    720:                        hw->hw_name = "98577A";
                    721:                        hw->hw_type = VME;
                    722:                        sc++;
                    723:                        break;
                    724:                case 52:
                    725:                case 180:
                    726:                        hw->hw_name = "98628A";
                    727:                        hw->hw_type = COMMDCL;
                    728:                        break;
                    729:                case 57:
                    730:                        hw->hw_type = BITMAP;
                    731:                        hw->hw_id2 = id_reg[0x15];
                    732:                        switch (hw->hw_id2) {
                    733:                        case 1:
                    734:                                hw->hw_name = "98700 ";
                    735:                                break;
                    736:                        case 2:
                    737:                                hw->hw_name = "TOPCAT";
                    738:                                break;
                    739:                        case 4:
                    740:                                hw->hw_name = "98720 ";
                    741:                                sc++;
                    742:                                break;
                    743:                        case 5:
                    744:                        case 6:
                    745:                        case 7:
                    746:                        case 9:
                    747:                                hw->hw_name = "CATSEYE";
                    748:                                break;
                    749:                        case 8:
                    750:                                hw->hw_name = "98730 ";
                    751:                                sc++;
                    752:                                break;
                    753:                        default:
                    754:                                hw->hw_name = "987xx ";
                    755:                                break;
                    756:                        }
                    757:                        break;
                    758:                case 66:
                    759:                case 128+66:
                    760:                        hw->hw_name = "98644A";
                    761:                        hw->hw_type = COMMDCA;
                    762:                        break;
                    763:                case 128:
                    764:                        hw->hw_name = "98624A";
                    765:                        hw->hw_type = HPIB;
                    766:                        break;
                    767:                default:
                    768:                        hw->hw_name = "DEFAULT";
                    769:                        hw->hw_type = MISC;
                    770:                        break;
                    771:                }
                    772:                hw++;
                    773:        }
                    774: }
                    775: 
                    776: #if NCD > 0
                    777: #include "../hpdev/cdvar.h"
                    778: 
                    779: find_cdevices()
                    780: {
                    781:        register struct cddevice *cd;
                    782: 
                    783:        for (cd = cddevice; cd->cd_unit >= 0; cd++) {
                    784:                /*
                    785:                 * XXX
                    786:                 * Assign disk index first so that init routine
                    787:                 * can use it (saves having the driver drag around
                    788:                 * the cddevice pointer just to set up the dk_*
                    789:                 * info in the open routine).
                    790:                 */
                    791:                if (dkn < DK_NDRIVE)
                    792:                        cd->cd_dk = dkn++;
                    793:                else
                    794:                        cd->cd_dk = -1;
                    795:                if (cdinit(cd))
                    796:                        printf("cd%d configured\n", cd->cd_unit);
                    797:                else if (cd->cd_dk >= 0) {
                    798:                        cd->cd_dk = -1;
                    799:                        dkn--;
                    800:                }
                    801:        }
                    802: }
                    803: #endif
                    804: 
                    805: isrinit()
                    806: {
                    807:        register int i;
                    808: 
                    809:        for (i = 0; i < NISR; i++)
                    810:                isrqueue[i].isr_forw = isrqueue[i].isr_back = &isrqueue[i];
                    811: }
                    812: 
                    813: void
                    814: isrlink(isr)
                    815:        register struct isr *isr;
                    816: {
                    817:        int i = ISRIPL(isr->isr_ipl);
                    818: 
                    819:        if (i < 0 || i >= NISR) {
                    820:                printf("bad IPL %d\n", i);
                    821:                panic("configure");
                    822:        }
                    823:        insque(isr, isrqueue[i].isr_back);
                    824: }
                    825: 
                    826: /*
                    827:  * Configure swap space and related parameters.
                    828:  */
                    829: swapconf()
                    830: {
                    831:        register struct swdevt *swp;
                    832:        register int nblks;
                    833: 
                    834:        for (swp = swdevt; swp->sw_dev; swp++)
                    835:                if (bdevsw[major(swp->sw_dev)].d_psize) {
                    836:                        nblks =
                    837:                          (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev);
                    838:                        if (nblks != -1 &&
                    839:                            (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
                    840:                                swp->sw_nblks = nblks;
                    841:                }
                    842:        dumpconf();
                    843: }
                    844: 
                    845: #define        DOSWAP                  /* Change swdevt, argdev, and dumpdev too */
                    846: u_long bootdev;                /* should be dev_t, but not until 32 bits */
                    847: 
                    848: static char devname[][2] = {
                    849:        0,0,            /* 0 = ct */
                    850:        0,0,            /* 1 = xx */
                    851:        'r','d',        /* 2 = rd */
                    852:        0,0,            /* 3 = sw */
                    853:        's','d',        /* 4 = rd */
                    854: };
                    855: 
                    856: #define        PARTITIONMASK   0x7
                    857: #define        PARTITIONSHIFT  3
                    858: 
                    859: /*
                    860:  * Attempt to find the device from which we were booted.
                    861:  * If we can do so, and not instructed not to do so,
                    862:  * change rootdev to correspond to the load device.
                    863:  */
                    864: setroot()
                    865: {
                    866:        register struct hp_ctlr *hc;
                    867:        register struct hp_device *hd;
                    868:        int  majdev, mindev, unit, part, adaptor;
                    869:        dev_t temp, orootdev;
                    870:        struct swdevt *swp;
                    871: 
                    872:        if (boothowto & RB_DFLTROOT ||
                    873:            (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC)
                    874:                return;
                    875:        majdev = (bootdev >> B_TYPESHIFT) & B_TYPEMASK;
                    876:        if (majdev > sizeof(devname) / sizeof(devname[0]))
                    877:                return;
                    878:        adaptor = (bootdev >> B_ADAPTORSHIFT) & B_ADAPTORMASK;
                    879:        part = (bootdev >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
                    880:        unit = (bootdev >> B_UNITSHIFT) & B_UNITMASK;
                    881:        /*
                    882:         * First, find the controller type which support this device.
                    883:         */
                    884:        for (hd = hp_dinit; hd->hp_driver; hd++)
                    885:                if (hd->hp_driver->d_name[0] == devname[majdev][0] &&
                    886:                    hd->hp_driver->d_name[1] == devname[majdev][1])
                    887:                        break;
                    888:        if (hd->hp_driver == 0)
                    889:                return;
                    890:        /*
                    891:         * Next, find the controller of that type corresponding to
                    892:         * the adaptor number.
                    893:         */
                    894:        for (hc = hp_cinit; hc->hp_driver; hc++)
                    895:                if (hc->hp_alive && hc->hp_unit == adaptor &&
                    896:                    hc->hp_driver == hd->hp_cdriver)
                    897:                        break;
                    898:        if (hc->hp_driver == 0)
                    899:                return;
                    900:        /*
                    901:         * Finally, find the device in question attached to that controller.
                    902:         */
                    903:        for (hd = hp_dinit; hd->hp_driver; hd++)
                    904:                if (hd->hp_alive && hd->hp_slave == unit &&
                    905:                    hd->hp_cdriver == hc->hp_driver &&
                    906:                    hd->hp_ctlr == hc->hp_unit)
                    907:                        break;
                    908:        if (hd->hp_driver == 0)
                    909:                return;
                    910:        mindev = hd->hp_unit;
                    911:        /*
                    912:         * Form a new rootdev
                    913:         */
                    914:        mindev = (mindev << PARTITIONSHIFT) + part;
                    915:        orootdev = rootdev;
                    916:        rootdev = makedev(majdev, mindev);
                    917:        /*
                    918:         * If the original rootdev is the same as the one
                    919:         * just calculated, don't need to adjust the swap configuration.
                    920:         */
                    921:        if (rootdev == orootdev)
                    922:                return;
                    923: 
                    924:        printf("Changing root device to %c%c%d%c\n",
                    925:                devname[majdev][0], devname[majdev][1],
                    926:                mindev >> PARTITIONSHIFT, part + 'a');
                    927: 
                    928: #ifdef DOSWAP
                    929:        mindev &= ~PARTITIONMASK;
                    930:        for (swp = swdevt; swp->sw_dev; swp++) {
                    931:                if (majdev == major(swp->sw_dev) &&
                    932:                    mindev == (minor(swp->sw_dev) & ~PARTITIONMASK)) {
                    933:                        temp = swdevt[0].sw_dev;
                    934:                        swdevt[0].sw_dev = swp->sw_dev;
                    935:                        swp->sw_dev = temp;
                    936:                        break;
                    937:                }
                    938:        }
                    939:        if (swp->sw_dev == 0)
                    940:                return;
                    941: 
                    942:        /*
                    943:         * If argdev and dumpdev were the same as the old primary swap
                    944:         * device, move them to the new primary swap device.
                    945:         */
                    946:        if (temp == dumpdev)
                    947:                dumpdev = swdevt[0].sw_dev;
                    948:        if (temp == argdev)
                    949:                argdev = swdevt[0].sw_dev;
                    950: #endif
                    951: }
                    952: 
                    953: strcmp(s1, s2)
                    954:        register char *s1, *s2;
                    955: {
                    956:        while (*s1 == *s2++)
                    957:                if (*s1++=='\0')
                    958:                        return (0);
                    959:        return (*s1 - *--s2);
                    960: }

unix.superglobalmegacorp.com

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