|
|
1.1 ! root 1: /* ! 2: * mkdev.c ! 3: * 10/25/90 ! 4: * Allow the user to configure devices requiring loadable drivers. ! 5: * Uses common routines in build0.c: cc -o mkdev mkdev.c build0.c ! 6: * Usage: mkdev [ -bdv ] { scsi | at } ! 7: * Options: ! 8: * -b Use special processing when invoked from /etc/build ! 9: * -d Debug; echo commands without executing ! 10: * -v Verbose ! 11: * ! 12: * $Log: mkdev.c,v $ ! 13: * Revision 1.6 92/01/17 11:31:17 bin ! 14: * another hal update... looks like the final 321 ship version ! 15: * ! 16: * ! 17: * Roughly, do the following for device "foo" ( at | aha154x | ss ) ! 18: * ! 19: * cp /drv/foo /tmp/drv/foo ! 20: * make necessary patches "xxx" to /tmp/drv/foo ! 21: * if not "at" device ! 22: * make nodes (mknod -f) for the device ! 23: * if build mode (bflag) ! 24: * if rootdev ! 25: * append to LDKERFILE: ! 26: * HD=foo.a ! 27: * HDUNDEF="-u foocon_" ! 28: * HDPATCH="drvl_+xx0=foocon_" ! 29: * /etc/drvld -r /tmp/drv/foo ! 30: * append to PATCHFILE: ! 31: * cp /tmp/drv/foo /mnt/drv/foo ! 32: * if rootdev, also append to PATCHFILE: ! 33: * /conf/patch /mnt/coherent xxx ! 34: * else - not build mode ! 35: * display message saying patched driver is at /tmp/drv/foo ! 36: */ ! 37: ! 38: #include <stdio.h> ! 39: #include <sys/devices.h> ! 40: #include "build0.h" ! 41: ! 42: #define VERSION "V1.4" /* version number */ ! 43: #define USAGEMSG "Usage:\t/etc/mkdev [ -bdv ] [ scsi | at ]\n" ! 44: #define BUFLEN 50 ! 45: #define AHA_HDS 64 ! 46: #define AHA_DMA 5 ! 47: #define AHA_IRQ 11 ! 48: #define AHA_BASE 0x330 ! 49: #define TANDY_HDS 16 ! 50: ! 51: /* Forward. */ ! 52: void scsi(); ! 53: void at(); ! 54: ! 55: /* Globals. */ ! 56: int bflag; /* Invoked from /etc/build. */ ! 57: ! 58: main(argc, argv) int argc; char *argv[]; ! 59: { ! 60: register char *s; ! 61: ! 62: argv0 = argv[0]; ! 63: usagemsg = USAGEMSG; ! 64: if (argc > 1 && argv[1][0] == '-') { ! 65: for (s = &argv[1][1]; *s; ++s) { ! 66: switch(*s) { ! 67: case 'b': ++bflag; break; ! 68: case 'd': ++dflag; break; ! 69: case 'v': ++vflag; break; ! 70: case 'V': ! 71: fprintf(stderr, "mkdev: %s\n", VERSION); ! 72: break; ! 73: default: usage(); break; ! 74: } ! 75: } ! 76: --argc; ! 77: ++argv; ! 78: } ! 79: ! 80: if (argc == 1) { ! 81: usage(); ! 82: } else { ! 83: /* Do specified things. */ ! 84: while (--argc > 0) { ! 85: if (strcmp(argv[1], "scsi") == 0) ! 86: scsi(); ! 87: else if (strcmp(argv[1], "at") == 0) ! 88: at(); ! 89: else ! 90: usage(); ! 91: ++argv; ! 92: } ! 93: } ! 94: exit(0); ! 95: } ! 96: ! 97: void ! 98: scsi() ! 99: { ! 100: char *dev, *coh; ! 101: int i, id, lun, rootflag; ! 102: int ss_dev = 0; ! 103: int fut_dev = 0; ! 104: short nsdrive = 0; ! 105: int ss_int = 5, new_int; ! 106: unsigned int ss_base = 0xCA00, new_base; ! 107: unsigned char ss_patch[80], buf[BUFLEN]; ! 108: FILE *fp; ! 109: int aha_dev = 0, sd_hds = AHA_HDS, sd_dma = AHA_DMA; ! 110: int sd_irq = AHA_IRQ, sd_base = AHA_BASE; ! 111: ! 112: rootflag = 0; ! 113: #if 0 ! 114: /* For future use, not much use with only one supported host adapter. */ ! 115: again: ! 116: #endif ! 117: cls(0); ! 118: printf( ! 119: "COHERENT currently supports the following SCSI host adapters:\n" ! 120: "\n" ! 121: "(1) Adaptec AHA-154x series\n" ! 122: "(2) Seagate ST01 or ST02\n" ! 123: "(3) Future Domain TMC-845/850/860/875/885\n" ! 124: "(4) Future Domain TMC-840/841/880/881\n" ! 125: "\n" ! 126: ); ! 127: retry: ! 128: switch(get_int(0, 4, "Enter a number from the above list or 0 to exit:")) { ! 129: case 0: ! 130: return; ! 131: case 1: ! 132: aha_dev = 1; ! 133: coh = "aha"; ! 134: break; ! 135: case 2: ! 136: ss_dev = 1; ! 137: coh = "ss"; ! 138: break; ! 139: case 3: ! 140: ss_dev = 1; ! 141: fut_dev = 1; ! 142: coh = "ss"; ! 143: nsdrive |= 0x8000; ! 144: break; ! 145: case 4: ! 146: ss_dev = 1; ! 147: fut_dev = 1; ! 148: coh = "ss"; ! 149: nsdrive |= 0x4000; ! 150: break; ! 151: default: ! 152: goto retry; /* should never happen */ ! 153: } ! 154: ! 155: /* Make /tmp/drv if not already there. */ ! 156: if ((i = is_dir("/tmp/drv")) == 0) ! 157: sys("/bin/mkdir /tmp/drv", S_FATAL); ! 158: else if (i == -1) ! 159: fatal("/tmp/drv is not a directory"); ! 160: ! 161: /* ! 162: * If Adaptec, allow patching host adapter variables SD_HDS ! 163: * for Tandy variant of host BIOS. ! 164: */ ! 165: if (aha_dev) { ! 166: printf("\nMost versions of the Adaptec BIOS use 64-head translation mode.\n"); ! 167: printf("A few, including some Tandy variants, use 16-head translation mode.\n\n"); ! 168: if (!yes_no("Do you want 64-head translation mode")) ! 169: sd_hds = TANDY_HDS; ! 170: printf("\nWhich IRQ does the host adapter use (9/10/11/12/14/15) [%d]? ", ! 171: sd_irq); ! 172: for (;;) { ! 173: new_int = sd_irq; ! 174: fgets(buf, BUFLEN, stdin); ! 175: sscanf(buf, "%d", &new_int); ! 176: switch(new_int) { ! 177: case 9: ! 178: case 10: ! 179: case 11: ! 180: case 12: ! 181: case 14: ! 182: case 15: ! 183: goto ok_sdirq; ! 184: } ! 185: printf("Type 9,10,11,12,14,15 or just <Enter> for the default: "); ! 186: } /* endwhile */ ! 187: ok_sdirq: ! 188: sd_irq = new_int; ! 189: ! 190: printf("\nWhat is the hexadecimal host adapter base port address \n"); ! 191: printf(" (130/134/230/234/330/334) [%x]? ", sd_base); ! 192: for (;;) { ! 193: new_int = sd_base; ! 194: fgets(buf, BUFLEN, stdin); ! 195: sscanf(buf, "%x", &new_int); ! 196: switch(new_int) { ! 197: case 0x130: ! 198: case 0x134: ! 199: case 0x230: ! 200: case 0x234: ! 201: case 0x330: ! 202: case 0x334: ! 203: goto ok_sdbase; ! 204: } ! 205: printf("Type 130,134,230,234,330,334 or just <Enter> for the default: "); ! 206: } /* endfor */ ! 207: ok_sdbase: ! 208: sd_base = new_int; ! 209: ! 210: printf("\nWhich DMA channel does the host adapter use (0/5/6/7) [%d]? ", ! 211: sd_dma); ! 212: for (;;) { ! 213: new_int = sd_dma; ! 214: fgets(buf, BUFLEN, stdin); ! 215: sscanf(buf, "%d", &new_int); ! 216: if (new_int != 0 && new_int != 5 ! 217: && new_int != 6 && new_int != 7) ! 218: printf("Type 0,5,6,7 or just <Enter> for the default: "); ! 219: else ! 220: break; ! 221: } /* endwhile */ ! 222: sd_dma = new_int; ! 223: } ! 224: ! 225: /* ! 226: * If Seagate or Future Domain, allow patching host adapter ! 227: * variables SS_INT and SS_BASE. ! 228: */ ! 229: if (ss_dev) { ! 230: printf("\nPlease refer to the installation guide for your host adapter.\n"); ! 231: ! 232: /* Get value to patch for SS_INT */ ! 233: printf("\nWhich IRQ number does the host adapter use [%d]? ", ss_int); ! 234: while (1) { ! 235: new_int = ss_int; ! 236: fgets(buf, BUFLEN, stdin); ! 237: sscanf(buf, "%d", &new_int); ! 238: if (new_int < 3 || new_int > 15) ! 239: printf("Type a number between 3 and 15 or just <Enter> for the default: "); ! 240: else ! 241: break; ! 242: } /* endwhile */ ! 243: ss_int = new_int; ! 244: ! 245: /* Get value to patch for SS_BASE */ ! 246: printf("Your host adapter is configured for a base segment address. Possible\n"); ! 247: printf("values are: C800, CA00, CC00, CE00, DC00, and DE00.\n"); ! 248: printf("What is your 4-digit hexadecimal base address [%04X]? ", ss_base); ! 249: while (1) { ! 250: new_base = ss_base; ! 251: fgets(buf, BUFLEN, stdin); ! 252: sscanf(buf, "%x", &new_base); ! 253: if (new_base < 0xC800 || new_base > 0xDE00) ! 254: printf("Type a number between C800 and DE00 or just <Enter> for the default: "); ! 255: else ! 256: break; ! 257: } /* endwhile */ ! 258: ss_base = new_base; ! 259: } ! 260: ! 261: /* ! 262: * Set rootflag if root partition is on SCSI device. ! 263: * If using both AT and SCSI devices, write to drvld.all for ! 264: * non-root device. ! 265: */ ! 266: if (bflag) { ! 267: cls(0); ! 268: if (yes_no( ! 269: "Does your computer system include both a standard AT-type hard disk\n" ! 270: "and a SCSI hard disk" )) { ! 271: if (yes_no( ! 272: "Will the COHERENT root partition be on this SCSI device")) { ! 273: ++rootflag; ! 274: sys("/bin/echo /etc/drvld -r /drv/at >> /tmp/drvld.all", S_FATAL); ! 275: } else { /* root is on "at" device */ ! 276: sprintf(cmd, "/bin/echo /etc/drvld -r /drv/%s >> /tmp/drvld.all", ! 277: (aha_dev)?"aha154x":"ss"); ! 278: sys(cmd, S_FATAL); ! 279: } ! 280: } else { /* SCSI-only system */ ! 281: ++rootflag; ! 282: } ! 283: } ! 284: ! 285: /* Make device nodes. */ ! 286: cls(0); ! 287: printf( ! 288: "You must specify a SCSI-ID (0 through 7) for each SCSI hard disk device.\n" ! 289: "Each SCSI hard disk device can contain up to four partitions.\n\n" ! 290: ); ! 291: ! 292: newdev: ! 293: id = get_int(0, 7, "Enter the SCSI-ID:"); ! 294: #if 1 ! 295: lun = 0; ! 296: nsdrive |= (1 << id); ! 297: #else ! 298: lun = get_int(0, 3, "Enter the LUN:"); ! 299: #endif ! 300: ! 301: /* Make /tmp/dev if bflag. */ ! 302: if (bflag) { ! 303: if ((i = is_dir("/tmp/dev")) == 0) ! 304: sys("/bin/mkdir /tmp/dev", S_FATAL); ! 305: else if (i == -1) ! 306: fatal("/tmp/dev is not a directory"); ! 307: } ! 308: dev = (bflag) ? "/tmp/dev" : "/dev"; ! 309: ! 310: /* Make the cooked devices. */ ! 311: for (i = 0; i < 4; i++) { ! 312: sprintf(cmd, "/etc/mknod -f %s/sd%d%c b %d %d", ! 313: dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i)); ! 314: sys(cmd, S_NONFATAL); ! 315: } ! 316: sprintf(cmd, "/etc/mknod -f %s/sd%dx b %d %d", ! 317: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0)); ! 318: sys(cmd, S_NONFATAL); ! 319: ! 320: /* Make the raw devices. */ ! 321: for (i = 0; i < 4; i++) { ! 322: sprintf(cmd, "/etc/mknod -f %s/rsd%d%c c %d %d", ! 323: dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i)); ! 324: sys(cmd, S_NONFATAL); ! 325: } ! 326: sprintf(cmd, "/etc/mknod -f %s/rsd%dx c %d %d", ! 327: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0)); ! 328: sys(cmd, S_NONFATAL); ! 329: ! 330: /* Set the device permissions. */ ! 331: sprintf(cmd, "/bin/chmod 0600 %s/sd* %s/rsd*", dev, dev); ! 332: sys(cmd, S_NONFATAL); ! 333: sprintf(cmd, "/bin/chown sys %s/sd*[a-d] %s/rsd*[a-d]", dev, dev); ! 334: sys(cmd, S_NONFATAL); ! 335: sprintf(cmd, "/bin/chgrp sys %s/sd*[a-d] %s/rsd*[a-d]", dev, dev); ! 336: sys(cmd, S_NONFATAL); ! 337: sprintf(cmd, "/bin/chown root %s/sd*x %s/rsd*x", dev, dev); ! 338: sys(cmd, S_NONFATAL); ! 339: sprintf(cmd, "/bin/chgrp root %s/sd*x %s/rsd*x", dev, dev); ! 340: sys(cmd, S_NONFATAL); ! 341: ! 342: /* Append lines to /tmp/devices to pass device info to /etc/build. */ ! 343: if (bflag) { ! 344: for (i = 0; i < 4; i++) { ! 345: sprintf(cmd, "/bin/echo sd%dx sd%d%c %d %d >>/tmp/devices", ! 346: id, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i)); ! 347: sys(cmd, S_NONFATAL); ! 348: } ! 349: } ! 350: if (yes_no("Do you have another SCSI hard disk device on this host adapter")) ! 351: goto newdev; ! 352: ! 353: /* ! 354: * Ugly patching stuff specific to "ss" driver. ! 355: * At this point all SCSI id's attached to the host are known. ! 356: */ ! 357: if (ss_dev) { ! 358: int unit; ! 359: ! 360: /* "ss" device driver requires patching to work at all. */ ! 361: sprintf(ss_patch, ! 362: "NSDRIVE_=0x%04x SS_INT_=%d SS_BASE_=0x%04x", ! 363: nsdrive, ss_int, ss_base); ! 364: sys("/bin/cp /drv/ss /tmp/drv/ss", S_FATAL); ! 365: sprintf(cmd, "/conf/patch /tmp/drv/ss %s", ss_patch); ! 366: sys(cmd, S_FATAL); ! 367: if (bflag) { ! 368: if (rootflag) { ! 369: fp = fopen(LDKERFILE, "a"); ! 370: fprintf(fp, "HD=ss.a\n"); ! 371: fprintf(fp, "HDUNDEF=\"-u sscon_\"\n"); ! 372: fprintf(fp, "HDPATCH=\"drvl_+130=sscon_\"\n"); ! 373: fclose(fp); ! 374: } ! 375: sys("/etc/drvld -r /tmp/drv/ss", S_FATAL); ! 376: fp = fopen(PATCHFILE, "a"); ! 377: fprintf(fp, "/conf/patch /mnt/drv/ss %s\n", ss_patch); ! 378: if (rootflag) ! 379: fprintf(fp, ! 380: "/conf/patch /mnt/coherent %s\n", ss_patch); ! 381: fclose(fp); ! 382: /* ! 383: * Allow patching of the loaded driver parameters. ! 384: */ ! 385: for (unit = 0; unit < 7; unit++) ! 386: if (nsdrive & (1<<unit)) { ! 387: sprintf(cmd, ! 388: "/etc/hdparms -%c%c %s/sd%dx", ! 389: (rootflag)?'r':'b', ! 390: (fut_dev)?'f':'s', dev, unit); ! 391: sys(cmd, S_NONFATAL); ! 392: } ! 393: } else ! 394: printf("Patched driver at /tmp/drv/ss\n"); ! 395: ! 396: } /* end of "ss" stuff */ ! 397: ! 398: /* ! 399: * Ugly patching stuff specific to "aha154x" driver. ! 400: * At this point all SCSI id's attached to the host are known. ! 401: */ ! 402: if (aha_dev) { ! 403: /* ! 404: * Tandy Adaptec BIOS spoofs different head count than ! 405: * Adaptec's Own Translation Mode. ! 406: */ ! 407: sprintf(ss_patch, ! 408: "SD_HDS_=%d SDDMA_=%d SDIRQ_=%d SDBASE_=0x%x ", ! 409: sd_hds, sd_dma, sd_irq, sd_base); ! 410: sys("/bin/cp /drv/aha154x /tmp/drv/aha154x", S_FATAL); ! 411: sprintf(cmd, "/conf/patch /tmp/drv/aha154x %s", ss_patch); ! 412: sys(cmd, S_FATAL); ! 413: if (bflag) { ! 414: if (rootflag) { ! 415: fp = fopen(LDKERFILE, "a"); ! 416: fprintf(fp, "HD=aha154x.a\n"); ! 417: fprintf(fp, "HDUNDEF=\"-u sdcon_\"\n"); ! 418: fprintf(fp, "HDPATCH=\"drvl_+130=sdcon_\"\n"); ! 419: fclose(fp); ! 420: } ! 421: sys("/etc/drvld -r /tmp/drv/aha154x", S_FATAL); ! 422: fp = fopen(PATCHFILE, "a"); ! 423: fprintf(fp, "/conf/patch /mnt/drv/aha154x %s\n", ! 424: ss_patch); ! 425: if (rootflag) ! 426: fprintf(fp, ! 427: "/conf/patch /mnt/coherent %s\n", ss_patch); ! 428: fclose(fp); ! 429: } else ! 430: printf("Patched driver at /tmp/drv/aha154x\n"); ! 431: } /* end of "aha154x" stuff */ ! 432: ! 433: #if 0 ! 434: if (yes_no("Is there another SCSI host adapter in your system")) ! 435: goto again; ! 436: #endif ! 437: } ! 438: ! 439: void ! 440: at() ! 441: { ! 442: unsigned char at_patch[80]; ! 443: FILE *fp; ! 444: int rootflag = 0; ! 445: int i; ! 446: ! 447: /* Make /tmp/drv if not there. */ ! 448: if ((i = is_dir("/tmp/drv")) == 0) ! 449: sys("/bin/mkdir /tmp/drv", S_FATAL); ! 450: else if (i == -1) ! 451: fatal("/tmp/drv is not a directory"); ! 452: ! 453: cls(0); ! 454: sys("/bin/cp /drv/at /tmp/drv/at", S_FATAL); ! 455: printf( ! 456: "Most AT-compatible controllers work with NORMAL polling.\n\n" ! 457: "Perstor controllers and some IDE hard drives require ALTERNATE polling.\n\n" ! 458: "If you get \"<Watchdog Timeout>\" or \"at0:TO\" errors with normal polling,\n" ! 459: "use alternate polling.\n\n"); ! 460: ! 461: if (yes_no("Use ALTERNATE polling")) ! 462: strcpy(at_patch, "ATSREG_=0x1F7 "); ! 463: else ! 464: strcpy(at_patch, "ATSREG_=0x3F6 "); ! 465: sprintf(cmd, "/conf/patch /tmp/drv/at %s", at_patch); ! 466: sys(cmd, S_FATAL); ! 467: ! 468: if (bflag){ ! 469: if (yes_no( ! 470: "Will the COHERENT root partition be on an AT-type (non-SCSI) drive")) { ! 471: ++rootflag; ! 472: fp = fopen(LDKERFILE, "a"); ! 473: fprintf(fp, "HD=at.a\n"); ! 474: fprintf(fp, "HDUNDEF=\"-u atcon_\"\n"); ! 475: fprintf(fp, "HDPATCH=\"drvl_+110=atcon_\"\n"); ! 476: fclose(fp); ! 477: } ! 478: sys("/etc/drvld -r /tmp/drv/at", S_FATAL); ! 479: fp = fopen(PATCHFILE, "a"); ! 480: fprintf(fp, "/conf/patch /mnt/drv/at %s\n", at_patch); ! 481: if (rootflag) ! 482: fprintf(fp, ! 483: "/conf/patch /mnt/coherent %s\n", at_patch); ! 484: fclose(fp); ! 485: } else ! 486: printf("Patched driver at /tmp/drv/at\n"); ! 487: } ! 488: /* end of mkdev.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.