Date: Sun, 12 Nov 2006 03:26:18 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 109768 for review Message-ID: <200611120326.kAC3QIZN039725@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=109768 Change 109768 by sam@sam_ebb on 2006/11/12 03:25:33 device polling; not quite right due to shared tx done q; also stopped right now by 100hz clock Affected files ... .. //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#21 edit Differences ... ==== //depot/projects/arm/src/sys/arm/xscale/ixp425/if_npe.c#21 (text+ko) ==== @@ -25,6 +25,10 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#ifdef HAVE_KERNEL_OPTION_HEADERS +#include "opt_device_polling.h" +#endif + #include <sys/param.h> #include <sys/systm.h> #include <sys/bus.h> @@ -299,13 +303,16 @@ ifp->if_ioctl = npeioctl; ifp->if_watchdog = npewatchdog; ifp->if_init = npeinit; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + IFQ_SET_MAXLEN(&ifp->if_snd, sc->txdma.nbuf - 1); ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); ifp->if_timer = 0; ifp->if_linkmib = &sc->mibdata; ifp->if_linkmiblen = sizeof(sc->mibdata); sc->mibdata.dot3Compliance = DOT3COMPLIANCE_STATS; +#ifdef DEVICE_POLLING + ifp->if_capabilities |= IFCAP_POLLING; +#endif SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "debug", CTLFLAG_RW, &sc->sc_debug, 0, "control debugging printfs"); @@ -327,6 +334,10 @@ struct npe_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; +#ifdef DEVICE_POLLING + if (ifp->if_capenable & IFCAP_POLLING) + ether_poll_deregister(ifp); +#endif npestop(sc); if (ifp != NULL) { ether_ifdetach(ifp); @@ -949,6 +960,19 @@ #undef P2V } +#ifdef DEVICE_POLLING +static void +npe_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) +{ + struct npe_softc *sc = ifp->if_softc; + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + npe_rxdone(sc->rx_qid, sc); + npe_txdone(sc->tx_doneqid, sc); /* XXX polls both NPE's */ + } +} +#endif /* DEVICE_POLLING */ + static void npe_startxmit(struct npe_softc *sc) { @@ -1340,6 +1364,9 @@ struct mii_data *mii; struct ifreq *ifr = (struct ifreq *)data; int error = 0; +#ifdef DEVICE_POLLING + int mask; +#endif switch (cmd) { case SIOCSIFFLAGS: @@ -1369,6 +1396,36 @@ mii = device_get_softc(sc->sc_mii); error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); break; + +#ifdef DEVICE_POLLING + case SIOCSIFCAP: + mask = ifp->if_capenable ^ ifr->ifr_reqcap; + if (mask & IFCAP_POLLING) { + if (ifr->ifr_reqcap & IFCAP_POLLING) { + error = ether_poll_register(npe_poll, ifp); + if (error) + return error; + NPE_LOCK(sc); + /* disable callbacks XXX txdone is shared */ + ixpqmgr_notify_disable(sc->rx_qid); + ixpqmgr_notify_disable(sc->tx_doneqid); + ifp->if_capenable |= IFCAP_POLLING; + NPE_UNLOCK(sc); + } else { + error = ether_poll_deregister(ifp); + /* NB: always enable qmgr callbacks */ + NPE_LOCK(sc); + /* enable qmgr callbacks */ + ixpqmgr_notify_enable(sc->rx_qid, + IX_QMGR_Q_SOURCE_ID_NOT_E); + ixpqmgr_notify_enable(sc->tx_doneqid, + IX_QMGR_Q_SOURCE_ID_NOT_E); + ifp->if_capenable &= ~IFCAP_POLLING; + NPE_UNLOCK(sc); + } + } + break; +#endif default: error = ether_ioctl(ifp, cmd, data); break;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611120326.kAC3QIZN039725>