diff --git a/sys/arch/alpha/tc/ioasic.c b/sys/arch/alpha/tc/ioasic.c index 51d1ca20b9b9..dfb6eebeaddc 100644 --- a/sys/arch/alpha/tc/ioasic.c +++ b/sys/arch/alpha/tc/ioasic.c @@ -1,4 +1,4 @@ -/* $NetBSD: ioasic.c,v 1.33 2000/07/11 04:10:25 nisimura Exp $ */ +/* $NetBSD: ioasic.c,v 1.34 2000/07/18 06:10:06 thorpej Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ #include /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.33 2000/07/11 04:10:25 nisimura Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ioasic.c,v 1.34 2000/07/18 06:10:06 thorpej Exp $"); #include #include @@ -305,29 +305,37 @@ ioasic_intr(val) register struct ioasic_softc *sc = val; register int ifound; int gifound; - u_int32_t sir; + u_int32_t sir, osir; gifound = 0; do { ifound = 0; tc_syncbus(); - sir = bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_INTR); + osir = sir = + bus_space_read_4(sc->sc_bst, sc->sc_bsh, IOASIC_INTR); #define INCRINTRCNT(slot) ioasicintrs[slot].iai_evcnt.ev_count++ /* XXX DUPLICATION OF INTERRUPT BIT INFORMATION... */ -#define CHECKINTR(slot, bits) \ +#define CHECKINTR(slot, bits, clear) \ if (sir & (bits)) { \ ifound = 1; \ INCRINTRCNT(slot); \ (*ioasicintrs[slot].iai_func) \ (ioasicintrs[slot].iai_arg); \ + if (clear) \ + sir &= ~(bits); \ } - CHECKINTR(IOASIC_DEV_SCC0, IOASIC_INTR_SCC_0); - CHECKINTR(IOASIC_DEV_SCC1, IOASIC_INTR_SCC_1); - CHECKINTR(IOASIC_DEV_LANCE, IOASIC_INTR_LANCE); - CHECKINTR(IOASIC_DEV_ISDN, IOASIC_INTR_ISDN_TXLOAD | IOASIC_INTR_ISDN_RXLOAD); + CHECKINTR(IOASIC_DEV_SCC0, IOASIC_INTR_SCC_0, 0); + CHECKINTR(IOASIC_DEV_SCC1, IOASIC_INTR_SCC_1, 0); + CHECKINTR(IOASIC_DEV_LANCE, IOASIC_INTR_LANCE, 0); + CHECKINTR(IOASIC_DEV_ISDN, IOASIC_INTR_ISDN_TXLOAD | + IOASIC_INTR_ISDN_RXLOAD | IOASIC_INTR_ISDN_OVRUN, 1); + + if (sir != osir) + bus_space_write_4(sc->sc_bst, sc->sc_bsh, + IOASIC_INTR, sir); gifound |= ifound; } while (ifound);