summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/if_ndis/if_ndis.c14
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;
}
OpenPOWER on IntegriCloud