From owner-svn-src-projects@FreeBSD.ORG Tue Dec 23 04:36:12 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 109351065673; Tue, 23 Dec 2008 04:36:12 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F420C8FC12; Tue, 23 Dec 2008 04:36:11 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBN4aBAS080758; Tue, 23 Dec 2008 04:36:11 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBN4aBPU080757; Tue, 23 Dec 2008 04:36:11 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200812230436.mBN4aBPU080757@svn.freebsd.org> From: Sam Leffler Date: Tue, 23 Dec 2008 04:36:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186414 - projects/cambria/sys/arm/xscale/ixp425 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Dec 2008 04:36:12 -0000 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