Date: Wed, 14 Jun 2006 15:39:38 GMT From: Paolo Pisati <piso@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 99229 for review Message-ID: <200606141539.k5EFdcDH007573@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=99229 Change 99229 by piso@piso_newluxor on 2006/06/14 15:39:27 Finished converting all the INTR_FAST handlers to behave like a filter: on i386 everything compiles fine, now i'm going to find out what i broke on !i386. Affected files ... .. //depot/projects/soc2006/intr_filter/amd64/isa/clock.c#2 edit .. //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#2 edit .. //depot/projects/soc2006/intr_filter/arm/at91/at91_rtc.c#2 edit .. //depot/projects/soc2006/intr_filter/arm/at91/at91_st.c#2 edit .. //depot/projects/soc2006/intr_filter/arm/sa11x0/sa11x0_ost.c#2 edit .. //depot/projects/soc2006/intr_filter/arm/xscale/i80321/i80321_timer.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/aac/aac.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/aac/aacvar.h#2 edit .. //depot/projects/soc2006/intr_filter/dev/adlink/adlink.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/cy/cy.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/cy/cy_isa.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/cy/cy_pci.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/cy/cyvar.h#2 edit .. //depot/projects/soc2006/intr_filter/dev/em/if_em.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/ppbus/pps.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/puc/puc.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/scc/scc_core.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/sio/sio.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/twa/tw_osl_freebsd.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/uart/uart_core.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/zs/z8530var.h#2 edit .. //depot/projects/soc2006/intr_filter/dev/zs/zs.c#2 edit .. //depot/projects/soc2006/intr_filter/dev/zs/zs_macio.c#2 edit .. //depot/projects/soc2006/intr_filter/i386/isa/clock.c#2 edit .. //depot/projects/soc2006/intr_filter/i386/isa/npx.c#2 edit .. //depot/projects/soc2006/intr_filter/pc98/cbus/clock.c#2 edit .. //depot/projects/soc2006/intr_filter/pc98/cbus/sio.c#2 edit .. //depot/projects/soc2006/intr_filter/powerpc/powermac/pswitch.c#2 edit .. //depot/projects/soc2006/intr_filter/sparc64/pci/psycho.c#2 edit .. //depot/projects/soc2006/intr_filter/sparc64/sbus/sbus.c#2 edit Differences ... ==== //depot/projects/soc2006/intr_filter/amd64/isa/clock.c#2 (text+ko) ==== @@ -141,7 +141,7 @@ 0 /* quality */ }; -static void +static int clkintr(struct trapframe *frame) { @@ -158,6 +158,7 @@ } KASSERT(!using_lapic_timer, ("clk interrupt enabled with lapic timer")); hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + return(FILTER_HANDLED); } int @@ -212,11 +213,13 @@ * Stat clock ticks can still be lost, causing minor loss of accuracy * in the statistics, but the stat clock will no longer stop. */ -static void +static int rtcintr(struct trapframe *frame) { + int flag = 0; while (rtcin(RTC_INTR) & RTCIR_PERIOD) { + flag = 1; if (profprocs != 0) { if (--pscnt == 0) pscnt = psdiv; @@ -225,6 +228,7 @@ if (pscnt == psdiv) statclock(TRAPF_USERMODE(frame)); } + return((flag)?FILTER_HANDLED:FILTER_STRAY); } #include "opt_ddb.h" @@ -755,6 +759,7 @@ * that it can drive hardclock(). Otherwise, change the 8254 * timecounter to user a simpler algorithm. */ + // XXX - FIX_INTR_FILTER if (!using_lapic_timer) { intr_add_handler("clk", 0, (driver_intr_t *)clkintr, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); @@ -790,6 +795,7 @@ /* Enable periodic interrupts from the RTC. */ rtc_statusb |= RTCSB_PINTR; + // XXX - FIX_INTR_FILTER intr_add_handler("rtc", 8, (driver_intr_t *)rtcintr, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); ==== //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#2 (text) ==== @@ -81,7 +81,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); @@ -124,8 +124,9 @@ * Activate the interrupt, but disable all interrupts in the hardware */ WR4(sc, PIO_IDR, 0xffffffff); + // XXX - FIX_INTR_FILTER err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_FAST, - at91_pio_intr, sc, &sc->intrhand); + (driver_intr_t *)at91_pio_intr, sc, &sc->intrhand); if (err) { AT91_PIO_LOCK_DESTROY(sc); goto out; @@ -193,7 +194,7 @@ return; } -static void +static int at91_pio_intr(void *xsc) { struct at91_pio_softc *sc = xsc; @@ -208,7 +209,7 @@ AT91_PIO_UNLOCK(sc); #endif wakeup(sc); - return; + return(FILTER_HANDLED); } static int ==== //depot/projects/soc2006/intr_filter/arm/at91/at91_rtc.c#2 (text) ==== @@ -80,7 +80,7 @@ static int at91_rtc_probe(device_t dev); static int at91_rtc_attach(device_t dev); static int at91_rtc_detach(device_t dev); -static void at91_rtc_intr(void *); +static int at91_rtc_intr(void *); /* helper routines */ static int at91_rtc_activate(device_t dev); @@ -110,8 +110,9 @@ * Activate the interrupt, but disable all interrupts in the hardware */ WR4(sc, RTC_IDR, 0xffffffff); + // XXX - FIX_INTR_FILTER err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_FAST, - at91_rtc_intr, sc, &sc->intrhand); + (driver_intr_t *)at91_rtc_intr, sc, &sc->intrhand); if (err) { AT91_RTC_LOCK_DESTROY(sc); goto out; @@ -173,7 +174,7 @@ return; } -static void +static int at91_rtc_intr(void *xsc) { struct at91_rtc_softc *sc = xsc; @@ -188,7 +189,7 @@ AT91_RTC_UNLOCK(sc); #endif wakeup(sc); - return; + return(FILTER_HANDLED); } /* ==== //depot/projects/soc2006/intr_filter/arm/at91/at91_st.c#2 (text) ==== @@ -140,7 +140,7 @@ #endif } -static void +static int clock_intr(void *arg) { struct trapframe *fp = arg; @@ -151,7 +151,9 @@ tot_count += 32768 / hz; #endif hardclock(TRAPF_USERMODE(fp), TRAPF_PC(fp)); + return(FILTER_HANDLED); } + return(FILTER_STRAY); } void @@ -173,11 +175,12 @@ /* The system timer shares the system irq (1) */ irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 1, 1, 1, RF_ACTIVE | RF_SHAREABLE); + // XXX - FIX_INTR_FILTER 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); + (driver_intr_t *)clock_intr, NULL, &ih); WR4(ST_PIMR, rel_value); ==== //depot/projects/soc2006/intr_filter/arm/sa11x0/sa11x0_ost.c#2 (text+ko) ==== @@ -68,9 +68,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); @@ -142,7 +142,7 @@ } -static void +static int clockintr(arg) void *arg; { @@ -185,10 +185,11 @@ #if 0 mtx_unlock_spin(&clock_lock); #endif + return(FILTER_HANDLED); } #if 0 -static void +static int statintr(arg) void *arg; { @@ -228,7 +229,7 @@ saost_sc->sc_statclock_count = nextmatch; statclock(TRAPF_USERMODE(frame)); - + return(FILTER_HANDLED); } #endif @@ -272,11 +273,13 @@ 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, - &ih1); + // XXX - FIX_INTR_FILTER + bus_setup_intr(dev, irq1, INTR_TYPE_CLK | INTR_FAST, + (driver_intr_t *)clockintr, NULL, &ih1); #if 0 - bus_setup_intr(dev, irq2, INTR_TYPE_CLK | INTR_FAST, statintr, NULL - ,&ih2); + // XXX - FIX_INTR_FILTER + bus_setup_intr(dev, irq2, INTR_TYPE_CLK | INTR_FAST, + (driver_intr_t *)statintr, NULL, &ih2); #endif bus_space_write_4(saost_sc->sc_iot, saost_sc->sc_ioh, SAOST_SR, 0xf); bus_space_write_4(saost_sc->sc_iot, saost_sc->sc_ioh, SAOST_IR, 3); ==== //depot/projects/soc2006/intr_filter/arm/xscale/i80321/i80321_timer.c#2 (text+ko) ==== @@ -134,7 +134,7 @@ DRIVER_MODULE(itimer, iq, i80321_timer_driver, i80321_timer_devclass, 0, 0); void counterhandler(void *); -void clockhandler(void *); +int clockhandler(void *); static __inline uint32_t @@ -334,11 +334,12 @@ irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, ICU_INT_TMR0, ICU_INT_TMR0, 1, RF_ACTIVE); + // XXX - FIX_INTR_FILTER 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); + (driver_intr_t *)clockhandler, NULL, &ihl); tmr0_write(0); /* stop timer */ tisr_write(TISR_TMR0); /* clear interrupt */ @@ -402,7 +403,7 @@ * * Handle the hardclock interrupt. */ -void +int clockhandler(void *arg) { struct trapframe *frame = arg; @@ -413,7 +414,7 @@ if (i80321_hardclock_hook != NULL) (*i80321_hardclock_hook)(); - return; + return(FILTER_HANDLED); } void ==== //depot/projects/soc2006/intr_filter/dev/aac/aac.c#2 (text+ko) ==== @@ -311,14 +311,16 @@ return (EINVAL); } } else { + // XXX - FIX_INTR_FILTER if (bus_setup_intr(sc->aac_dev, sc->aac_irq, - INTR_FAST|INTR_TYPE_BIO, aac_fast_intr, + INTR_FAST|INTR_TYPE_BIO, + (driver_intr_t *)aac_fast_intr, sc, &sc->aac_intr)) { device_printf(sc->aac_dev, "can't set up FAST interrupt\n"); if (bus_setup_intr(sc->aac_dev, sc->aac_irq, INTR_MPSAFE|INTR_TYPE_BIO, - aac_fast_intr, sc, &sc->aac_intr)) { + aac_intr, sc, &sc->aac_intr)) { device_printf(sc->aac_dev, "can't set up MPSAFE interrupt\n"); return (EINVAL); @@ -780,8 +782,57 @@ mtx_unlock(&sc->aac_io_lock); } +int +aac_fast_intr(void *arg) +{ + struct aac_softc *sc; + u_int16_t reason; + int flag = 0; + + debug_called(2); + + sc = (struct aac_softc *)arg; + + /* + * Read the status register directly. This is faster than taking the + * driver lock and reading the queues directly. It also saves having + * to turn parts of the driver lock into a spin mutex, which would be + * ugly. + */ + reason = AAC_GET_ISTATUS(sc); + AAC_CLEAR_ISTATUS(sc, reason); + + /* handle completion processing */ + if (reason & AAC_DB_RESPONSE_READY) { + flag = 1; + taskqueue_enqueue_fast(taskqueue_fast, &sc->aac_task_complete); + } + + /* controller wants to talk to us */ + if (reason & (AAC_DB_PRINTF | AAC_DB_COMMAND_READY)) { + flag = 1; + /* + * XXX Make sure that we don't get fooled by strange messages + * that start with a NULL. + */ + if ((reason & AAC_DB_PRINTF) && + (sc->aac_common->ac_printf[0] == 0)) + sc->aac_common->ac_printf[0] = 32; + + /* + * This might miss doing the actual wakeup. However, the + * msleep that this is waking up has a timeout, so it will + * wake up eventually. AIFs and printfs are low enough + * priority that they can handle hanging out for a few seconds + * if needed. + */ + wakeup(sc->aifthread); + } + return((flag)?FILTER_HANDLED:FILTER_STRAY); +} + void -aac_fast_intr(void *arg) +aac_intr(void *arg) { struct aac_softc *sc; u_int16_t reason; ==== //depot/projects/soc2006/intr_filter/dev/aac/aacvar.h#2 (text+ko) ==== @@ -425,7 +425,8 @@ extern int aac_suspend(device_t dev); extern int aac_resume(device_t dev); extern void aac_new_intr(void *arg); -extern void aac_fast_intr(void *arg); +extern int aac_fast_intr(void *arg); +extern void aac_intr(void *arg); extern void aac_submit_bio(struct bio *bp); extern void aac_biodone(struct bio *bp); extern void aac_startio(struct aac_softc *sc); ==== //depot/projects/soc2006/intr_filter/dev/adlink/adlink.c#2 (text+ko) ==== @@ -115,7 +115,7 @@ static d_ioctl_t adlink_ioctl; static d_mmap_t adlink_mmap; -static void adlink_intr(void *arg); +static intr adlink_intr(void *arg); static struct cdevsw adlink_cdevsw = { .d_version = D_VERSION, @@ -124,7 +124,7 @@ .d_name = "adlink", }; -static void +static intr adlink_intr(void *arg) { struct softc *sc; @@ -134,7 +134,7 @@ sc = arg; u = bus_read_4(sc->res[0], 0x38); if (!(u & 0x00800000)) - return; + return; // XXX - FILTER_STRAY? bus_write_4(sc->res[0], 0x38, u | 0x003f4000); sc->sample += sc->p0->chunksize / 2; @@ -147,7 +147,7 @@ if (sc->p0->state != STATE_RUN) { printf("adlink: stopping %d\n", sc->p0->state); - return; + return; // XXX - FILTER_STRAY? } pg = pg->next; @@ -156,6 +156,7 @@ bus_write_4(sc->res[0], 0x24, pg->phys); bus_write_4(sc->res[0], 0x28, sc->p0->chunksize); wakeup(sc); + return(FILTER_HANDLED); } static int @@ -372,9 +373,10 @@ if (error) return (error); + // XXX - FIX_INTR_FILTER i = bus_setup_intr(self, sc->res[2], INTR_MPSAFE | INTR_TYPE_MISC | INTR_FAST, - adlink_intr, sc, &sc->intrhand); + (driver_intr_t *)adlink_intr, sc, &sc->intrhand); if (i) { printf("adlink: Couldn't get FAST intr\n"); i = bus_setup_intr(self, sc->res[2], ==== //depot/projects/soc2006/intr_filter/dev/cy/cy.c#2 (text+ko) ==== @@ -644,7 +644,7 @@ com->mcr_image |= com->mcr_rts); } -void +intr cyintr(void *vcom) { struct com_s *basecom; @@ -671,7 +671,7 @@ /* poll to see if it has any work */ status = cd_inb(iobase, CD1400_SVRR, cy_align); if (status == 0) - continue; + continue; // XXX - FILTER_STRAY? #ifdef CyDebug ++cy_svrr_probes; #endif @@ -1111,6 +1111,7 @@ swi_sched(cy_slow_ih, SWI_DELAY); COM_UNLOCK(); + return(FILTER_HANDLED); } static void ==== //depot/projects/soc2006/intr_filter/dev/cy/cy_isa.c#2 (text+ko) ==== @@ -132,8 +132,9 @@ device_printf(dev, "interrupt resource allocation failed\n"); goto fail; } - if (bus_setup_intr(dev, irq_res, INTR_TYPE_TTY | INTR_FAST, cyintr, - vsc, &irq_cookie) != 0) { + // XXX - FIX_INTR_FILTER + if (bus_setup_intr(dev, irq_res, INTR_TYPE_TTY | INTR_FAST, + (driver_intr_t *)cyintr, vsc, &irq_cookie) != 0) { device_printf(dev, "interrupt setup failed\n"); goto fail; } ==== //depot/projects/soc2006/intr_filter/dev/cy/cy_pci.c#2 (text+ko) ==== @@ -145,8 +145,9 @@ goto fail; } #ifdef CY_PCI_FASTINTR + // XXX - FIX_INTR_FILTER irq_setup = bus_setup_intr(dev, irq_res, INTR_TYPE_TTY | INTR_FAST, - cyintr, vsc, &irq_cookie); + (driver_intr_t *)cyintr, vsc, &irq_cookie); #else irq_setup = ENXIO; #endif ==== //depot/projects/soc2006/intr_filter/dev/cy/cyvar.h#2 (text+ko) ==== @@ -32,5 +32,5 @@ extern char cy_driver_name[]; void *cyattach_common(cy_addr cy_iobase, int cy_align); -driver_intr_t cyintr; +driver_filter_t cyintr; int cy_units(cy_addr cy_iobase, int cy_align); ==== //depot/projects/soc2006/intr_filter/dev/em/if_em.c#2 (text+ko) ==== @@ -257,7 +257,7 @@ static poll_handler_t em_poll; static void em_intr(void *); #else -static void em_intr_fast(void *); +static int em_intr_fast(void *); static void em_add_int_process_limit(struct em_softc *, const char *, const char *, int *, int); static void em_handle_rxtx(void *context, int pending); @@ -1202,7 +1202,7 @@ * Fast Interrupt Service routine * *********************************************************************/ -static void +static int em_intr_fast(void *arg) { struct em_softc *sc = arg; @@ -1215,11 +1215,11 @@ /* Hot eject? */ if (reg_icr == 0xffffffff) - return; + return(FILTER_STRAY); /* Definitely not our interrupt. */ if (reg_icr == 0x0) - return; + return(FILTER_STRAY); /* * Starting with the 82571 chip, bit 31 should be used to @@ -1227,7 +1227,7 @@ */ if (sc->hw.mac_type >= em_82571 && (reg_icr & E1000_ICR_INT_ASSERTED) == 0) - return; + return(FILTER_STRAY); /* * Mask interrupts until the taskqueue is finished running. This is @@ -1243,6 +1243,7 @@ if (reg_icr & E1000_ICR_RXO) sc->rx_overruns++; + return(FILTER_HANDLED); } #endif /* ! DEVICE_POLLING */ @@ -1991,8 +1992,9 @@ taskqueue_thread_enqueue, &sc->tq); taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq", device_get_nameunit(sc->dev)); + // XXX - FIX_INTR_FILTER if ((error = bus_setup_intr(dev, sc->res_interrupt, - INTR_TYPE_NET | INTR_FAST, em_intr_fast, sc, + INTR_TYPE_NET | INTR_FAST, (driver_intr_t *)em_intr_fast, sc, &sc->int_handler_tag)) != 0) { device_printf(dev, "Failed to register fast interrupt " "handler: %d\n", error); ==== //depot/projects/soc2006/intr_filter/dev/ppbus/pps.c#2 (text+ko) ==== @@ -51,7 +51,7 @@ void *intr_cookie; /* interrupt registration cookie */ }; -static void ppsintr(void *arg); +static int ppsintr(void *arg); static void ppshcpoll(void *arg); #define DEVTOSOFTC(dev) \ @@ -203,9 +203,11 @@ if (ppb_request_bus(ppbus, ppsdev, PPB_WAIT|PPB_INTR)) return (EINTR); + // XXX - FIX_INTR_FILTER /* attach the interrupt handler */ if ((error = bus_setup_intr(ppsdev, sc->intr_resource, - (INTR_TYPE_TTY | INTR_MPSAFE | INTR_FAST), ppsintr, + (INTR_TYPE_TTY | INTR_MPSAFE | INTR_FAST), + (driver_intr_t *)ppsintr, sc, &sc->intr_cookie))) { ppb_release_bus(ppbus, ppsdev); return (error); @@ -276,14 +278,14 @@ mtx_unlock_spin(&sc->mtx); } -static void +static int ppsintr(void *arg) { struct pps_data *sc = (struct pps_data *)arg; pps_capture(&sc->pps[0]); if (!(ppb_rstr(sc->ppbus) & nACK)) - return; + return(FILTER_STRAY); if (sc->pps[0].ppsparam.mode & PPS_ECHOASSERT) ppb_wctr(sc->ppbus, IRQENABLE | AUTOFEED); mtx_lock_spin(&sc->mtx); @@ -291,6 +293,7 @@ mtx_unlock_spin(&sc->mtx); if (sc->pps[0].ppsparam.mode & PPS_ECHOASSERT) ppb_wctr(sc->ppbus, IRQENABLE); + return(FILTER_HANDLED); } static int ==== //depot/projects/soc2006/intr_filter/dev/puc/puc.c#2 (text+ko) ==== @@ -125,7 +125,7 @@ return (bar); } -static void +static int puc_intr(void *arg) { struct puc_port *port; @@ -183,7 +183,9 @@ if (port->p_ihsrc[i] != NULL) (*port->p_ihsrc[i])(port->p_iharg); } + return(FILTER_HANDLED); } + return(FILTER_STRAY); } int @@ -311,12 +313,14 @@ sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irid, RF_ACTIVE|RF_SHAREABLE); if (sc->sc_ires != NULL) { + // XXX - FIX_INTR_FILTER error = bus_setup_intr(dev, sc->sc_ires, - INTR_TYPE_TTY | INTR_FAST, puc_intr, sc, &sc->sc_icookie); + INTR_TYPE_TTY | INTR_FAST, (driver_intr_t *)puc_intr, + sc, &sc->sc_icookie); if (error) error = bus_setup_intr(dev, sc->sc_ires, - INTR_TYPE_TTY | INTR_MPSAFE, puc_intr, sc, - &sc->sc_icookie); + INTR_TYPE_TTY | INTR_MPSAFE, + (driver_intr_t *)puc_intr, sc, &sc->sc_icookie); else sc->sc_fastintr = 1; ==== //depot/projects/soc2006/intr_filter/dev/scc/scc_core.c#2 (text) ==== @@ -50,7 +50,7 @@ MALLOC_DEFINE(M_SCC, "SCC", "SCC driver"); -static void +static int scc_bfe_intr(void *arg) { struct scc_softc *sc = arg; @@ -88,7 +88,9 @@ else SCC_ICLEAR(sc, ch); } + return(FILTER_HANDLED); } + return(FILTER_STRAY); } int @@ -216,13 +218,14 @@ ch = &sc->sc_chan[c]; if (ch->ch_ires == NULL) continue; + // XXX - FIX_INTR_FILTER error = bus_setup_intr(dev, ch->ch_ires, - INTR_TYPE_TTY | INTR_FAST, scc_bfe_intr, sc, - &ch->ch_icookie); + INTR_TYPE_TTY | INTR_FAST, (driver_intr_t *)scc_bfe_intr, + sc, &ch->ch_icookie); if (error) { error = bus_setup_intr(dev, ch->ch_ires, - INTR_TYPE_TTY | INTR_MPSAFE, scc_bfe_intr, sc, - &ch->ch_icookie); + INTR_TYPE_TTY | INTR_MPSAFE, + (driver_intr_t *)scc_bfe_intr, sc, &ch->ch_icookie); } else sc->sc_fastintr = 1; @@ -521,8 +524,8 @@ continue; bus_teardown_intr(dev, ch->ch_ires, ch->ch_icookie); bus_setup_intr(dev, ch->ch_ires, - INTR_TYPE_TTY | INTR_MPSAFE, scc_bfe_intr, sc, - &ch->ch_icookie); + INTR_TYPE_TTY | INTR_MPSAFE, + (driver_intr_t *)scc_bfe_intr, sc, &ch->ch_icookie); } } ==== //depot/projects/soc2006/intr_filter/dev/sio/sio.c#2 (text+ko) ==== @@ -263,7 +263,7 @@ static int comopen(struct tty *tp, struct cdev *dev); static void sioinput(struct com_s *com); static void siointr1(struct com_s *com); -static void siointr(void *arg); +static int siointr(void *arg); static int commodem(struct tty *tp, int sigon, int sigoff); static int comparam(struct tty *tp, struct termios *t); static void siopoll(void *); @@ -1074,13 +1074,15 @@ rid = 0; com->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); if (com->irqres) { + // XXX - FIX_INTR_FILTER ret = bus_setup_intr(dev, com->irqres, INTR_TYPE_TTY | INTR_FAST, - siointr, com, &com->cookie); + (driver_intr_t *)siointr, com, + &com->cookie); if (ret) { ret = bus_setup_intr(dev, com->irqres, INTR_TYPE_TTY, - siointr, com, &com->cookie); + (driver_intr_t *)siointr, com, &com->cookie); if (ret == 0) device_printf(dev, "unable to activate interrupt in fast mode - using normal mode\n"); } @@ -1378,7 +1380,7 @@ outb(com->modem_ctl_port, com->mcr_image |= MCR_RTS); } -static void +static int siointr(arg) void *arg; { @@ -1422,6 +1424,7 @@ } while (possibly_more_intrs); mtx_unlock_spin(&sio_lock); #endif /* COM_MULTIPORT */ + return(FILTER_HANDLED); } static struct timespec siots[8]; ==== //depot/projects/soc2006/intr_filter/dev/twa/tw_osl_freebsd.c#2 (text+ko) ==== @@ -174,9 +174,11 @@ static TW_INT32 twa_detach(device_t dev); static TW_INT32 twa_shutdown(device_t dev); static TW_VOID twa_busdma_lock(TW_VOID *lock_arg, bus_dma_lock_op_t op); -static TW_VOID twa_pci_intr(TW_VOID *arg); #ifdef TW_OSLI_DEFERRED_INTR_USED +static int twa_pci_intr_fast(TW_VOID *arg); static TW_VOID twa_deferred_intr(TW_VOID *context, TW_INT32 pending); +#else +static TW_VOID twa_pci_intr(TW_VOID *arg); #endif /* TW_OSLI_DEFERRED_INTR_USED */ static TW_INT32 tw_osli_alloc_mem(struct twa_softc *sc); @@ -360,7 +362,12 @@ | INTR_FAST #endif /* TW_OSLI_DEFERRED_INTR_USED */ ) : 0) | INTR_TYPE_CAM, - twa_pci_intr, sc, &sc->intr_handle))) { +#ifdef TW_OSLI_DEFERRED_INTR_USED + (driver_intr_t *)twa_pci_intr_fast, +#else + twa_pci_intr, +#endif + sc, &sc->intr_handle))) { tw_osli_printf(sc, "error = %d", TW_CL_SEVERITY_ERROR_STRING, TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER, @@ -975,7 +982,28 @@ } +#ifdef TW_OSLI_DEFERRED_INTR_USED +/* + * Function name: twa_pci_intr_fast + * Description: Interrupt handler. Wrapper for twa_interrupt. + * + * Input: arg -- ptr to OSL internal ctlr context + * Output: FILTER_HANDLED or FILTER_STRAY + * Return value: None + */ +static int +twa_pci_intr_fast(TW_VOID *arg) +{ + struct twa_softc *sc = (struct twa_softc *)arg; + tw_osli_dbg_dprintf(10, sc, "entered"); + if (tw_cl_interrupt(&(sc->ctlr_handle))) { + tw_cl_deferred_interrupt(&(sc->ctlr_handle)); + return(FILTER_HANDLED); + } + return(FILTER_STRAY); +} +#else /* * Function name: twa_pci_intr * Description: Interrupt handler. Wrapper for twa_interrupt. @@ -991,15 +1019,9 @@ tw_osli_dbg_dprintf(10, sc, "entered"); if (tw_cl_interrupt(&(sc->ctlr_handle))) -#ifdef TW_OSLI_DEFERRED_INTR_USED - taskqueue_enqueue_fast(taskqueue_fast, - &(sc->deferred_intr_callback)); -#else /* TW_OSLI_DEFERRED_INTR_USED */ tw_cl_deferred_interrupt(&(sc->ctlr_handle)); -#endif /* TW_OSLI_DEFERRED_INTR_USED */ } - - +#endif #ifdef TW_OSLI_DEFERRED_INTR_USED ==== //depot/projects/soc2006/intr_filter/dev/uart/uart_core.c#2 (text+ko) ==== @@ -227,13 +227,14 @@ return (0); } -static void +static int uart_intr(void *arg) { struct uart_softc *sc = arg; - int ipend; + int flag = 0, ipend; while (!sc->sc_leaving && (ipend = UART_IPEND(sc)) != 0) { + flag = 1; if (ipend & SER_INT_OVERRUN) uart_intr_overrun(sc); if (ipend & SER_INT_BREAK) @@ -243,8 +244,9 @@ if (ipend & SER_INT_SIGCHG) uart_intr_sigchg(sc); if (ipend & SER_INT_TXIDLE) - uart_intr_txidle(sc); + uart_intr_txidle(sc); } + return((flag)?FILTER_HANDLED:FILTER_STRAY); } serdev_intr_t * @@ -400,13 +402,14 @@ sc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irid, RF_ACTIVE | RF_SHAREABLE); if (sc->sc_ires != NULL) { + // XXX - FIX_INTR_HANDLER error = bus_setup_intr(dev, - sc->sc_ires, INTR_TYPE_TTY | INTR_FAST, uart_intr, - sc, &sc->sc_icookie); + sc->sc_ires, INTR_TYPE_TTY | INTR_FAST, + (driver_intr_t *)uart_intr, sc, &sc->sc_icookie); if (error) error = bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_TTY | INTR_MPSAFE, - uart_intr, sc, &sc->sc_icookie); + (driver_intr_t *)uart_intr, sc, &sc->sc_icookie); else sc->sc_fastintr = 1; ==== //depot/projects/soc2006/intr_filter/dev/zs/z8530var.h#2 (text+ko) ==== @@ -65,7 +65,7 @@ int zs_attach(device_t dev); int zs_probe(device_t dev); -void zs_intr(void *v); +int zs_intr(void *v); int zstty_attach(device_t dev); int zstty_probe(device_t dev); ==== //depot/projects/soc2006/intr_filter/dev/zs/zs.c#2 (text+ko) ==== @@ -197,7 +197,7 @@ return (0); } -void +int zs_intr(void *v) { struct zs_softc *sc = v; @@ -216,8 +216,11 @@ needsoft |= zstty_intr(sc->sc_child[0], rr3 >> 3); if ((rr3 & (ZSRR3_IP_B_RX | ZSRR3_IP_B_TX | ZSRR3_IP_B_STAT)) != 0) needsoft |= zstty_intr(sc->sc_child[1], rr3); - if (needsoft) + if (needsoft) { swi_sched(sc->sc_softih, 0); + return(FILTER_HANDLED); + } + return(FILTER_STRAY); } static void ==== //depot/projects/soc2006/intr_filter/dev/zs/zs_macio.c#2 (text+ko) ==== @@ -158,8 +158,9 @@ device_printf(dev, "could not allocate interrupt 1\n"); goto error; } + // XXX - FIX_INTR_FILTER if (bus_setup_intr(dev, sc->sc_irqres1, INTR_TYPE_TTY | INTR_FAST, - zs_intr, sc, &sc->sc_ih1) != 0) { + (driver_intr_t *)zs_intr, sc, &sc->sc_ih1) != 0) { device_printf(dev, "could not setup interrupt 1\n"); goto error; } @@ -170,8 +171,9 @@ device_printf(dev, "could not allocate interrupt 2\n"); goto error; } + // XXX - FIX_INTR_FILTER if (bus_setup_intr(dev, sc->sc_irqres2, INTR_TYPE_TTY | INTR_FAST, - zs_intr, sc, &sc->sc_ih2) != 0) { + (driver_intr_t *)zs_intr, sc, &sc->sc_ih2) != 0) { device_printf(dev, "could not setup interrupt 2\n"); goto error; } ==== //depot/projects/soc2006/intr_filter/i386/isa/clock.c#2 (text+ko) ==== @@ -155,7 +155,7 @@ 0 /* quality */ }; -static void +static int clkintr(struct trapframe *frame) { @@ -177,6 +177,7 @@ if (MCA_system) outb(0x61, inb(0x61) | 0x80); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606141539.k5EFdcDH007573>