diff options
author | wpaul <wpaul@FreeBSD.org> | 2003-12-14 22:47:01 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2003-12-14 22:47:01 +0000 |
commit | 27d0a79cf6dccd9b00901fa7d3ccc693b15d4dfe (patch) | |
tree | 15fdb2c617d4b4c5163171f6dde469d3adbad6a1 /sys/dev/if_ndis/if_ndis.c | |
parent | 4b34c74772fe82daa10ee38585314499fdb8629b (diff) | |
download | FreeBSD-src-27d0a79cf6dccd9b00901fa7d3ccc693b15d4dfe.zip FreeBSD-src-27d0a79cf6dccd9b00901fa7d3ccc693b15d4dfe.tar.gz |
Silence irritating watchdog timeout messages: if we call
ndis_send_packets() but there's no link yet, we get an immediate
callback to ndis_txeof(), which clears if_timer. But ndis_start()
sets if_timer right after the call to ndis_send_packets(). Set
if_timer before calling ndis_send_packets().
Also fix mutex locking to prevent ndis_txeof() from running in
the middle of ndis_start().
Diffstat (limited to 'sys/dev/if_ndis/if_ndis.c')
-rw-r--r-- | sys/dev/if_ndis/if_ndis.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index c96d918..b6beb3d 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -523,6 +523,8 @@ ndis_txeof(adapter, packet, status) if (packet->np_rsvd[1] == NULL) panic("NDIS driver corrupted reserved packet fields"); + NDIS_LOCK(sc); + m = (struct mbuf *)packet->np_rsvd[1]; idx = (int)packet->np_rsvd[0]; ifp->if_opackets++; @@ -537,6 +539,8 @@ ndis_txeof(adapter, packet, status) ifp->if_timer = 0; ifp->if_flags &= ~IFF_OACTIVE; + NDIS_UNLOCK(sc); + if (ifp->if_snd.ifq_head != NULL) ndis_start(ifp); @@ -653,6 +657,8 @@ ndis_start(ifp) sc = ifp->if_softc; + NDIS_LOCK(sc); + p0 = &sc->ndis_txarray[sc->ndis_txidx]; while(sc->ndis_txpending) { @@ -660,7 +666,6 @@ ndis_start(ifp) if (m == NULL) break; - NDIS_LOCK(sc); sc->ndis_txarray[sc->ndis_txidx] = NULL; if (ndis_mtop(m, &sc->ndis_txarray[sc->ndis_txidx])) { @@ -694,7 +699,6 @@ ndis_start(ifp) NDIS_INC(sc); sc->ndis_txpending--; - NDIS_UNLOCK(sc); pcnt++; @@ -720,13 +724,15 @@ ndis_start(ifp) if (sc->ndis_txpending == 0) ifp->if_flags |= IFF_OACTIVE; - ndis_send_packets(sc, p0, pcnt); - /* * Set a timeout in case the chip goes out to lunch. */ ifp->if_timer = 5; + NDIS_UNLOCK(sc); + + ndis_send_packets(sc, p0, pcnt); + return; } |