Annotation of coherent/f/tmp/inst2/mkdev.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * mkdev.c
        !             3:  * 06/28/93
        !             4:  *
        !             5:  * Allow the user to configure devices requiring loadable drivers.
        !             6:  * Uses common routines in build0.c: cc -o mkdev mkdev.c build0.c
        !             7:  * Usage: mkdev [ -bdv ] { scsi | at | floppytape } ...
        !             8:  * Options:
        !             9:  *     -b      Use special processing when invoked from /etc/build
        !            10:  *     -d      Debug; echo commands without executing
        !            11:  *     -v      Verbose
        !            12:  *
        !            13:  * Roughly, do the following for device "foo" ( at | aha154x | ss )
        !            14:  *
        !            15:  *     cp /drv/foo /tmp/drv/foo
        !            16:  *     make necessary patches "xxx" to /tmp/drv/foo
        !            17:  *     if not "at" device
        !            18:  *             make nodes (mknod -f) for the device
        !            19:  *     if build mode (bflag)
        !            20:  *             if rootdev
        !            21:  *                     append to LDKERFILE:
        !            22:  *                             HD=foo.a
        !            23:  *                             HDUNDEF="-u foocon_"
        !            24:  *                             HDPATCH="drvl_+xx0=foocon_"
        !            25:  *             /etc/drvld -r /tmp/drv/foo
        !            26:  *             append to PATCHFILE:
        !            27:  *                     cp /tmp/drv/foo /mnt/drv/foo
        !            28:  *             if rootdev, also append to PATCHFILE:
        !            29:  *                     /conf/patch /mnt/coherent xxx
        !            30:  *     else - not build mode
        !            31:  *             display message saying patched driver is at /tmp/drv/foo
        !            32:  */
        !            33: 
        !            34: #define        __KERNEL__      1
        !            35: 
        !            36: #include <stdio.h>
        !            37: #include <sys/devices.h>
        !            38: #include <sys/con.h>
        !            39: #include <string.h>
        !            40: 
        !            41: #include "build0.h"
        !            42: 
        !            43: #define        VERSION         "V4"            /* version number */
        !            44: #define        USAGEMSG        "Usage:\t/etc/mkdev [ -bdv ] [ scsi | at | floppytape ] ...\n"
        !            45: #define BUFLEN         50
        !            46: #define AHA_HDS                64
        !            47: #define AHA_DMA                5
        !            48: #define AHA_IRQ                11
        !            49: #define AHA_BASE       0x330
        !            50: #define TANDY_HDS      16
        !            51: 
        !            52: /*
        !            53:  * calculate the minor number for the specified floppy tape device:
        !            54:  *     uu:     unit # (0-3)
        !            55:  *     vv:     brand of drive: 0=Archive/Mountain/Summit, 1=CMS, 2&3=rsvd
        !            56:  *     s:      select: 0=hard select, 1=soft select
        !            57:  *     r:      rewind: 0=no rewind on close, 1=rewind on close
        !            58:  */
        !            59: #define        FL_TAPE_MINOR(uu,vv,s,r)   ((1<<6)|((uu)<<4)|((s)<<3)|((r)<<2)|(vv))
        !            60: #define        FL_TAPE_HARD_SEL        0
        !            61: #define        FL_TAPE_SOFT_SEL        1
        !            62: #define        FL_TAPE_NOREW           0
        !            63: #define        FL_TAPE_REW             1
        !            64: 
        !            65: /* Forward. */
        !            66: void   scsi();
        !            67: void   at();
        !            68: void   floppy_tape();
        !            69: 
        !            70: /* Globals. */
        !            71: int    bflag;                          /* Invoked from /etc/build. */
        !            72: 
        !            73: main(argc, argv) int argc; char *argv[];
        !            74: {
        !            75:        register char *s;
        !            76: 
        !            77:        argv0 = argv[0];
        !            78:        usagemsg = USAGEMSG;
        !            79:        if (argc > 1 && argv[1][0] == '-') {
        !            80:                for (s = &argv[1][1]; *s; ++s) {
        !            81:                        switch(*s) {
        !            82:                        case 'b':       ++bflag;        break;
        !            83:                        case 'd':       ++dflag;        break;
        !            84:                        case 'v':       ++vflag;        break;
        !            85:                        case 'V':
        !            86:                                fprintf(stderr, "mkdev: %s\n", VERSION);
        !            87:                                break;
        !            88:                        default:        usage();        break;
        !            89:                        }
        !            90:                }
        !            91:                --argc;
        !            92:                ++argv;
        !            93:        }
        !            94: 
        !            95:        if (argc == 1) {
        !            96:                usage();
        !            97:        } else {
        !            98:                /* Do specified things. */
        !            99:                while (--argc > 0) {
        !           100:                        if (strcmp (argv [1], "scsi") == 0)
        !           101:                                scsi ();
        !           102:                        else if (strcmp (argv [1], "at") == 0)
        !           103:                                at ();
        !           104:                        else if (strcmp (argv [1], "floppytape") == 0)
        !           105:                                floppy_tape ();
        !           106:                        else
        !           107:                                usage ();
        !           108:                        ++argv;
        !           109:                }
        !           110:        }
        !           111:        exit (0);
        !           112: }
        !           113: 
        !           114: void
        !           115: scsi()
        !           116: {
        !           117:        char *dev;
        !           118:        int i, id, lun;
        !           119:        int ss_dev = 0;
        !           120:        int fut_dev = 0;
        !           121:        unsigned nsdrive = 0;
        !           122:        int ss_int = 5, new_int;
        !           123:        unsigned int ss_base = 0xCA00, new_base;
        !           124:        unsigned char ss_patch[200], buf[BUFLEN];
        !           125:        FILE *fp;
        !           126:        int aha_dev = 0, sd_hds = AHA_HDS, sd_dma = AHA_DMA;
        !           127:        int hai_dev = 0;
        !           128:        int sd_irq = AHA_IRQ, sd_base = AHA_BASE;
        !           129:        int hai_tape = 0;
        !           130:        int hai_disk = 0;
        !           131:        int unit;
        !           132:        int tape_dev;
        !           133:        int choice;
        !           134: 
        !           135:        static int sd_irq_list[] = { 9, 10, 11, 12, 14, 15 };
        !           136:        int sd_irq_ct = sizeof(sd_irq_list)/sizeof(sd_irq_list[0]);
        !           137: 
        !           138:        static int sd_base_list[] =
        !           139:                  { 0x130, 0x134, 0x230, 0x234, 0x330, 0x334 };
        !           140:        int sd_base_ct = sizeof(sd_base_list)/sizeof(sd_base_list[0]);
        !           141: 
        !           142:        static int sd_dma_list[] = { 0, 5, 6, 7 };
        !           143:        int sd_dma_ct = sizeof(sd_dma_list)/sizeof(sd_dma_list[0]);
        !           144: 
        !           145:        cls(0);
        !           146:        printf(
        !           147: "COHERENT currently supports the following SCSI host adapters:\n"
        !           148: "\n"
        !           149: "(1) Adaptec AHA-154x series, no tape support\n"
        !           150: "(2) Adaptec AHA-154x series, with tape support\n\n"
        !           151: "(3) Seagate ST01 or ST02\n"
        !           152: "(4) Future Domain TMC-845/850/860/875/885\n"
        !           153: "(5) Future Domain TMC-840/841/880/881\n"
        !           154: "\n"
        !           155:                );
        !           156: retry:
        !           157:        switch(get_int(0, 5, "Enter a number from the above list or 0 to exit:")) {
        !           158:        case 0:
        !           159:                return;
        !           160:        case 1:
        !           161:                aha_dev = 1;
        !           162:                break;
        !           163:        case 2:
        !           164:                hai_dev = 1;
        !           165:                break;
        !           166:        case 3:
        !           167:                ss_dev = 1;
        !           168:                break;
        !           169:        case 4:
        !           170:                ss_dev = 1;
        !           171:                fut_dev = 1;
        !           172:                nsdrive |= 0x8000;
        !           173:                break;
        !           174:        case 5:
        !           175:                ss_dev = 1;
        !           176:                fut_dev = 1;
        !           177:                nsdrive |= 0x4000;
        !           178:                break;
        !           179:        default:
        !           180:                goto retry;             /* should never happen */
        !           181:        }
        !           182: 
        !           183:        /*
        !           184:         * If Adaptec, allow patching host adapter variables SD_HDS
        !           185:         * for Tandy variant of host BIOS.
        !           186:         */
        !           187:        if (aha_dev) {
        !           188: printf("\nMost versions of the Adaptec BIOS use 64-head translation mode.\n");
        !           189: printf("A few, including some Tandy variants, use 16-head translation mode.\n\n");
        !           190:                if (!yes_no("Do you want 64-head translation mode"))
        !           191:                        sd_hds = TANDY_HDS;
        !           192:        }
        !           193: 
        !           194:        if (aha_dev || hai_dev) {
        !           195:                sd_irq = get_allowed_int(sd_irq_list, sd_irq_ct, ga_dec,
        !           196:                  sd_irq, ga_nonstrict,
        !           197:                  "\nWhich IRQ does the host adapter use? ");
        !           198:                sd_base = get_allowed_int(sd_base_list, sd_base_ct, ga_hex,
        !           199:                  sd_base, ga_nonstrict,
        !           200:                  "\nWhat is the hexadecimal host adapter base port address? ");
        !           201:                sd_dma = get_allowed_int(sd_dma_list, sd_dma_ct, ga_hex,
        !           202:                  sd_dma, ga_nonstrict,
        !           203:                  "\nWhich DMA channel does the host adapter use? ");
        !           204:        }
        !           205: 
        !           206:        /*
        !           207:         * If Seagate or Future Domain, allow patching host adapter
        !           208:         * variables SS_INT and SS_BASE.
        !           209:         */
        !           210:        if (ss_dev) {
        !           211: printf("\nPlease refer to the installation guide for your host adapter.\n");
        !           212: 
        !           213:                /* Get value to patch for SS_INT */
        !           214: printf("\nWhich IRQ number does the host adapter use [%d]? ", ss_int);
        !           215:                while (1) {
        !           216:                        new_int = ss_int;
        !           217:                        fgets(buf, BUFLEN, stdin);
        !           218:                        sscanf(buf, "%d", &new_int);
        !           219:                        if (new_int < 3 || new_int > 15)
        !           220: printf("Type a number between 3 and 15 or just <Enter> for the default: ");
        !           221:                        else
        !           222:                                break;
        !           223:                } /* endwhile */
        !           224:                ss_int = new_int;
        !           225: 
        !           226:                /* Get value to patch for SS_BASE */
        !           227: printf("Your host adapter is configured for a base segment address.  Possible\n");
        !           228: printf("values are: C800, CA00, CC00, CE00, DC00, and DE00.\n");
        !           229: printf("What is your 4-digit hexadecimal base address [%04lx]? ", ss_base);
        !           230:                while (1) {
        !           231:                        new_base = ss_base;
        !           232:                        fgets(buf, BUFLEN, stdin);
        !           233:                        sscanf(buf, "%x", &new_base);
        !           234:                        if (new_base < 0xC800 || new_base > 0xDE00)
        !           235: printf("Type a number between C800 and DE00 or just <Enter> for the default: ");
        !           236:                        else
        !           237:                                break;
        !           238:                } /* endwhile */
        !           239:                ss_base = new_base;
        !           240:        }
        !           241:        
        !           242:        /* Make device nodes. */
        !           243:        cls(0);
        !           244:        if (hai_dev) {
        !           245:                printf(
        !           246: "You must specify a SCSI-ID (0 through 7) for each SCSI hard disk or tape\n"
        !           247: "device.  Each SCSI hard disk device can contain up to four partitions.\n"
        !           248: "Tape devices must be configured as logical unit number (LUN) 0.  All current\n"
        !           249: "SCSI tape drives with embedded SCSI controllers default to LUN 0.\n\n"
        !           250:                        );
        !           251:        } else {
        !           252:                printf(
        !           253: "You must specify a SCSI-ID (0 through 7) for each SCSI hard disk device.\n"
        !           254: "Each SCSI hard disk device can contain up to four partitions.\n\n"
        !           255:                        );
        !           256:        }
        !           257: 
        !           258: for (;;) {
        !           259:        tape_dev = 0;
        !           260: 
        !           261:        if (hai_dev) {
        !           262:                printf(
        !           263: "1) Enter SCSI ID for SCSI hard disk (fixed or removable media)\n"
        !           264: "2) Enter SCSI ID for SCSI tape drive\n\n"
        !           265: "3) End entering SCSI ID values.\n\n"
        !           266:                );
        !           267:                choice = get_int(1, 3, "Your choice:");
        !           268:        } else {
        !           269:                printf(
        !           270: "1) Enter SCSI ID for SCSI hard disk (fixed or removable media)\n"
        !           271: "2) End entering SCSI ID values.\n\n"
        !           272:                );
        !           273:                choice = get_int(1, 2, "Your choice:");
        !           274:        }
        !           275: 
        !           276:        if (hai_dev) {
        !           277:                if (choice == 2)
        !           278:                        tape_dev = 1;
        !           279:                if (choice == 3)
        !           280:                        break;
        !           281:        } else {
        !           282:                if (choice == 2)
        !           283:                        break;
        !           284:        }
        !           285: 
        !           286:        if (tape_dev) {
        !           287:                id = get_int(0, 7, "\nEnter the next tape device SCSI-ID:");
        !           288:                hai_tape |= (1 << id);
        !           289:        } else {
        !           290:                id = get_int(0, 7, "\nEnter the next disk device SCSI-ID:");
        !           291:                hai_disk |= (1 << id);
        !           292:        }
        !           293: 
        !           294:        lun = 0;
        !           295:        nsdrive |= (1 << id);
        !           296: 
        !           297:        /* Make /tmp/dev if bflag. */
        !           298:        if (bflag) {
        !           299:                if ((i = is_dir("/tmp/dev")) == 0)
        !           300:                        sys("/bin/mkdir /tmp/dev", S_FATAL);
        !           301:                else if (i == -1)
        !           302:                        fatal("/tmp/dev is not a directory");
        !           303:        }
        !           304:        dev = (bflag) ? "/tmp/dev" : "/dev";
        !           305: 
        !           306:        /*
        !           307:         * If we are creating a SCSI tape device (Adaptec only),
        !           308:         * create a device node in /tmp/dev. This will later be copied
        !           309:         * to the root filesystem on the hard drive.
        !           310:         */
        !           311: #if !TEST
        !           312:        if (tape_dev) {
        !           313: 
        !           314:                sprintf(cmd, "/etc/mknod -f /tmp/dev/rStp%d c %d %d",
        !           315:                        id, SCSI_MAJOR, SCSI_minor(1, id, lun, 3));
        !           316:                sys(cmd, S_NONFATAL);
        !           317: 
        !           318: #if 0
        !           319:                sprintf(cmd, "/etc/mknod -f %s/rst%dn c %d %d",
        !           320:                        dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 1));
        !           321:                sys(cmd, S_NONFATAL);
        !           322: 
        !           323:                sprintf(cmd, "/bin/ln -f %s/rStp%d %s/tape",
        !           324:                        dev, id, dev);
        !           325:                sys(cmd, S_NONFATAL);
        !           326: 
        !           327:                sprintf(cmd, "/bin/ln -f %s/rst%dn %s/ntape",
        !           328:                        dev, id, dev);
        !           329:                sys(cmd, S_NONFATAL);
        !           330: #endif
        !           331:                /* set the device permissions. */
        !           332:                sprintf(cmd, "/bin/chmog 600 sys sys %s/rStp%d*", dev, id);
        !           333:                sys(cmd, S_NONFATAL);
        !           334:        } 
        !           335: 
        !           336: 
        !           337: /* scsi disk devics have been moved to /dev/of the boot floppy.
        !           338:  * bob h (8/11/93)
        !           339:  */
        !           340: 
        !           341: #if 0
        !           342:          else {
        !           343:                /*
        !           344:                 * SCSI disk device:
        !           345:                 * Make the cooked devices.
        !           346:                 */
        !           347:                for (i = 0; i < 4; i++) {
        !           348:                        sprintf(cmd, "/etc/mknod -f %s/sd%d%c b %d %d",
        !           349:                                dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
        !           350:                        sys(cmd, S_NONFATAL);
        !           351:                }
        !           352:                sprintf(cmd, "/etc/mknod -f %s/sd%dx b %d %d",
        !           353:                        dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0));
        !           354:                sys(cmd, S_NONFATAL);
        !           355:                
        !           356:                /* make the raw devices. */
        !           357:                for (i = 0; i < 4; i++) {
        !           358:                        sprintf(cmd, "/etc/mknod -f %s/rsd%d%c c %d %d",
        !           359:                                dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
        !           360:                        sys(cmd, S_NONFATAL);
        !           361:                }
        !           362:                sprintf(cmd, "/etc/mknod -f %s/rsd%dx c %d %d",
        !           363:                        dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0));
        !           364:                sys(cmd, S_NONFATAL);
        !           365: 
        !           366:                /* set the device permissions. */
        !           367:                sprintf(cmd, "/bin/chmog 600 sys sys %s/sd*[a-d] %s/rsd*[a-d]",dev,dev);
        !           368:                sys(cmd, S_NONFATAL);
        !           369:                sprintf(cmd, "/bin/chmog 600 root root %s/sd*x %s/rsd*x", dev, dev);
        !           370:                sys(cmd, S_NONFATAL);
        !           371:        } /* !(tape_dev) */
        !           372: 
        !           373: #endif
        !           374:        
        !           375:        /* append lines to /tmp/devices to pass device info to /etc/build.
        !           376:         * This file is read to build the commands for fdisk a bit later.
        !           377:         */
        !           378: 
        !           379:        if (bflag && !tape_dev) {
        !           380:                for (i = 0; i < 4; i++) {
        !           381:                        sprintf(cmd, "/bin/echo sd%dx sd%d%c %d %d >>/tmp/devices",
        !           382:                                id, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
        !           383:                        sys(cmd, S_NONFATAL);
        !           384:                }
        !           385:        }
        !           386: #endif
        !           387:        cls(0);
        !           388:        printf("%s device has been installed at id %d\n\n",
        !           389:          tape_dev ? "Tape" : "Disk", id);
        !           390: }
        !           391: 
        !           392:        /* At this point all SCSI id's attached to the host are known. */
        !           393: 
        !           394:        /*
        !           395:         * Ugly patching stuff specific to "ss" driver.
        !           396:         */
        !           397:        if (ss_dev) {
        !           398: 
        !           399:                /* "ss" device driver requires patching to work at all. */
        !           400:                sprintf (ss_patch,
        !           401:                         "NSDRIVE=0x%04x SS_INT=%d SS_BASE=0x%04x",
        !           402:                         nsdrive, ss_int, ss_base);
        !           403: 
        !           404:                /* for target kernel */
        !           405: 
        !           406:                idenable_dev ("ss");
        !           407: 
        !           408:                sprintf (buf, "unsigned int\tNSDRIVE = 0x%04x;", nsdrive);
        !           409:                cohtune_ent ("ss", "NSDRIVE", buf);
        !           410: 
        !           411:                sprintf (buf, "unsigned int\tSS_INT = %d;", ss_int);
        !           412:                cohtune_ent ("ss", "SS_INT", buf);
        !           413: 
        !           414:                sprintf (buf, "unsigned int\tSS_BASE = %d;", ss_base);
        !           415:                cohtune_ent ("ss", "SS_BASE", buf);
        !           416: 
        !           417:                /* for second boot kernel */
        !           418:                fp = fopen(PATCHFILE,"a");
        !           419: 
        !           420:                fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=sscon \n",
        !           421:                         SCSI_MAJOR * sizeof (DRV));
        !           422: 
        !           423:                fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
        !           424: 
        !           425:                fclose (fp);
        !           426: 
        !           427:                /* for first boot kernel */
        !           428: 
        !           429:                sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
        !           430:                sys (cmd, S_FATAL);
        !           431:                sprintf (cmd, "/conf/kpatch -v sscon:%d:in", SCSI_MAJOR);
        !           432:                sys (cmd, S_FATAL);
        !           433: 
        !           434:                /*
        !           435:                 * Allow patching of the loaded driver parameters.
        !           436:                 */
        !           437:                for (unit = 0; unit < 7; unit++) {
        !           438:                        if (nsdrive & (1 << unit)) {
        !           439:                                sprintf (cmd, "/etc/hdparms -%c%c %s/sd%dx",
        !           440:                                         'r', fut_dev ? 'f' : 's', dev, unit);
        !           441:                                sys (cmd, S_NONFATAL);
        !           442:                        }
        !           443:                }
        !           444:        } /* end of "ss" stuff */
        !           445: 
        !           446:        /*
        !           447:         * Ugly patching stuff specific to "aha154x" driver.
        !           448:         * At this point all SCSI id's attached to the host are known.
        !           449:         */
        !           450:        if (aha_dev) {
        !           451:                /*
        !           452:                 * Tandy Adaptec BIOS spoofs different head count than
        !           453:                 * Adaptec's Own Translation Mode.
        !           454:                 */
        !           455: 
        !           456:                sprintf (ss_patch, "SD_HDS=%d SDDMA=%d SDIRQ=%d SDBASE=0x%x ",
        !           457:                         sd_hds, sd_dma, sd_irq, sd_base);
        !           458: 
        !           459:                /* for target kernel */
        !           460: 
        !           461:                idenable_dev ("aha");
        !           462: 
        !           463:                sprintf (buf, "int\tSD_HDS = %d;", sd_hds);
        !           464:                cohtune_ent ("aha", "SD_HDS", buf);
        !           465: 
        !           466:                sprintf (buf, "int\tSDDMA = %d;", sd_dma);
        !           467:                cohtune_ent ("aha", "SDDMA", buf);
        !           468: 
        !           469:                sprintf (buf, "int\tSDIRQ = %d;", sd_irq);
        !           470:                cohtune_ent ("aha", "SDIRQ", buf);
        !           471: 
        !           472:                sprintf (buf, "int\tSDBASE = 0x%x;", sd_base);
        !           473:                cohtune_ent ("aha", "SDBASE", buf);
        !           474: 
        !           475:                /* for second boot kernel */
        !           476:                fp = fopen (PATCHFILE,"a");
        !           477: 
        !           478:                fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=sdcon\n",
        !           479:                         SCSI_MAJOR * sizeof (DRV));
        !           480: 
        !           481:                fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
        !           482: 
        !           483:                fclose (fp);
        !           484: 
        !           485:                /* for first boot kernel */
        !           486: 
        !           487:                sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
        !           488:                sys (cmd, S_FATAL);
        !           489:                sprintf (cmd, "/conf/kpatch -v sdcon:%d:in", SCSI_MAJOR);
        !           490:                sys (cmd, S_FATAL);
        !           491:        }
        !           492: 
        !           493:        /*
        !           494:         * Ugly patching stuff specific to "hai" driver.
        !           495:         * At this point all SCSI id's attached to the host are known.
        !           496:         */
        !           497:        if (hai_dev) {
        !           498:                /*
        !           499:                 * Tandy Adaptec BIOS spoofs different head count than
        !           500:                 * Adaptec's Own Translation Mode.
        !           501:                 */
        !           502:                sprintf (ss_patch, "AHADMACHAN=%d:s AHAINTR=%d:s "
        !           503:                                   "AHABASE=0x%x:s HAI_DISK=%d HAI_TAPE=%d ",
        !           504:                         sd_dma, sd_irq, sd_base, hai_disk, hai_tape);
        !           505: 
        !           506:                /* for target kernel */
        !           507: 
        !           508:                idenable_dev ("hai");
        !           509: 
        !           510:                sprintf (buf, "int\tAHADMACHAN = %d;", sd_dma);
        !           511:                cohtune_ent ("hai", "AHADMACHAN", buf);
        !           512: 
        !           513:                sprintf (buf, "int\tAHAINTR = %d;", sd_irq);
        !           514:                cohtune_ent ("hai", "AHAINTR", buf);
        !           515: 
        !           516:                sprintf (buf, "int\tAHABASE = %d;", sd_base);
        !           517:                cohtune_ent ("hai", "AHABASE", buf);
        !           518: 
        !           519:                sprintf (buf, "int\tHAI_DISK = %d;", hai_disk);
        !           520:                cohtune_ent ("hai", "HAI_DISK", buf);
        !           521: 
        !           522:                sprintf (buf, "int\tHAI_TAPE = %d;", hai_tape);
        !           523:                cohtune_ent ("hai", "HAI_TAPE", buf);
        !           524: 
        !           525:                /* for second boot kernel */
        !           526:                fp = fopen (PATCHFILE,"a");
        !           527: 
        !           528:                fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=scsicon \n",
        !           529:                         SCSI_MAJOR * sizeof (DRV));
        !           530: 
        !           531:                fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
        !           532: 
        !           533:                fclose (fp);
        !           534: 
        !           535:                /* for first boot kernel */
        !           536: 
        !           537:                sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
        !           538:                sys (cmd, S_FATAL);
        !           539:                sprintf (cmd, "/conf/kpatch -v scsicon:%d:in", SCSI_MAJOR);
        !           540:                sys (cmd, S_FATAL);
        !           541: 
        !           542:        } /* end of "hai" stuff */
        !           543: }
        !           544: 
        !           545: void
        !           546: at()
        !           547: {
        !           548:        unsigned char at_patch[80];
        !           549:        FILE *fp;
        !           550:        int at_poll;
        !           551:        char line[512];
        !           552:        int normal_at_poll;
        !           553:        int fl_dsk_ch_prob;
        !           554:        int use_ps1;
        !           555:        int at_drive_ct;
        !           556:        int y, z;                       /* dummy counters */
        !           557:        /* Normal vs. alternate polling. */
        !           558:        cls(0);
        !           559:        printf(
        !           560: "Most AT-compatible controllers work with NORMAL polling.\n\n"
        !           561: "Perstor controllers and some IDE hard drives require ALTERNATE polling.\n\n"
        !           562: "If you get \"<Watchdog Timeout>\" or \"at0:TO\" errors with normal polling,\n"
        !           563: "use alternate polling.\n\n");
        !           564: 
        !           565:        if (normal_at_poll = yes_no ("Use NORMAL polling")) {
        !           566:                strcpy (at_patch, "ATSREG=0x3F6 ");
        !           567:                at_poll = 0x3F6;
        !           568:        } else {
        !           569:                strcpy (at_patch, "ATSREG=0x1F7 ");
        !           570:                at_poll = 0x1F7;
        !           571:        }
        !           572:        cls(0);
        !           573:        printf("%s polling will be used.\n\n",
        !           574:          normal_at_poll ? "NORMAL" : "ALTERNATE");
        !           575: 
        !           576: /* Ask for the number of AT drives so that we add the proper number of
        !           577:  * AT drive device entries to the /tmp/devices file. When we return to build,
        !           578:  * we will eventually read the devices file to build our fdisk command.
        !           579:  *  Bob H. (8/10/93)
        !           580:  */
        !           581:        at_drive_ct = get_int(1, 2,"Enter number of non-SCSI hard drives:");
        !           582: 
        !           583: 
        !           584: /* now add the appropriate number of AT drives to /tmp/devics. This file will
        !           585:  * be read by build() later when generating an fdisk command.
        !           586:  * Bob H. (8/10/93)
        !           587:  */
        !           588:        if(bflag){
        !           589:                for(z = 0 ; z < at_drive_ct ; z++){
        !           590:                        for(y = 0 ; y <= 3 ; y++){
        !           591:                                sprintf(cmd,"/bin/echo at%dx at%d%c %d %d >> /tmp/devices",
        !           592:                                        z, z, ( 'a' + y ), AT_MAJOR, ((4 * z) + y));
        !           593:                                sys(cmd,S_FATAL);
        !           594:                        }
        !           595:                }
        !           596:        }
        !           597: 
        !           598:        /* Normal vs. PS1 hard disk counts. */
        !           599:        if (use_ps1 = yes_no(
        !           600:          "Are you installing on an IBM PS1 or ValuePoint?")) {
        !           601:                fl_dsk_ch_prob = 1;
        !           602:        } else {
        !           603:                fl_dsk_ch_prob = 0;
        !           604:        }
        !           605: 
        !           606:        /* for target kernel */
        !           607: 
        !           608:        idenable_dev ("at");
        !           609:        sprintf (line, "int\tATSREG = 0x%x;", at_poll);
        !           610:        cohtune_ent ("at", "ATSREG", line);
        !           611:        if (use_ps1)
        !           612:                idtune_var("AT_DRIVE_CT", at_drive_ct);
        !           613:        idtune_var("FL_DSK_CH_PROB", fl_dsk_ch_prob);
        !           614: 
        !           615:        /* for second boot kernel */
        !           616:        fp = fopen (PATCHFILE,"a");
        !           617:        fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=atcon \n",
        !           618:                 AT_MAJOR * sizeof (DRV));
        !           619:        fprintf (fp, "/conf/patch /mnt/coherent %s\n", at_patch);
        !           620:        fprintf (fp, "/conf/patch /mnt/coherent fl_dsk_ch_prob=%d\n",
        !           621:          fl_dsk_ch_prob);
        !           622:        if (use_ps1)
        !           623:                fprintf (fp, "/conf/patch /mnt/coherent at_drive_ct=%d\n",
        !           624:                  at_drive_ct);
        !           625:        fclose (fp);
        !           626: 
        !           627:        /* for first boot kernel */
        !           628: 
        !           629:        sprintf (cmd, "/conf/kpatch -v %s", at_patch);
        !           630:        sys (cmd, S_FATAL);
        !           631:        sprintf (cmd, "/conf/kpatch -v fl_dsk_ch_prob=%d", fl_dsk_ch_prob);
        !           632:        sys (cmd, S_FATAL);
        !           633:        if (use_ps1) {
        !           634:                sprintf (cmd, "/conf/kpatch -v at_drive_ct=%d", at_drive_ct);
        !           635:                sys (cmd, S_FATAL);
        !           636:        }
        !           637:        /* For PS1, this step must come AFTER at_drive_ct is fixed. */
        !           638:        sprintf (cmd, "/conf/kpatch -v atcon:%d:in", AT_MAJOR);
        !           639:        sys (cmd, S_FATAL);
        !           640: 
        !           641: }
        !           642: 
        !           643: /*
        !           644:  * floppy_tape:        add support for floppy tape (a really disgusting device)
        !           645:  *
        !           646:  *     1) give user some info regarding COH support for floppy tape
        !           647:  *     2) display a list of supported drives
        !           648:  *     3) query the user for type of drive
        !           649:  *     4) create device nodes for specified drive
        !           650:  *     5) (optional) test for which unit number the drive is seen as
        !           651:  */
        !           652: void
        !           653: floppy_tape()
        !           654: {
        !           655:        int     brand;          /* which brand of drive (from menu) */
        !           656:        int     i;              /* loop counter */
        !           657: 
        !           658:        cls(0);
        !           659:        printf(
        !           660: "The COHERENT system supports several brands of \"floppy tape backup\" drives,\n"
        !           661: "including QIC-40 and QIC-80 models from Archive, Colorado Memory Systems (CMS),\n"
        !           662: "Mountain, and Summit.\n\n"
        !           663: "Please specify the brand of floppy tape drive on this computer:\n\n"
        !           664: "\t0) Archive, Mountain, or Summit\n"
        !           665: "\t1) Colorado Memory Systems (CMS)\n"
        !           666: "\t2) Other\n\n"
        !           667:        );
        !           668:        brand = get_int(0, 2, "Enter drive type:");
        !           669:        if (brand == 2) {
        !           670:                printf(
        !           671: "\nYou have specified a brand of tape drive which is currently unsupported.\n"
        !           672:                );
        !           673:                return;
        !           674:        }
        !           675:        
        !           676:        /*
        !           677:         * now create the following nodes for the specified drive brand:
        !           678:         *       Rewind         No Rewind        Unit #
        !           679:         *      --------        ---------       ---------
        !           680:         *      DEV/rct0        DEV/nrct0       (unit #0)
        !           681:         *      DEV/rct1        DEV/nrct1       (unit #1)
        !           682:         *      DEV/rct2        DEV/nrct2       (unit #2)
        !           683:         *      DEV/rct3        DEV/nrct3       (unit #3)
        !           684:         *      DEV/rctss       DEV/nrctss      (soft select)
        !           685:         *
        !           686:         * where DEV is /mnt/dev if called from /etc/build and /dev otherwise.
        !           687:         */
        !           688:        for (i = 0; i <= 3; ++i) {
        !           689:                sprintf(cmd, "/etc/mknod -f %s/rct%d c %d %d",
        !           690:                        (bflag) ? "/mnt/dev" : "/dev", i, FL_MAJOR,
        !           691:                        FL_TAPE_MINOR(i, brand, FL_TAPE_HARD_SEL, FL_TAPE_REW));
        !           692:                sys(cmd, S_NONFATAL);
        !           693:                sprintf(cmd, "/etc/mknod -f %s/nrct%d c %d %d",
        !           694:                        (bflag) ? "/mnt/dev" : "/dev", i, FL_MAJOR,
        !           695:                        FL_TAPE_MINOR(i, brand, FL_TAPE_HARD_SEL, FL_TAPE_NOREW));
        !           696:                sys(cmd, S_NONFATAL);
        !           697:        }
        !           698:        sprintf(cmd, "/etc/mknod -f %s/rctss c %d %d",
        !           699:                (bflag) ? "/mnt/dev" : "/dev", FL_MAJOR,
        !           700:                FL_TAPE_MINOR(0, brand, FL_TAPE_SOFT_SEL, FL_TAPE_REW));
        !           701:        sys(cmd, S_NONFATAL);
        !           702:        sprintf(cmd, "/etc/mknod -f %s/nrctss c %d %d",
        !           703:                (bflag) ? "/mnt/dev" : "/dev", FL_MAJOR,
        !           704:                FL_TAPE_MINOR(0, brand, FL_TAPE_SOFT_SEL, FL_TAPE_NOREW));
        !           705:        sys(cmd, S_NONFATAL);
        !           706: }
        !           707: 
        !           708: /* end of mkdev.c */

unix.superglobalmegacorp.com

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