Date: Mon, 9 Jul 2012 21:46:07 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r238312 - projects/altix2/sys/dev/ioc4 Message-ID: <201207092146.q69Lk7rj041717@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Mon Jul 9 21:46:07 2012 New Revision: 238312 URL: http://svn.freebsd.org/changeset/base/238312 Log: Setup both a filter and an ithread to manage the interrupt registers of the IOC4 itself. Modified: projects/altix2/sys/dev/ioc4/ioc4.c Modified: projects/altix2/sys/dev/ioc4/ioc4.c ============================================================================== --- projects/altix2/sys/dev/ioc4/ioc4.c Mon Jul 9 20:55:39 2012 (r238311) +++ projects/altix2/sys/dev/ioc4/ioc4.c Mon Jul 9 21:46:07 2012 (r238312) @@ -53,6 +53,7 @@ struct ioc4_child { struct resource *ch_mres; u_int ch_type; u_int ch_unit; + u_int ch_imask; }; struct ioc4_softc { @@ -66,8 +67,6 @@ struct ioc4_softc { void *sc_icookie; struct rman sc_rm; - - u_int sc_fastintr:1; }; static int ioc4_probe(device_t dev); @@ -107,19 +106,27 @@ static driver_t ioc4_driver = { sizeof(struct ioc4_softc), }; -#if 0 static int +ioc4_filt(void *arg) +{ + struct ioc4_softc *sc = arg; + uint32_t mask; + + mask = bus_read_4(sc->sc_mres, IOC4_CTL_MISC_INT); + bus_write_4(sc->sc_mres, IOC4_CTL_MISC_INT, mask & ~0x03); + return ((mask & 0x03) ? FILTER_SCHEDULE_THREAD: FILTER_STRAY); +} + +static void ioc4_intr(void *arg) { struct ioc4_softc *sc = arg; - device_printf(sc->sc_dev, "%s\n", __func__); - return (FILTER_HANDLED); + bus_write_4(sc->sc_mres, IOC4_CTL_MISC_INT, 0x03); } -#endif static int -ioc4_child_add(struct ioc4_softc *sc, u_int type, u_int unit) +ioc4_child_add(struct ioc4_softc *sc, u_int type, u_int unit, u_int imask) { struct ioc4_child *ch; bus_space_handle_t bsh; @@ -148,6 +155,7 @@ ioc4_child_add(struct ioc4_softc *sc, u_ len = IOC4_UART_REG_SIZE; break; case IOC4_TYPE_ATA: + bus_write_4(sc->sc_mres, IOC4_CTL_MISC_INT_SET, imask); ofs = IOC4_ATA_BASE; len = IOC4_ATA_SIZE; break; @@ -164,6 +172,7 @@ ioc4_child_add(struct ioc4_softc *sc, u_ goto fail_delete; ch->ch_ires = sc->sc_ires; + ch->ch_imask = imask; bsh = rman_get_bushandle(sc->sc_mres); bst = rman_get_bustag(sc->sc_mres); @@ -228,19 +237,10 @@ ioc4_attach(device_t dev) if (sc->sc_ires == NULL) goto fail_rel_mres; -#if 0 - error = bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_TTY, ioc4_intr, - NULL, sc, &sc->sc_icookie); - if (error) - error = bus_setup_intr(dev, sc->sc_ires, - INTR_TYPE_TTY | INTR_MPSAFE, NULL, - (driver_intr_t *)ioc4_intr, sc, &sc->sc_icookie); - else - sc->sc_fastintr = 1; - + error = bus_setup_intr(dev, sc->sc_ires, INTR_TYPE_MISC | INTR_MPSAFE, + ioc4_filt, ioc4_intr, sc, &sc->sc_icookie); if (error) goto fail_rel_ires; -#endif sc->sc_rm.rm_type = RMAN_ARRAY; error = rman_init(&sc->sc_rm); @@ -273,16 +273,14 @@ ioc4_attach(device_t dev) for (n = 0; n < 4; n++) ioc4_child_add(sc, IOC4_TYPE_UART, n); #endif - ioc4_child_add(sc, IOC4_TYPE_ATA, 0); + ioc4_child_add(sc, IOC4_TYPE_ATA, 0, 0x03); return (0); fail_teardown: bus_teardown_intr(sc->sc_dev, sc->sc_ires, sc->sc_icookie); -#if 0 fail_rel_ires: -#endif bus_release_resource(sc->sc_dev, SYS_RES_IRQ, sc->sc_irid, sc->sc_ires); fail_rel_mres:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207092146.q69Lk7rj041717>