Date: Tue, 23 Dec 2008 04:36:11 +0000 (UTC) From: Sam Leffler <sam@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r186414 - projects/cambria/sys/arm/xscale/ixp425 Message-ID: <200812230436.mBN4aBPU080757@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: sam Date: Tue Dec 23 04:36:11 2008 New Revision: 186414 URL: http://svn.freebsd.org/changeset/base/186414 Log: allow multiple references; we need this for ancillary drivers Modified: projects/cambria/sys/arm/xscale/ixp425/ixp425_npe.c Modified: projects/cambria/sys/arm/xscale/ixp425/ixp425_npe.c ============================================================================== --- projects/cambria/sys/arm/xscale/ixp425/ixp425_npe.c Tue Dec 23 04:35:01 2008 (r186413) +++ projects/cambria/sys/arm/xscale/ixp425/ixp425_npe.c Tue Dec 23 04:36:11 2008 (r186414) @@ -113,6 +113,7 @@ struct ixpnpe_softc { uint32_t sc_msg[2]; /* reply msg collected in ixpnpe_intr */ int sc_msgwaiting; /* sc_msg holds valid data */ int sc_npeid; + int sc_nrefs; /* # of references */ int validImage; /* valid ucode image loaded */ int started; /* NPE is started */ @@ -122,6 +123,7 @@ struct ixpnpe_softc { uint32_t savedExecCount; uint32_t savedEcsDbgCtxtReg2; }; +static struct ixpnpe_softc *npes[NPE_MAX]; #define IX_NPEDL_NPEIMAGE_FIELD_MASK 0xff @@ -288,6 +290,11 @@ ixpnpe_attach(device_t dev, int npeid) device_printf(dev, "%s: bad npeid %d\n", __func__, npeid); return NULL; } + sc = npes[npeid]; + if (sc != NULL) { + sc->sc_nrefs++; + return sc; + } config = &npeconfigs[npeid]; /* XXX M_BUS */ @@ -296,6 +303,7 @@ ixpnpe_attach(device_t dev, int npeid) sc->sc_iot = sa->sc_iot; mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "npe driver", MTX_DEF); sc->sc_npeid = npeid; + sc->sc_nrefs = 1; sc->sc_size = config->size; sc->insMemSize = config->ins_memsize; /* size of instruction memory */ @@ -322,20 +330,26 @@ ixpnpe_attach(device_t dev, int npeid) npe_reg_write(sc, IX_NPECTL, npe_reg_read(sc, IX_NPECTL) | (IX_NPECTL_OFE | IX_NPECTL_OFWE)); + npes[npeid] = sc; + return sc; } void ixpnpe_detach(struct ixpnpe_softc *sc) { - /* disable output fifo interrupts */ - npe_reg_write(sc, IX_NPECTL, - npe_reg_read(sc, IX_NPECTL) &~ (IX_NPECTL_OFE | IX_NPECTL_OFWE)); + if (--sc->sc_nrefs == 0) { + npes[sc->sc_npeid] = NULL; - bus_teardown_intr(sc->sc_dev, sc->sc_irq, sc->sc_ih); - bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_size); - mtx_destroy(&sc->sc_mtx); - free(sc, M_TEMP); + /* disable output fifo interrupts */ + npe_reg_write(sc, IX_NPECTL, + npe_reg_read(sc, IX_NPECTL) &~ (IX_NPECTL_OFE | IX_NPECTL_OFWE)); + + bus_teardown_intr(sc->sc_dev, sc->sc_irq, sc->sc_ih); + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_size); + mtx_destroy(&sc->sc_mtx); + free(sc, M_TEMP); + } } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812230436.mBN4aBPU080757>