diff options
-rw-r--r-- | sys/compat/ndis/ndis_var.h | 10 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndis.c | 43 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndisvar.h | 2 |
3 files changed, 45 insertions, 10 deletions
diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h index 3a2f953..2f37322 100644 --- a/sys/compat/ndis/ndis_var.h +++ b/sys/compat/ndis/ndis_var.h @@ -808,7 +808,7 @@ typedef struct ndis_request ndis_request; */ struct ndis_miniport_interrupt { void *ni_introbj; - ndis_spin_lock ni_dpccountlock; + ndis_kspin_lock ni_dpccountlock; void *ni_rsvd; void *ni_isrfunc; void *ni_dpcfunc; @@ -1157,6 +1157,14 @@ struct ndis_timer_entry { TAILQ_HEAD(nte_head, ndis_timer_entry); +struct ndis_fh { + void *nf_vp; + void *nf_map; + uint32_t nf_maplen; +}; + +typedef struct ndis_fh ndis_fh; + /* * The miniport block is basically the internal NDIS handle. We need * to define this because, unfortunately, it is not entirely opaque diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 2870b4d..6b5b78f 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -108,7 +108,9 @@ static __stdcall void ndis_linksts_done (ndis_handle); static void ndis_intr (void *); static void ndis_intrtask (void *, int); static void ndis_tick (void *); +static void ndis_ticktask (void *, int); static void ndis_start (struct ifnet *); +static void ndis_starttask (void *, int); static int ndis_ioctl (struct ifnet *, u_long, caddr_t); static void ndis_init (void *); static void ndis_stop (struct ndis_softc *); @@ -332,6 +334,8 @@ ndis_attach(dev) mtx_init(&sc->ndis_intrmtx, device_get_nameunit(dev), "ndisisrlock", MTX_DEF | MTX_RECURSE); TASK_INIT(&sc->ndis_intrtask, 0, ndis_intrtask, sc); + TASK_INIT(&sc->ndis_ticktask, 0, ndis_ticktask, sc); + TASK_INIT(&sc->ndis_starttask, 0, ndis_starttask, sc); /* * Allocate the parent bus DMA tag appropriate for PCI. @@ -772,8 +776,7 @@ ndis_txeof(adapter, packet, status) m_freem(m); - if (ifp->if_snd.ifq_head != NULL) - ndis_start(ifp); + taskqueue_enqueue(taskqueue_swi, &sc->ndis_starttask); return; } @@ -814,8 +817,7 @@ ndis_linksts_done(adapter) device_printf(sc->ndis_dev, "link up\n"); if (sc->ndis_80211) ndis_getstate_80211(sc); - if (ifp->if_snd.ifq_head != NULL) - ndis_start(ifp); + taskqueue_enqueue(taskqueue_swi, &sc->ndis_starttask); break; case NDIS_STATUS_MEDIA_DISCONNECT: device_printf(sc->ndis_dev, "link down\n"); @@ -887,6 +889,16 @@ ndis_tick(xsc) void *xsc; { struct ndis_softc *sc; + sc = xsc; + taskqueue_enqueue(taskqueue_swi, &sc->ndis_ticktask); +} + +static void +ndis_ticktask(xsc, pending) + void *xsc; + int pending; +{ + struct ndis_softc *sc; __stdcall ndis_checkforhang_handler hangfunc; uint8_t rval; ndis_media_state linkstate; @@ -946,6 +958,19 @@ ndis_map_sclist(arg, segs, nseg, mapsize, error) return; } +static void +ndis_starttask(arg, pending) + void *arg; + int pending; +{ + struct ifnet *ifp; + + ifp = arg; + if (ifp->if_snd.ifq_head != NULL) + ndis_start(ifp); + return; +} + /* * Main transmit routine. To make NDIS drivers happy, we need to * transform mbuf chains into NDIS packets and feed them to the @@ -1120,12 +1145,12 @@ ndis_init(xsc) * the default checkforhang timeout is approximately 2 * seconds. */ + if (sc->ndis_block.nmb_checkforhangsecs == 0) sc->ndis_block.nmb_checkforhangsecs = 2; - if (sc->ndis_chars.nmc_checkhang_func != NULL) - sc->ndis_stat_ch = timeout(ndis_tick, sc, - hz * sc->ndis_block.nmb_checkforhangsecs); + sc->ndis_stat_ch = timeout(ndis_tick, sc, + hz * sc->ndis_block.nmb_checkforhangsecs); /*NDIS_UNLOCK(sc);*/ @@ -1486,8 +1511,8 @@ ndis_watchdog(ifp) ndis_reset(sc); - if (ifp->if_snd.ifq_head != NULL) - ndis_start(ifp); + taskqueue_enqueue(taskqueue_swi, &sc->ndis_starttask); + NDIS_UNLOCK(sc); return; diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h index 01d8491..2987aae 100644 --- a/sys/dev/if_ndis/if_ndisvar.h +++ b/sys/dev/if_ndis/if_ndisvar.h @@ -93,6 +93,8 @@ struct ndis_softc { struct mtx ndis_mtx; struct mtx ndis_intrmtx; struct task ndis_intrtask; + struct task ndis_ticktask; + struct task ndis_starttask; device_t ndis_dev; int ndis_unit; ndis_miniport_block ndis_block; |