|
|
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.