nve(4) timeout fix
Yuri Pankov
yuri.pankov at gmail.com
Thu Apr 27 14:40:30 UTC 2006
Nathan Whitehorn wrote:
> Also on the subject of nVidia NICs, I've fixed the device timeout
> problem on nve(4). It appears that some revisions of the hardware don't
> send interrupts on tx completion, which caused watchdog timeouts under
> low load. We should take this hardware quirk into account for the nfe
> port as well.
> -Nathan
>
> --- if_nve_original.c Wed Apr 26 22:23:14 2006
> +++ if_nve.c Wed Apr 26 21:52:34 2006
> @@ -1270,6 +1270,18 @@
> nve_watchdog(struct ifnet *ifp)
> {
> struct nve_softc *sc = ifp->if_softc;
> +
> + NVE_LOCK(sc);
> + /* Check for lost interrupts -- happens on nForce4 */
> + sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX);
> + sc->hwapi->pfnHandleInterrupt(sc->hwapi->pADCX);
> + sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
> +
> + if (sc->pending_txs == 0) {
> + NVE_UNLOCK(sc);
> + return; /* Problem went away */
> + }
> + NVE_UNLOCK(sc);
>
> device_printf(sc->dev, "device timeout (%d)\n", sc->pending_txs);
>
Indeed, it seems to solve timeout() messages. Haven't got any so far.
Thank you!
one small correction - this patch doesn't apply cleanly to -current
source, so I've patched source by hand and here's patch for -current:
--- if_nve.c.orig Mon Dec 12 09:23:43 2005
+++ if_nve.c Thu Apr 27 18:23:48 2006
@@ -1277,6 +1277,18 @@
{
struct nve_softc *sc = ifp->if_softc;
+ NVE_LOCK(sc);
+ /* Check for lost interrupts -- happens on nForce4 */
+ sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX);
+ sc->hwapi->pfnHandleInterrupt(sc->hwapi->pADCX);
+ sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
+
+ if (sc->pending_txs == 0) {
+ NVE_UNLOCK(sc);
+ return; /* Problem went away */
+ }
+ NVE_UNLOCK(sc);
+
device_printf(sc->dev, "device timeout (%d)\n", c->pending_txs);
NVE_LOCK(sc);
Yuri
More information about the freebsd-amd64
mailing list