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