* Copyright (c) 1980 Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)mkioconf.c 5.30 (Berkeley) %G%";
* build the ioconf.c file
register struct device
*dp
, *mp
, *np
;
register int uba_n
, slave
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, "#include \"vax/include/pte.h\"\n");
fprintf(fp
, "#include \"sys/param.h\"\n");
fprintf(fp
, "#include \"sys/buf.h\"\n");
fprintf(fp
, "#include \"sys/map.h\"\n");
fprintf(fp
, "#include \"vax/mba/mbavar.h\"\n");
fprintf(fp
, "#include \"vax/uba/ubavar.h\"\n\n");
fprintf(fp
, "#define C (caddr_t)\n\n");
* First print the mba initialization structures
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || mp
== TO_NEXUS
||
fprintf(fp
, "extern struct mba_driver %sdriver;\n",
fprintf(fp
, "\nstruct mba_device mbdinit[] = {\n");
fprintf(fp
, "\t/* Device, Unit, Mba, Drive, Dk */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0 ||
mp
== TO_NEXUS
|| !eq(mp
->d_name
, "mba"))
printf("can't specify csr address on mba for %s%d\n",
printf("can't specify vector for %s%d on mba\n",
if (dp
->d_drive
== UNKNOWN
) {
printf("drive not specified for %s%d\n",
if (dp
->d_slave
!= UNKNOWN
) {
printf("can't specify slave number for %s%d\n",
fprintf(fp
, "\t{ &%sdriver, %d, %s,",
dp
->d_name
, dp
->d_unit
, qu(mp
->d_unit
));
fprintf(fp
, " %s, %d },\n",
qu(dp
->d_drive
), dp
->d_dk
);
fprintf(fp
, "\t0\n};\n\n");
* Print the mbsinit structure
* Driver Controller Unit Slave
fprintf(fp
, "struct mba_slave mbsinit [] = {\n");
fprintf(fp
, "\t/* Driver, Ctlr, Unit, Slave */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
* All slaves are connected to something which
* is connected to the massbus.
if ((mp
= dp
->d_conn
) == 0 || mp
== TO_NEXUS
)
if (np
== 0 || np
== TO_NEXUS
||
fprintf(fp
, "\t{ &%sdriver, %s",
mp
->d_name
, qu(mp
->d_unit
));
fprintf(fp
, ", %2d, %s },\n",
dp
->d_unit
, qu(dp
->d_slave
));
fprintf(fp
, "\t0\n};\n\n");
* Now generate interrupt vectors for the unibus
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || mp
== TO_NEXUS
||
(!eq(mp
->d_name
, "uba") && !eq(mp
->d_name
, "bi")))
"extern struct uba_driver %sdriver;\n",
fprintf(fp
, "X%s%d()", ip
->id
, dp
->d_unit
);
fprintf(fp
, "int\t (*%sint%d[])() = { ", dp
->d_name
,
fprintf(fp
, "X%s%d", ip
->id
, dp
->d_unit
);
fprintf(fp
, ", 0 } ;\n");
fprintf(fp
, "\nstruct uba_ctlr ubminit[] = {\n");
fprintf(fp
, "/*\t driver,\tctlr,\tubanum,\talive,\tintr,\taddr */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_type
!= CONTROLLER
|| mp
== TO_NEXUS
|| mp
== 0 ||
printf("must specify vector for %s%d\n",
printf("must specify csr address for %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives need their own entries; dont ");
printf("specify drive or slave for %s%d\n",
printf("controllers (e.g. %s%d) ",
printf("don't have flags, only devices do\n");
"\t{ &%sdriver,\t%d,\t%s,\t0,\t%sint%d, C 0%o },\n",
dp
->d_name
, dp
->d_unit
, qu(mp
->d_unit
),
dp
->d_name
, dp
->d_unit
, dp
->d_addr
);
fprintf(fp
, "\t0\n};\n");
fprintf(fp
, "\nstruct uba_device ubdinit[] = {\n");
"\t/* driver, unit, ctlr, ubanum, slave, intr, addr, dk, flags*/\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| dp
->d_type
!= DEVICE
|| mp
== 0 ||
mp
== TO_NEXUS
|| mp
->d_type
== MASTER
||
if (np
!= 0 && np
!= TO_NEXUS
&& eq(np
->d_name
, "mba"))
if (eq(mp
->d_name
, "uba")) {
printf("must specify vector for device %s%d\n",
printf("must specify csr for device %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives/slaves can be specified ");
printf("only for controllers, ");
printf("not for device %s%d\n",
if ((np
= mp
->d_conn
) == 0) {
printf("%s%d isn't connected to anything ",
printf(", so %s%d is unattached\n",
if (dp
->d_drive
== UNKNOWN
) {
printf("must specify ``drive number'' ");
printf("for %s%d\n", dp
->d_name
, dp
->d_unit
);
/* NOTE THAT ON THE UNIBUS ``drive'' IS STORED IN */
/* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */
if (dp
->d_slave
!= UNKNOWN
) {
printf("slave numbers should be given only ");
printf("for massbus tapes, not for %s%d\n",
printf("interrupt vectors should not be ");
printf("given for drive %s%d\n",
printf("csr addresses should be given only ");
printf("on controllers, not on %s%d\n",
fprintf(fp
, "\t{ &%sdriver, %2d, %s,",
eq(mp
->d_name
, "uba") ? dp
->d_name
: mp
->d_name
, dp
->d_unit
,
eq(mp
->d_name
, "uba") ? " -1" : qu(mp
->d_unit
));
fprintf(fp
, " %s, %2d, %s, C 0%-6o, %d, 0x%x },\n",
qu(uba_n
), slave
, intv(dp
), dp
->d_addr
, dp
->d_dk
,
fprintf(fp
, "\t0\n};\n");
register struct device
*dp
, *mp
, *np
;
register int vba_n
, slave
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, "#include \"sys/param.h\"\n");
fprintf(fp
, "#include \"tahoe/include/pte.h\"\n");
fprintf(fp
, "#include \"sys/buf.h\"\n");
fprintf(fp
, "#include \"sys/map.h\"\n");
fprintf(fp
, "#include \"tahoe/vba/vbavar.h\"\n");
fprintf(fp
, "#define C (caddr_t)\n\n");
* Now generate interrupt vectors for the versabus
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || mp
== TO_NEXUS
|| !eq(mp
->d_name
, "vba"))
"extern struct vba_driver %sdriver;\n",
fprintf(fp
, "X%s%d()", ip
->id
, dp
->d_unit
);
fprintf(fp
, "int\t (*%sint%d[])() = { ", dp
->d_name
,
fprintf(fp
, "X%s%d", ip
->id
, dp
->d_unit
);
fprintf(fp
, ", 0 } ;\n");
} else if (dp
->d_type
== DRIVER
) /* devices w/o interrupts */
"extern struct vba_driver %sdriver;\n",
fprintf(fp
, "\nstruct vba_ctlr vbminit[] = {\n");
fprintf(fp
, "/*\t driver,\tctlr,\tvbanum,\talive,\tintr,\taddr */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_type
!= CONTROLLER
|| mp
== TO_NEXUS
|| mp
== 0 ||
printf("must specify vector for %s%d\n",
printf("must specify csr address for %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives need their own entries; dont ");
printf("specify drive or slave for %s%d\n",
printf("controllers (e.g. %s%d) ",
printf("don't have flags, only devices do\n");
"\t{ &%sdriver,\t%d,\t%s,\t0,\t%sint%d, C 0x%x },\n",
dp
->d_name
, dp
->d_unit
, qu(mp
->d_unit
),
dp
->d_name
, dp
->d_unit
, dp
->d_addr
);
fprintf(fp
, "\t0\n};\n");
fprintf(fp
, "\nstruct vba_device vbdinit[] = {\n");
"\t/* driver, unit, ctlr, vbanum, slave, intr, addr, dk, flags*/\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| dp
->d_type
!= DEVICE
|| mp
== 0 ||
mp
== TO_NEXUS
|| mp
->d_type
== MASTER
||
if (np
!= 0 && np
!= TO_NEXUS
&& eq(np
->d_name
, "mba"))
if (eq(mp
->d_name
, "vba")) {
"Warning, no interrupt vector specified for device %s%d\n",
printf("must specify csr for device %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives/slaves can be specified ");
printf("only for controllers, ");
printf("not for device %s%d\n",
if ((np
= mp
->d_conn
) == 0) {
printf("%s%d isn't connected to anything ",
printf(", so %s%d is unattached\n",
if (dp
->d_drive
== UNKNOWN
) {
printf("must specify ``drive number'' ");
printf("for %s%d\n", dp
->d_name
, dp
->d_unit
);
/* NOTE THAT ON THE UNIBUS ``drive'' IS STORED IN */
/* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */
if (dp
->d_slave
!= UNKNOWN
) {
printf("slave numbers should be given only ");
printf("for massbus tapes, not for %s%d\n",
printf("interrupt vectors should not be ");
printf("given for drive %s%d\n",
printf("csr addresses should be given only ");
printf("on controllers, not on %s%d\n",
fprintf(fp
, "\t{ &%sdriver, %2d, %s,",
eq(mp
->d_name
, "vba") ? dp
->d_name
: mp
->d_name
, dp
->d_unit
,
eq(mp
->d_name
, "vba") ? " -1" : qu(mp
->d_unit
));
fprintf(fp
, " %s, %2d, %s, C 0x%-6x, %d, 0x%x },\n",
qu(vba_n
), slave
, intv(dp
), dp
->d_addr
, dp
->d_dk
,
fprintf(fp
, "\t0\n};\n");
#if MACHINE_HP300 || MACHINE_LUNA68K
register struct device
*dp
, *mp
;
register int hpib
, slave
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, "#include \"sys/param.h\"\n");
fprintf(fp
, "#include \"sys/buf.h\"\n");
fprintf(fp
, "#include \"sys/map.h\"\n");
if (machine
== MACHINE_HP300
)
fprintf(fp
, "#include \"hp/dev/device.h\"\n\n");
fprintf(fp
, "#include \"luna68k/dev/device.h\"\n\n");
fprintf(fp
, "#define C (caddr_t)\n");
fprintf(fp
, "#define D (struct driver *)\n\n");
* First print the hpib controller initialization structures
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0)
fprintf(fp
, "extern struct driver %sdriver;\n", dp
->d_name
);
fprintf(fp
, "\nstruct hp_ctlr hp_cinit[] = {\n");
fprintf(fp
, "/*\tdriver,\t\tunit,\talive,\taddr,\tflags */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
||
dp
->d_type
!= MASTER
&& dp
->d_type
!= CONTROLLER
)
printf("%s%s must be attached to an sc (nexus)\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("can't specify drive/slave for %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
"\t{ &%sdriver,\t%d,\t0,\tC 0x%x,\t0x%x },\n",
dp
->d_name
, dp
->d_unit
, dp
->d_addr
, dp
->d_flags
);
fprintf(fp
, "\t0\n};\n");
fprintf(fp
, "\nstruct hp_device hp_dinit[] = {\n");
"/*driver,\tcdriver,\tunit,\tctlr,\tslave,\taddr,\tdk,\tflags*/\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || dp
->d_type
!= DEVICE
|| hpbadslave(mp
, dp
))
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("can't specify drive/slave for %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
printf("can't specify sc for device %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (mp
->d_type
== CONTROLLER
) {
if (dp
->d_drive
== UNKNOWN
) {
printf("must specify drive for %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (dp
->d_slave
== UNKNOWN
) {
printf("must specify slave for %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
fprintf(fp
, "{ &%sdriver,\t", dp
->d_name
);
fprintf(fp
, "&%sdriver,", mp
->d_name
);
fprintf(fp
, "\t%d,\t%d,\t%d,\tC 0x%x,\t%d,\t0x%x },\n",
dp
->d_addr
, dp
->d_dk
, dp
->d_flags
);
#define ishpibdev(n) (eq(n,"rd") || eq(n,"ct") || eq(n,"mt") || eq(n,"ppi"))
#define isscsidev(n) (eq(n,"sd") || eq(n,"st") || eq(n,"ac"))
register struct device
*dp
, *mp
;
if (mp
== TO_NEXUS
&& ishpibdev(dp
->d_name
) ||
mp
!= TO_NEXUS
&& eq(mp
->d_name
, "hpib") &&
!ishpibdev(dp
->d_name
)) {
printf("%s%s must be attached to an hpib\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (mp
== TO_NEXUS
&& isscsidev(dp
->d_name
) ||
mp
!= TO_NEXUS
&& eq(mp
->d_name
, "scsi") &&
!isscsidev(dp
->d_name
)) {
printf("%s%s must be attached to a scsi\n",
dp
->d_name
, wnum(dp
->d_unit
));
register struct device
*dp
, *mp
, *np
;
register int uba_n
, slave
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, " * ioconf.c \n");
fprintf(fp
, " * Generated by config program\n");
fprintf(fp
, "#include \"machine/pte.h\"\n");
fprintf(fp
, "#include \"sys/param.h\"\n");
fprintf(fp
, "#include \"sys/buf.h\"\n");
fprintf(fp
, "#include \"sys/map.h\"\n");
fprintf(fp
, "#define V(s) __CONCAT(V,s)\n");
fprintf(fp
, "#define C (caddr_t)\n\n");
* First print the isa initialization structures
fprintf(fp
, " * ISA devices\n");
fprintf(fp
, "#include \"i386/isa/isa_device.h\"\n");
fprintf(fp
, "#include \"i386/isa/isa.h\"\n");
fprintf(fp
, "#include \"i386/isa/icu.h\"\n\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || mp
== TO_NEXUS
||
"extern struct isa_driver %sdriver; extern V(%s%d)();\n",
dp
->d_name
, dp
->d_name
, dp
->d_unit
);
fprintf(fp
, "\nstruct isa_device isa_devtab_bio[] = {\n");
/* driver iobase irq drq maddr msiz intr unit */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0 ||
mp
== TO_NEXUS
|| !eq(mp
->d_name
, "isa"))
if (!eq(dp
->d_mask
, "bio")) continue;
fprintf(fp
, "{ &%sdriver, %8.8s,", dp
->d_name
, dp
->d_port
);
fprintf(fp
, "{ &%sdriver, 0x%03x,", dp
->d_name
, dp
->d_portn
);
fprintf(fp
, " %5.5s, %2d, C 0x%05X, %5d, V(%s%d), %2d },\n",
sirq(dp
->d_irq
), dp
->d_drq
, dp
->d_maddr
,
dp
->d_msize
, dp
->d_name
, dp
->d_unit
, dp
->d_unit
);
fprintf(fp
, "struct isa_device isa_devtab_tty[] = {\n");
/* driver iobase irq drq maddr msiz intr unit */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0 ||
mp
== TO_NEXUS
|| !eq(mp
->d_name
, "isa"))
if (!eq(dp
->d_mask
, "tty")) continue;
fprintf(fp
, "{ &%sdriver, %8.8s,", dp
->d_name
, dp
->d_port
);
fprintf(fp
, "{ &%sdriver, 0x%03x,", dp
->d_name
, dp
->d_portn
);
fprintf(fp
, " %5.5s, %2d, C 0x%05X, %5d, V(%s%d), %2d },\n",
sirq(dp
->d_irq
), dp
->d_drq
, dp
->d_maddr
,
dp
->d_msize
, dp
->d_name
, dp
->d_unit
, dp
->d_unit
);
fprintf(fp
, "0\n};\n\n");
fprintf(fp
, "struct isa_device isa_devtab_net[] = {\n");
/* driver iobase irq drq maddr msiz intr unit */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0 ||
mp
== TO_NEXUS
|| !eq(mp
->d_name
, "isa"))
if (!eq(dp
->d_mask
, "net")) continue;
fprintf(fp
, "{ &%sdriver, %8.8s,", dp
->d_name
, dp
->d_port
);
fprintf(fp
, "{ &%sdriver, 0x%03x,", dp
->d_name
, dp
->d_portn
);
fprintf(fp
, " %5.5s, %2d, C 0x%05X, %5d, V(%s%d), %2d },\n",
sirq(dp
->d_irq
), dp
->d_drq
, dp
->d_maddr
,
dp
->d_msize
, dp
->d_name
, dp
->d_unit
, dp
->d_unit
);
fprintf(fp
, "0\n};\n\n");
fprintf(fp
, "struct isa_device isa_devtab_null[] = {\n");
/* driver iobase irq drq maddr msiz intr unit */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| mp
== 0 ||
mp
== TO_NEXUS
|| !eq(mp
->d_name
, "isa"))
if (!eq(dp
->d_mask
, "null")) continue;
fprintf(fp
, "{ &%sdriver, %8.8s,", dp
->d_name
, dp
->d_port
);
fprintf(fp
, "{ &%sdriver, 0x%03x,", dp
->d_name
, dp
->d_portn
);
fprintf(fp
, " %5.5s, %2d, C 0x%05X, %5d, V(%s%d), %2d },\n",
sirq(dp
->d_irq
), dp
->d_drq
, dp
->d_maddr
,
dp
->d_msize
, dp
->d_name
, dp
->d_unit
, dp
->d_unit
);
fprintf(fp
, "0\n};\n\n");
sprintf(errbuf
, "IRQ%d", num
);
register struct device
*dp
, *mp
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, "#include \"sys/types.h\"\n");
fprintf(fp
, "#include \"sys/time.h\"\n");
fprintf(fp
, "#include \"pmax/dev/device.h\"\n\n");
fprintf(fp
, "#define C (char *)\n\n");
/* print controller initialization structures */
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_type
== PSEUDO_DEVICE
)
fprintf(fp
, "extern struct driver %sdriver;\n", dp
->d_name
);
fprintf(fp
, "\nstruct pmax_ctlr pmax_cinit[] = {\n");
fprintf(fp
, "/*\tdriver,\t\tunit,\taddr,\t\tpri,\tflags */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_type
!= CONTROLLER
&& dp
->d_type
!= MASTER
)
if (dp
->d_conn
!= TO_NEXUS
) {
printf("%s%s must be attached to a nexus (internal bus)\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("can't specify drive/slave for %s%s\n",
dp
->d_name
, wnum(dp
->d_unit
));
if (dp
->d_unit
== UNKNOWN
|| dp
->d_unit
== QUES
)
"\t{ &%sdriver,\t%d,\tC 0x%x,\t%d,\t0x%x },\n",
dp
->d_name
, dp
->d_unit
, dp
->d_addr
, dp
->d_pri
,
fprintf(fp
, "\t0\n};\n");
/* print devices connected to other controllers */
fprintf(fp
, "\nstruct scsi_device scsi_dinit[] = {\n");
"/*driver,\tcdriver,\tunit,\tctlr,\tdrive,\tslave,\tdk,\tflags*/\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_type
== CONTROLLER
|| dp
->d_type
== MASTER
||
dp
->d_type
== PSEUDO_DEVICE
)
!eq(mp
->d_name
, "asc") && !eq(mp
->d_name
, "sii")) {
printf("%s%s: devices must be attached to a SCSI (asc or sii) controller\n",
dp
->d_name
, wnum(dp
->d_unit
));
if ((unsigned)dp
->d_drive
> 6) {
printf("%s%s: SCSI drive must be in the range 0..6\n",
dp
->d_name
, wnum(dp
->d_unit
));
/* may want to allow QUES later */
if ((unsigned)dp
->d_slave
> 7) {
printf("%s%s: SCSI slave (LUN) must be in the range 0..7\n",
dp
->d_name
, wnum(dp
->d_unit
));
fprintf(fp
, "{ &%sdriver,\t&%sdriver,", dp
->d_name
, mp
->d_name
);
fprintf(fp
, "\t%d,\t%d,\t%d,\t%d,\t%d,\t0x%x },\n",
dp
->d_unit
, mp
->d_unit
, dp
->d_drive
, dp
->d_slave
,
register struct device
*dp
, *mp
;
fp
= fopen(path("ioconf.c"), "w");
perror(path("ioconf.c"));
fprintf(fp
, "#include \"sys/param.h\"\n");
fprintf(fp
, "#include \"sys/buf.h\"\n");
fprintf(fp
, "#include \"sys/map.h\"\n");
fprintf(fp
, "#include \"vm/vm.h\"\n");
fprintf(fp
, "#include \"iop.h\"\n");
fprintf(fp
, "#include \"hb.h\"\n");
fprintf(fp
, "#if NIOP > 0\n");
fprintf(fp
, "#include \"news3400/iop/iopvar.h\"\n");
fprintf(fp
, "#if NHB > 0\n");
fprintf(fp
, "#include \"news3400/hbdev/hbvar.h\"\n");
fprintf(fp
, "#define C (caddr_t)\n\n");
fprintf(fp
, "#if NHB > 0\n");
* Now generate interrupt vectors for the HYPER-BUS
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (mp
== 0 || mp
== TO_NEXUS
||
fprintf(fp
, "extern struct hb_driver %sdriver;\n",
* Now spew forth the hb_cinfo structure
fprintf(fp
, "\nstruct hb_ctlr hminit[] = {\n");
fprintf(fp
, "/*\t driver,\tctlr,\talive,\taddr,\tintpri */\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if ((dp
->d_type
!= MASTER
&& dp
->d_type
!= CONTROLLER
)
|| mp
== TO_NEXUS
|| mp
== 0 ||
printf("must specify priority for %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives need their own entries; ");
printf("dont specify drive or slave for %s%d\n",
printf("controllers (e.g. %s%d) don't have flags, ");
printf("only devices do\n",
fprintf(fp
, "\t{ &%sdriver,\t%d,\t0,\tC 0x%x,\t%d },\n",
dp
->d_name
, dp
->d_unit
, dp
->d_addr
, dp
->d_pri
);
fprintf(fp
, "\t0\n};\n");
* Now we go for the hb_device stuff
fprintf(fp
, "\nstruct hb_device hdinit[] = {\n");
"\t/* driver, unit, ctlr, slave, addr, pri, dk, flags*/\n");
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
) {
if (dp
->d_unit
== QUES
|| dp
->d_type
!= DEVICE
|| mp
== 0 ||
mp
== TO_NEXUS
|| /* mp->d_type == MASTER || */
eq(mp
->d_name
, "iop") || eq(mp
->d_name
, "vme"))
if (eq(mp
->d_name
, "hb")) {
printf("must specify vector for device %s%d\n",
if (dp
->d_drive
!= UNKNOWN
|| dp
->d_slave
!= UNKNOWN
) {
printf("drives/slaves can be specified only ");
printf("for controllers, not for device %s%d\n",
printf("%s%d isn't connected to anything, ",
printf("so %s%d is unattached\n",
if (dp
->d_drive
== UNKNOWN
) {
printf("must specify ``drive number'' for %s%d\n",
/* NOTE THAT ON THE IOP ``drive'' IS STORED IN */
/* ``SLAVE'' AND WE DON'T WANT A SLAVE SPECIFIED */
if (dp
->d_slave
!= UNKNOWN
) {
printf("slave numbers should be given only ");
printf("for massbus tapes, not for %s%d\n",
printf("interrupt priority should not be ");
printf("given for drive %s%d\n",
printf("csr addresses should be given only");
printf("on controllers, not on %s%d\n",
"\t{ &%sdriver, %2d, %s, %2d, C 0x%x, %d, %d, 0x%x },\n",
eq(mp
->d_name
, "hb") ? dp
->d_name
: mp
->d_name
, dp
->d_unit
,
eq(mp
->d_name
, "hb") ? " -1" : qu(mp
->d_unit
),
slave
, dp
->d_addr
, dp
->d_pri
, dp
->d_dk
, dp
->d_flags
);
fprintf(fp
, "\t0\n};\n\n");
fprintf(fp
, "#endif\n\n");
register struct device
*dev
;
(void) sprintf(buf
, "%sint%d", dev
->d_name
, dev
->d_unit
);
(void) sprintf(errbuf
, "%3d", num
);
if (num
== QUES
|| num
== UNKNOWN
)
(void) sprintf(errbuf
, "%d", num
);
register struct device
*dp
;
(void)fprintf(fp
, "\n#include <sys/device.h>\n\n");
for (dp
= dtab
; dp
!= NULL
; dp
= dp
->d_next
)
if (dp
->d_type
== PSEUDO_DEVICE
)
(void)fprintf(fp
, "extern void %sattach __P((int));\n",
* XXX concatonated disks are pseudo-devices but appear as DEVICEs
* since they don't adhere to normal pseudo-device conventions
* (i.e. one entry with total count in d_slave).
(void)fprintf(fp
, "extern void cdattach __P((int));\n");
/* XXX temporary for HP300, others */
(void)fprintf(fp
, "\n#include <sys/systm.h> /* XXX */\n");
(void)fprintf(fp
, "#define etherattach (void (*)__P((int)))nullop\n");
(void)fprintf(fp
, "#define iteattach (void (*) __P((int)))nullop\n");
(void)fprintf(fp
, "\nstruct pdevinit pdevinit[] = {\n");
for (dp
= dtab
; dp
!= NULL
; dp
= dp
->d_next
)
if (dp
->d_type
== PSEUDO_DEVICE
)
(void)fprintf(fp
, "\t{ %sattach, %d },\n", dp
->d_name
,
dp
->d_slave
> 0 ? dp
->d_slave
: 1);
* XXX count up cds and put out an entry
for (fl
= comp_list
; fl
!= NULL
; fl
= fl
->f_next
)
if (fl
->f_type
== COMPDEVICE
&& fl
->f_compinfo
> cdmax
)
(void)fprintf(fp
, "\t{ cdattach, %d },\n", cdmax
+1);
(void)fprintf(fp
, "\t{ 0, 0 }\n};\n");
register struct file_list
*fl
;
register struct device
*dp
;
fprintf(fp
, "\n#include \"dev/cdvar.h\"\n");
fprintf(fp
, "\nstruct cddevice cddevice[] = {\n");
fprintf(fp
, "/*\tunit\tileave\tflags\tdk\tdevs\t\t\t\t*/\n");
if (fl
->f_type
!= COMPDEVICE
) {
for (dp
= dtab
; dp
!= 0; dp
= dp
->d_next
)
if (dp
->d_type
== DEVICE
&&
eq(dp
->d_name
, fl
->f_fn
) &&
dp
->d_unit
== fl
->f_compinfo
)
fprintf(fp
, "\t%d,\t%d,\t%d,\t%d,\t{",
dp
->d_unit
, dp
->d_pri
, dp
->d_flags
, 1);
for (fl
= fl
->f_next
; fl
->f_type
== COMPSPEC
; fl
= fl
->f_next
)
fprintf(fp
, " 0x%x,", fl
->f_compdev
);
fprintf(fp
, " NODEV },\n");
fprintf(fp
, "\t-1,\t0,\t0,\t0,\t{ 0 },\n};\n");