|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.