Date: Tue, 7 Nov 2006 23:45:05 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 109495 for review Message-ID: <200611072345.kA7Nj5Fa083166@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=109495 Change 109495 by sam@sam_ebb on 2006/11/07 23:44:33 Hack around locking issue with npe msg support: we cannot sleep in npe_tick waiting for the update stats msg reply so use the send+recv api's to send a request each tick and fetch the results on the next. This works because we are the only thread (at the moment) that will use the npe msg api once the interface is up and running. Long term we probably need to revise the msg support. Affected files ... .. //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#13 edit Differences ... ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#13 (text+ko) ==== @@ -646,22 +646,12 @@ } static void -npe_tick(void *xsc) +npe_addstats(struct npe_softc *sc) { #define MIBADD(x) sc->mibdata.x += be32toh(ns->x) - struct npe_softc *sc = xsc; struct ifnet *ifp = sc->sc_ifp; struct npestats *ns = sc->sc_stats; - NPE_ASSERT_LOCKED(sc); - - NPE_UNLOCK(sc); /* XXX */ - npe_updatestats(sc); /* update + clear stats */ - NPE_LOCK(sc); - - bus_dmamap_sync(sc->sc_stats_tag, sc->sc_stats_map, - BUS_DMASYNC_POSTREAD); - MIBADD(dot3StatsAlignmentErrors); MIBADD(dot3StatsFCSErrors); MIBADD(dot3StatsSingleCollisionFrames); @@ -682,7 +672,8 @@ be32toh(ns->RxOverrunDiscards) + be32toh(ns->RxUnderflowEntryDiscards); - ifp->if_oerrors += be32toh(ns->dot3StatsInternalMacTransmitErrors) + ifp->if_oerrors += + be32toh(ns->dot3StatsInternalMacTransmitErrors) + be32toh(ns->TxVLANIdFilterDiscards) ; ifp->if_ierrors += be32toh(ns->dot3StatsFCSErrors) @@ -690,13 +681,31 @@ + be32toh(ns->RxOverrunDiscards) + be32toh(ns->RxUnderflowEntryDiscards) ; - ifp->if_collisions += be32toh(ns->dot3StatsSingleCollisionFrames) + ifp->if_collisions += + be32toh(ns->dot3StatsSingleCollisionFrames) + be32toh(ns->dot3StatsMultipleCollisionFrames) ; +#undef MIBADD +} +static void +npe_tick(void *xsc) +{ +#define ACK (NPE_RESETSTATS << NPE_MAC_MSGID_SHL) + struct npe_softc *sc = xsc; + uint32_t msg[2]; + + NPE_ASSERT_LOCKED(sc); + + if (ixpnpe_recvmsg(sc->sc_npe, msg) == 0 && msg[0] == ACK) { + bus_dmamap_sync(sc->sc_stats_tag, sc->sc_stats_map, + BUS_DMASYNC_POSTREAD); + npe_addstats(sc); + } + npe_updatestats(sc); /* schedule next poll */ callout_reset(&sc->tick_ch, hz, npe_tick, sc); -#undef MIBADD +#undef ACK } static void @@ -1238,7 +1247,7 @@ msg[0] = NPE_RESETSTATS << NPE_MAC_MSGID_SHL; msg[1] = sc->sc_stats_phys; /* physical address of stat block */ - return ixpnpe_sendandrecvmsg(sc->sc_npe, msg, msg); + return ixpnpe_sendmsg(sc->sc_npe, msg); /* NB: no recv */ } #if 0help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611072345.kA7Nj5Fa083166>
