Date: Tue, 7 Nov 2006 23:36:54 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 109494 for review Message-ID: <200611072336.kA7Nas5m081769@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=109494 Change 109494 by sam@sam_ebb on 2006/11/07 23:36:53 Add ixpnpe_sendmsg and ixpnpe_recvmsg to allow callers to split transaction w/o sleeping. This is unsafe and still problematic (caller could conceivably sleep on internal mtx) but is good enough for now. Also fix mtx type so witness doesn't bitch about duplication with the npe network driver. Affected files ... .. //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425_npe.c#7 edit .. //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425_npevar.h#6 edit Differences ... ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425_npe.c#7 (text+ko) ==== @@ -257,7 +257,7 @@ sc = malloc(sizeof(struct ixpnpe_softc), M_TEMP, M_WAITOK | M_ZERO); sc->sc_dev = dev; sc->sc_iot = sa->sc_iot; - mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); + mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "npe driver", MTX_DEF); if (device_get_unit(dev) == 0) { base = IXP425_NPE_B_HWBASE; @@ -1365,3 +1365,32 @@ return error; } + +/* XXX temporary, not reliable */ + +int +ixpnpe_sendmsg(struct ixpnpe_softc *sc, const uint32_t msg[2]) +{ + int error; + + mtx_lock(&sc->sc_mtx); + error = ixpnpe_sendmsg_locked(sc, msg); + mtx_unlock(&sc->sc_mtx); + + return error; +} + +int +ixpnpe_recvmsg(struct ixpnpe_softc *sc, uint32_t msg[2]) +{ + int error; + + mtx_lock(&sc->sc_mtx); + if (sc->sc_msgwaiting) + bcopy(sc->sc_msg, msg, sizeof(sc->sc_msg)); + /* NB: sc_msgwaiting != 1 means the ack fetch failed */ + error = sc->sc_msgwaiting != 1 ? EIO : 0; + mtx_unlock(&sc->sc_mtx); + + return error; +} ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/ixp425_npevar.h#6 (text+ko) ==== @@ -87,6 +87,8 @@ const char *imageName, uint32_t imageId); int ixpnpe_getfunctionality(struct ixpnpe_softc *sc); +int ixpnpe_sendmsg(struct ixpnpe_softc *, const uint32_t msg[2]); +int ixpnpe_recvmsg(struct ixpnpe_softc *, uint32_t msg[2]); int ixpnpe_sendandrecvmsg(struct ixpnpe_softc *, const uint32_t send[2], uint32_t recv[2]); #endif /* _IXP425_NPEVAR_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611072336.kA7Nas5m081769>