diff options
| author | 1998-06-29 02:14:23 +0000 | |
|---|---|---|
| committer | 1998-06-29 02:14:23 +0000 | |
| commit | 57281b93f4fc2e98c5541476664df81d4a06e94e (patch) | |
| tree | 27ecddc23e61a38687570ff798d90736c0cf832e /sys/dev/isa/isa.c | |
| parent | Add and use isa_intr_check(). (diff) | |
| download | wireguard-openbsd-57281b93f4fc2e98c5541476664df81d4a06e94e.tar.xz wireguard-openbsd-57281b93f4fc2e98c5541476664df81d4a06e94e.zip | |
Use isa_intr_check() to prevent attachment of drivers that won't get an
interrupt.
Diffstat (limited to 'sys/dev/isa/isa.c')
| -rw-r--r-- | sys/dev/isa/isa.c | 45 |
1 files changed, 30 insertions, 15 deletions
diff --git a/sys/dev/isa/isa.c b/sys/dev/isa/isa.c index 39366021b0e..dd9f6e54600 100644 --- a/sys/dev/isa/isa.c +++ b/sys/dev/isa/isa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: isa.c,v 1.32 1998/04/26 21:02:47 provos Exp $ */ +/* $OpenBSD: isa.c,v 1.33 1998/06/29 02:14:23 downsj Exp $ */ /* $NetBSD: isa.c,v 1.85 1996/05/14 00:31:04 thorpej Exp $ */ /* @@ -210,6 +210,15 @@ isascan(parent, match) printf(">>> probing for %s*\n", cf->cf_driver->cd_name); while ((*cf->cf_attach->ca_match)(parent, dev, &ia2) > 0) { + if ((ia2.ia_irq != IRQUNK) && + !isa_intr_check(sc->sc_ic, ia2.ia_irq, IST_EDGE)) { + printf("%s%d: irq %d already in use\n", + cf->cf_driver->cd_name, cf->cf_unit, + ia2.ia_irq); + ia2 = ia; + continue; + } + if (autoconf_verbose) printf(">>> probe for %s* clone into %s%d\n", cf->cf_driver->cd_name, @@ -221,14 +230,13 @@ isascan(parent, match) } config_attach(parent, dev, &ia2, isaprint); dev = config_make_softc(parent, cf); - ia2 = ia; - #if NISADMA > 0 - if (ia.ia_drq != DRQUNK) - ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq); - if (ia.ia_drq2 != DRQUNK) - ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq2); + if (ia2.ia_drq != DRQUNK) + ISA_DRQ_ALLOC((struct device *)sc, ia2.ia_drq); + if (ia2.ia_drq2 != DRQUNK) + ISA_DRQ_ALLOC((struct device *)sc, ia2.ia_drq2); #endif /* NISAMDA > 0 */ + ia2 = ia; } if (autoconf_verbose) printf(">>> probing for %s* finished\n", @@ -241,17 +249,24 @@ isascan(parent, match) printf(">>> probing for %s%d\n", cf->cf_driver->cd_name, cf->cf_unit); if ((*cf->cf_attach->ca_match)(parent, dev, &ia) > 0) { - if (autoconf_verbose) - printf(">>> probing for %s%d succeeded\n", - cf->cf_driver->cd_name, cf->cf_unit); - config_attach(parent, dev, &ia, isaprint); + if ((ia.ia_irq != IRQUNK) && + !isa_intr_check(sc->sc_ic, ia.ia_irq, IST_EDGE)) { + printf("%s%d: irq %d already in use\n", + cf->cf_driver->cd_name, cf->cf_unit, ia.ia_irq); + free(dev, M_DEVBUF); + } else { + if (autoconf_verbose) + printf(">>> probing for %s%d succeeded\n", + cf->cf_driver->cd_name, cf->cf_unit); + config_attach(parent, dev, &ia, isaprint); #if NISADMA > 0 - if (ia.ia_drq != DRQUNK) - ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq); - if (ia.ia_drq2 != DRQUNK) - ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq2); + if (ia.ia_drq != DRQUNK) + ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq); + if (ia.ia_drq2 != DRQUNK) + ISA_DRQ_ALLOC((struct device *)sc, ia.ia_drq2); #endif /* NISAMDA > 0 */ + } } else { if (autoconf_verbose) printf(">>> probing for %s%d failed\n", |
