--- p4_head/sys/arm/arm/intr.c Sun Jan 21 15:15:03 2007 +++ p4_head_intr/sys/arm/arm/intr.c Fri Jan 26 13:54:07 2007 @@ -58,8 +58,8 @@ void arm_handler_execute(struct trapframe *, int); void -arm_setup_irqhandler(const char *name, void (*hand)(void*), void *arg, - int irq, int flags, void **cookiep) +arm_setup_irqhandler(const char *name, driver_filter_t *filt, + void (*hand)(void*), void *arg, int irq, int flags, void **cookiep) { struct intr_event *event; int error; @@ -82,7 +82,7 @@ intrcnt_index++; } - intr_event_add_handler(event, name, hand, arg, + intr_event_add_handler(event, name, filt, hand, arg, intr_priority(flags), flags, cookiep); } @@ -118,10 +118,10 @@ /* Execute fast handlers. */ thread = 0; TAILQ_FOREACH(ih, &event->ie_handlers, ih_next) { - if (!(ih->ih_flags & IH_FAST)) + if (ih->ih_filter == NULL) thread = 1; else - ih->ih_handler(ih->ih_argument ? + ih->ih_filter(ih->ih_argument ? ih->ih_argument : frame); } --- p4_head/sys/arm/arm/nexus.c Sun Jan 21 15:15:03 2007 +++ p4_head_intr/sys/arm/arm/nexus.c Fri Jan 26 13:54:07 2007 @@ -81,7 +81,7 @@ struct resource *); static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, - driver_intr_t *intr, void *arg, void **cookiep); + driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep); static int nexus_teardown_intr(device_t, device_t, struct resource *, void *); @@ -125,13 +125,13 @@ static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, - driver_intr_t *intr, void *arg, void **cookiep) + driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { int i; for (i = rman_get_start(res); i <= rman_get_end(res); i++) arm_setup_irqhandler(device_get_nameunit(child), - intr, arg, i, flags, cookiep); + filt, intr, arg, i, flags, cookiep); return (0); } --- p4_head/sys/arm/at91/at91.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91.c Fri Jan 26 13:54:07 2007 @@ -543,14 +543,14 @@ static int at91_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_intr_t *intr, void *arg, - void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { struct at91_softc *sc = device_get_softc(dev); if (rman_get_start(ires) == AT91RM92_IRQ_SYSTEM && !(flags & INTR_FAST)) panic("All system interrupt ISRs must be type INTR_FAST"); - BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg, + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, arg, cookiep); bus_space_write_4(sc->sc_st, sc->sc_sys_sh, IC_IECR, 1 << rman_get_start(ires)); --- p4_head/sys/arm/at91/at91_mci.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_mci.c Fri Jan 26 13:54:07 2007 @@ -192,7 +192,7 @@ * Activate the interrupt */ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, - at91_mci_intr, sc, &sc->intrhand); + NULL, at91_mci_intr, sc, &sc->intrhand); if (err) { AT91_MCI_LOCK_DESTROY(sc); goto out; --- p4_head/sys/arm/at91/at91_pio.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_pio.c Fri Jan 26 13:54:07 2007 @@ -83,7 +83,7 @@ static int at91_pio_probe(device_t dev); static int at91_pio_attach(device_t dev); static int at91_pio_detach(device_t dev); -static void at91_pio_intr(void *); +static int at91_pio_intr(void *); /* helper routines */ static int at91_pio_activate(device_t dev); @@ -148,8 +148,8 @@ * Activate the interrupt, but disable all interrupts in the hardware */ WR4(sc, PIO_IDR, 0xffffffff); - err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_FAST, - at91_pio_intr, sc, &sc->intrhand); + err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC, + at91_pio_intr, NULL, sc, &sc->intrhand); if (err) { AT91_PIO_LOCK_DESTROY(sc); goto out; @@ -217,7 +217,7 @@ return; } -static void +static int at91_pio_intr(void *xsc) { struct at91_pio_softc *sc = xsc; @@ -232,7 +232,7 @@ AT91_PIO_UNLOCK(sc); #endif wakeup(sc); - return; + return (FILTER_HANDLED); } static int --- p4_head/sys/arm/at91/at91_rtc.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_rtc.c Fri Jan 26 13:54:07 2007 @@ -110,8 +110,8 @@ * Activate the interrupt, but disable all interrupts in the hardware */ WR4(sc, RTC_IDR, 0xffffffff); - err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_FAST, - at91_rtc_intr, sc, &sc->intrhand); + err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC, + at91_rtc_intr, NULL, sc, &sc->intrhand); if (err) { AT91_RTC_LOCK_DESTROY(sc); goto out; @@ -173,7 +173,7 @@ return; } -static void +static int at91_rtc_intr(void *xsc) { struct at91_rtc_softc *sc = xsc; @@ -188,7 +188,7 @@ AT91_RTC_UNLOCK(sc); #endif wakeup(sc); - return; + return (FILTER_HANDLED); } /* --- p4_head/sys/arm/at91/at91_spi.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_spi.c Fri Jan 26 13:54:07 2007 @@ -163,7 +163,7 @@ if (sc->irq_res == NULL) goto errout; err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, - at91_spi_intr, sc, &sc->intrhand); + NULL, at91_spi_intr, sc, &sc->intrhand); if (err != 0) goto errout; return (0); --- p4_head/sys/arm/at91/at91_ssc.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_ssc.c Fri Jan 26 13:54:07 2007 @@ -124,7 +124,7 @@ * Activate the interrupt */ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, - at91_ssc_intr, sc, &sc->intrhand); + NULL, at91_ssc_intr, sc, &sc->intrhand); if (err) { AT91_SSC_LOCK_DESTROY(sc); goto out; --- p4_head/sys/arm/at91/at91_st.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_st.c Fri Jan 26 13:54:07 2007 @@ -183,7 +183,7 @@ WR4(ST_CR, ST_CR_WDRST); } -static void +static int clock_intr(void *arg) { struct trapframe *fp = arg; @@ -194,7 +194,9 @@ tot_count += 32768 / hz; #endif hardclock(TRAPF_USERMODE(fp), TRAPF_PC(fp)); + return (FILTER_HANDLED); } + return (FILTER_STRAY); } void @@ -222,8 +224,8 @@ if (!irq) panic("Unable to allocate irq for the system timer"); else - bus_setup_intr(dev, irq, INTR_TYPE_CLK | INTR_FAST, - clock_intr, NULL, &ih); + bus_setup_intr(dev, irq, INTR_TYPE_CLK, + clock_intr, NULL, NULL, &ih); WR4(ST_PIMR, rel_value); --- p4_head/sys/arm/at91/at91_twi.c Sun Jan 21 15:15:04 2007 +++ p4_head_intr/sys/arm/at91/at91_twi.c Fri Jan 26 13:54:07 2007 @@ -118,7 +118,7 @@ * Activate the interrupt */ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE, - at91_twi_intr, sc, &sc->intrhand); + NULL, at91_twi_intr, sc, &sc->intrhand); if (err) { AT91_TWI_LOCK_DESTROY(sc); goto out; --- p4_head/sys/arm/at91/if_ate.c Sun Jan 21 15:15:05 2007 +++ p4_head_intr/sys/arm/at91/if_ate.c Fri Jan 26 13:54:07 2007 @@ -225,7 +225,7 @@ * Activate the interrupt */ err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - ate_intr, sc, &sc->intrhand); + NULL, ate_intr, sc, &sc->intrhand); if (err) { ether_ifdetach(ifp); ATE_LOCK_DESTROY(sc); --- p4_head/sys/arm/include/intr.h Sun Jan 21 15:15:06 2007 +++ p4_head_intr/sys/arm/include/intr.h Fri Jan 26 13:54:07 2007 @@ -50,7 +50,7 @@ int arm_get_next_irq(void); void arm_mask_irq(uintptr_t); void arm_unmask_irq(uintptr_t); -void arm_setup_irqhandler(const char *, void (*)(void*), void *, int, int, - void **); +void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*), + void *, int, int, void **); int arm_remove_irqhandler(void *); #endif /* _MACHINE_INTR_H */ --- p4_head/sys/arm/sa11x0/sa11x0.c Sun Jan 21 15:15:06 2007 +++ p4_head_intr/sys/arm/sa11x0/sa11x0.c Fri Jan 26 13:54:07 2007 @@ -91,14 +91,14 @@ static int sa1110_activate_resource(device_t, device_t, int, int, struct resource *); static int sa1110_setup_intr(device_t, device_t, struct resource *, int, - driver_intr_t *, void *, void **); + driver_filter_t *, driver_intr_t *, void *, void **); struct sa11x0_softc *sa11x0_softc; /* There can be only one. */ static int sa1110_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_intr_t *intr, void *arg, - void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { int saved_cpsr; @@ -113,7 +113,7 @@ saved_cpsr = SetCPSR(I32_bit, I32_bit); SetCPSR(I32_bit, saved_cpsr & I32_bit); - BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg, + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, arg, cookiep); return (0); } --- p4_head/sys/arm/sa11x0/sa11x0_ost.c Sun Jan 21 15:15:06 2007 +++ p4_head_intr/sys/arm/sa11x0/sa11x0_ost.c Fri Jan 26 13:54:07 2007 @@ -67,9 +67,9 @@ static int saost_attach(device_t); int gettick(void); -static void clockintr(void *); +static int clockintr(void *); #if 0 -static void statintr(void *); +static int statintr(void *); #endif void rtcinit(void); @@ -141,7 +141,7 @@ } -static void +static int clockintr(arg) void *arg; { @@ -184,10 +184,11 @@ #if 0 mtx_unlock_spin(&clock_lock); #endif + return (FILTER_HANDLED); } #if 0 -static void +static int statintr(arg) void *arg; { @@ -227,7 +228,7 @@ saost_sc->sc_statclock_count = nextmatch; statclock(TRAPF_USERMODE(frame)); - + return (FILTER_HANDLED); } #endif @@ -271,10 +272,10 @@ rid = 1; irq2 = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, RF_ACTIVE); - bus_setup_intr(dev, irq1, INTR_TYPE_CLK | INTR_FAST, clockintr, NULL, + bus_setup_intr(dev, irq1, INTR_TYPE_CLK, clockintr, NULL, NULL, &ih1); #if 0 - bus_setup_intr(dev, irq2, INTR_TYPE_CLK | INTR_FAST, statintr, NULL + bus_setup_intr(dev, irq2, INTR_TYPE_CLK, statintr, NULL, NULL, ,&ih2); #endif bus_space_write_4(saost_sc->sc_iot, saost_sc->sc_ioh, SAOST_SR, 0xf); --- p4_head/sys/arm/xscale/i80321/i80321_pci.c Sun Jan 21 15:15:07 2007 +++ p4_head_intr/sys/arm/xscale/i80321/i80321_pci.c Fri Jan 26 13:54:07 2007 @@ -346,11 +346,11 @@ static int i80321_pci_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_intr_t *intr, void *arg, - void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { return (BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, - intr, arg, cookiep)); + filt, intr, arg, cookiep)); } static int --- p4_head/sys/arm/xscale/i80321/i80321_timer.c Sun Jan 21 15:15:07 2007 +++ p4_head_intr/sys/arm/xscale/i80321/i80321_timer.c Fri Jan 26 13:54:07 2007 @@ -133,7 +133,7 @@ DRIVER_MODULE(itimer, iq, i80321_timer_driver, i80321_timer_devclass, 0, 0); -void clockhandler(void *); +int clockhandler(void *); static __inline uint32_t @@ -336,8 +336,8 @@ if (!irq) panic("Unable to setup the clock irq handler.\n"); else - bus_setup_intr(dev, irq, INTR_TYPE_CLK | INTR_FAST, - clockhandler, NULL, &ihl); + bus_setup_intr(dev, irq, INTR_TYPE_CLK, clockhandler, NULL, + NULL, &ihl); tmr0_write(0); /* stop timer */ tisr_write(TISR_TMR0); /* clear interrupt */ @@ -401,7 +401,7 @@ * * Handle the hardclock interrupt. */ -void +int clockhandler(void *arg) { struct trapframe *frame = arg; @@ -412,7 +412,7 @@ if (i80321_hardclock_hook != NULL) (*i80321_hardclock_hook)(); - return; + return (FILTER_HANDLED); } void --- p4_head/sys/arm/xscale/i80321/iq80321.c Sun Jan 21 15:15:07 2007 +++ p4_head_intr/sys/arm/xscale/i80321/iq80321.c Fri Jan 26 13:54:07 2007 @@ -351,11 +351,11 @@ static int iq80321_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_intr_t *intr, void *arg, - void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { - BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg, - cookiep); + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, + arg, cookiep); intr_enabled |= 1 << rman_get_start(ires); i80321_set_intrmask(); --- p4_head/sys/arm/xscale/ixp425/ixp425.c Sun Jan 21 15:15:07 2007 +++ p4_head_intr/sys/arm/xscale/ixp425/ixp425.c Fri Jan 26 13:54:07 2007 @@ -310,8 +310,8 @@ static int ixp425_setup_intr(device_t dev, device_t child, - struct resource *ires, int flags, driver_intr_t *intr, void *arg, - void **cookiep) + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) { uint32_t mask; int i; @@ -324,8 +324,8 @@ rman_set_start(ires, IXP425_INT_UART1); rman_set_end(ires, rman_get_start(ires)); } - BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, intr, arg, - cookiep); + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, intr, + arg, cookiep); mask = 0; for (i = rman_get_start(ires); i <= rman_get_end(ires); i++) --- p4_head/sys/arm/xscale/ixp425/ixp425_npe.c Sun Jan 21 15:15:08 2007 +++ p4_head_intr/sys/arm/xscale/ixp425/ixp425_npe.c Fri Jan 26 13:54:07 2007 @@ -291,7 +291,7 @@ panic("%s: Unable to allocate irq %u", device_get_name(dev), irq); /* XXX could be a source of entropy */ bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE, - ixpnpe_intr, sc, &sc->sc_ih); + NULL, ixpnpe_intr, sc, &sc->sc_ih); /* enable output fifo interrupts (NB: must also set OFIFO Write Enable) */ npe_reg_write(sc, IX_NPECTL, npe_reg_read(sc, IX_NPECTL) | (IX_NPECTL_OFE | IX_NPECTL_OFWE)); --- p4_head/sys/arm/xscale/ixp425/ixp425_pci.c Sun Jan 21 15:15:08 2007 +++ p4_head_intr/sys/arm/xscale/ixp425/ixp425_pci.c Fri Jan 26 13:54:07 2007 @@ -254,11 +254,11 @@ static int ixppcib_setup_intr(device_t dev, device_t child, struct resource *ires, - int flags, driver_intr_t *intr, void *arg, void **cookiep) + int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) { return (BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, - intr, arg, cookiep)); + filt, intr, arg, cookiep)); } static int --- p4_head/sys/arm/xscale/ixp425/ixp425_timer.c Sun Jan 21 15:15:08 2007 +++ p4_head_intr/sys/arm/xscale/ixp425/ixp425_timer.c Fri Jan 26 13:54:07 2007 @@ -58,7 +58,7 @@ static uint32_t counts_per_hz; /* callback functions for intr_functions */ -void ixpclk_intr(void *); +int ixpclk_intr(void *); struct ixpclk_softc { device_t sc_dev; @@ -182,8 +182,8 @@ if (!irq) panic("Unable to setup the clock irq handler.\n"); else - bus_setup_intr(dev, irq, INTR_TYPE_CLK | INTR_FAST, - ixpclk_intr, NULL, &ihl); + bus_setup_intr(dev, irq, INTR_TYPE_CLK, ixpclk_intr, NULL, + NULL, &ihl); /* Set up the new clock parameters. */ @@ -244,7 +244,7 @@ * * Handle the hardclock interrupt. */ -void +int ixpclk_intr(void *arg) { struct ixpclk_softc* sc = ixpclk_sc; @@ -254,6 +254,7 @@ OST_TIM0_INT); hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + return (FILTER_HANDLED); } void