diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 6c842a6..9d3e5b9 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -533,7 +533,8 @@ ndis_attach(dev) sc = device_get_softc(dev); - KeInitializeSpinLock(&sc->ndis_spinlock); + mtx_init(&sc->ndis_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, + MTX_DEF); KeInitializeSpinLock(&sc->ndis_rxlock); InitializeListHead(&sc->ndis_shlist); callout_init(&sc->ndis_stat_callout, CALLOUT_MPSAFE); @@ -1644,7 +1645,6 @@ ndis_tick(xsc) struct ndis_softc *sc; sc = xsc; - NDIS_LOCK(sc); if (sc->ndis_hang_timer && --sc->ndis_hang_timer == 0) { IoQueueWorkItem(sc->ndis_tickitem, @@ -1654,6 +1654,7 @@ ndis_tick(xsc) } if (sc->ndis_tx_timer && --sc->ndis_tx_timer == 0) { + NDIS_LOCK(sc); sc->ifp->if_oerrors++; device_printf(sc->ndis_dev, "watchdog timeout\n"); @@ -1663,10 +1664,10 @@ ndis_tick(xsc) IoQueueWorkItem(sc->ndis_startitem, (io_workitem_func)ndis_starttask_wrap, WORKQUEUE_CRITICAL, sc->ifp); + NDIS_UNLOCK(sc); } callout_reset(&sc->ndis_stat_callout, hz, ndis_tick, sc); - NDIS_UNLOCK(sc); } static void diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h index d902d66..c339e16 100644 --- a/sys/dev/if_ndis/if_ndisvar.h +++ b/sys/dev/if_ndis/if_ndisvar.h @@ -129,7 +129,7 @@ struct ndis_softc { struct resource *ndis_res_cm; /* common mem (pccard) */ struct resource_list ndis_rl; int ndis_rescnt; - kspin_lock ndis_spinlock; + struct mtx ndis_mtx; uint8_t ndis_irql; device_t ndis_dev; int ndis_unit; @@ -185,7 +185,5 @@ struct ndis_softc { int ndis_hang_timer; }; -#define NDIS_LOCK(_sc) KeAcquireSpinLock(&(_sc)->ndis_spinlock, \ - &(_sc)->ndis_irql); -#define NDIS_UNLOCK(_sc) KeReleaseSpinLock(&(_sc)->ndis_spinlock, \ - (_sc)->ndis_irql); +#define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx) +#define NDIS_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx)