aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/if_ndis
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>2005-05-05 03:56:09 +0000
committerBill Paul <wpaul@FreeBSD.org>2005-05-05 03:56:09 +0000
commit9b307fe2be0a43ec3230c3d44c46bb28a0e68b3d (patch)
tree30ee12e28c23fde2935b1a325aa64886d934d365 /sys/dev/if_ndis
parent2eb15b93751924d065a9f0f30bdf18f3646a7b38 (diff)
Notes
Diffstat (limited to 'sys/dev/if_ndis')
-rw-r--r--sys/dev/if_ndis/if_ndis.c66
-rw-r--r--sys/dev/if_ndis/if_ndisvar.h5
2 files changed, 54 insertions, 17 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index cb9e38c492162..072146cbba5ef 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -108,12 +108,16 @@ static funcptr ndis_txeof_wrap;
static funcptr ndis_rxeof_wrap;
static funcptr ndis_linksts_wrap;
static funcptr ndis_linksts_done_wrap;
+static funcptr ndis_ticktask_wrap;
+static funcptr ndis_starttask_wrap;
+static funcptr ndis_resettask_wrap;
static void ndis_intr (void *);
static void ndis_tick (void *);
-static void ndis_ticktask (void *);
+static void ndis_ticktask (ndis_work_item *, void *);
static void ndis_start (struct ifnet *);
-static void ndis_starttask (void *);
+static void ndis_starttask (ndis_work_item *, void *);
+static void ndis_resettask (ndis_work_item *, void *);
static int ndis_ioctl (struct ifnet *, u_long, caddr_t);
static int ndis_wi_ioctl_get (struct ifnet *, u_long, caddr_t);
static int ndis_wi_ioctl_set (struct ifnet *, u_long, caddr_t);
@@ -167,21 +171,26 @@ ndisdrv_modevent(mod, cmd, arg)
4, WINDRV_WRAP_STDCALL);
windrv_wrap((funcptr)ndis_linksts_done,
&ndis_linksts_done_wrap, 1, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_ticktask, &ndis_ticktask_wrap,
+ 2, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_starttask, &ndis_starttask_wrap,
+ 2, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_resettask, &ndis_resettask_wrap,
+ 2, WINDRV_WRAP_STDCALL);
break;
case MOD_UNLOAD:
ndisdrv_loaded--;
if (ndisdrv_loaded > 0)
break;
- windrv_unwrap(ndis_rxeof_wrap);
- windrv_unwrap(ndis_txeof_wrap);
- windrv_unwrap(ndis_linksts_wrap);
- windrv_unwrap(ndis_linksts_done_wrap);
- break;
+ /* fallthrough */
case MOD_SHUTDOWN:
windrv_unwrap(ndis_rxeof_wrap);
windrv_unwrap(ndis_txeof_wrap);
windrv_unwrap(ndis_linksts_wrap);
windrv_unwrap(ndis_linksts_done_wrap);
+ windrv_unwrap(ndis_ticktask_wrap);
+ windrv_unwrap(ndis_starttask_wrap);
+ windrv_unwrap(ndis_resettask_wrap);
break;
default:
error = EINVAL;
@@ -795,6 +804,15 @@ nonettypes:
/* Override the status handler so we can detect link changes. */
sc->ndis_block->nmb_status_func = ndis_linksts_wrap;
sc->ndis_block->nmb_statusdone_func = ndis_linksts_done_wrap;
+
+ /* Set up work item handlers. */
+ NdisInitializeWorkItem(&sc->ndis_tickitem,
+ (work_item_func)ndis_ticktask_wrap, sc);
+ NdisInitializeWorkItem(&sc->ndis_startitem,
+ (work_item_func)ndis_starttask_wrap, ifp);
+ NdisInitializeWorkItem(&sc->ndis_resetitem,
+ (work_item_func)ndis_resettask_wrap, sc);
+
fail:
if (error)
ndis_detach(dev);
@@ -1062,9 +1080,10 @@ ndis_txeof(adapter, packet, status)
ifp->if_oerrors++;
ifp->if_timer = 0;
ifp->if_flags &= ~IFF_OACTIVE;
+
NDIS_UNLOCK(sc);
- ndis_sched(ndis_starttask, ifp, NDIS_TASKQUEUE);
+ NdisScheduleWorkItem(&sc->ndis_startitem);
return;
}
@@ -1104,12 +1123,12 @@ ndis_linksts_done(adapter)
switch (block->nmb_getstat) {
case NDIS_STATUS_MEDIA_CONNECT:
- ndis_sched(ndis_ticktask, sc, NDIS_TASKQUEUE);
- ndis_sched(ndis_starttask, ifp, NDIS_TASKQUEUE);
+ NdisScheduleWorkItem(&sc->ndis_tickitem);
+ NdisScheduleWorkItem(&sc->ndis_startitem);
break;
case NDIS_STATUS_MEDIA_DISCONNECT:
if (sc->ndis_link)
- ndis_sched(ndis_ticktask, sc, NDIS_TASKQUEUE);
+ NdisScheduleWorkItem(&sc->ndis_tickitem);
break;
default:
break;
@@ -1161,7 +1180,7 @@ ndis_tick(xsc)
sc = xsc;
- ndis_sched(ndis_ticktask, sc, NDIS_TASKQUEUE);
+ NdisScheduleWorkItem(&sc->ndis_tickitem);
sc->ndis_stat_ch = timeout(ndis_tick, sc, hz *
sc->ndis_block->nmb_checkforhangsecs);
@@ -1171,7 +1190,8 @@ ndis_tick(xsc)
}
static void
-ndis_ticktask(xsc)
+ndis_ticktask(w, xsc)
+ ndis_work_item *w;
void *xsc;
{
struct ndis_softc *sc;
@@ -1254,12 +1274,14 @@ ndis_map_sclist(arg, segs, nseg, mapsize, error)
}
static void
-ndis_starttask(arg)
+ndis_starttask(w, arg)
+ ndis_work_item *w;
void *arg;
{
struct ifnet *ifp;
ifp = arg;
+
#if __FreeBSD_version < 502114
if (ifp->if_snd.ifq_head != NULL)
#else
@@ -2703,6 +2725,18 @@ ndis_80211_ioctl_set(struct ifnet *ifp, u_long command, caddr_t data)
}
static void
+ndis_resettask(w, arg)
+ ndis_work_item *w;
+ void *arg;
+{
+ struct ndis_softc *sc;
+
+ sc = arg;
+ ndis_reset_nic(sc);
+ return;
+}
+
+static void
ndis_watchdog(ifp)
struct ifnet *ifp;
{
@@ -2715,8 +2749,8 @@ ndis_watchdog(ifp)
device_printf(sc->ndis_dev, "watchdog timeout\n");
NDIS_UNLOCK(sc);
- ndis_sched((void(*)(void *))ndis_reset_nic, sc, NDIS_TASKQUEUE);
- ndis_sched(ndis_starttask, ifp, NDIS_TASKQUEUE);
+ NdisScheduleWorkItem(&sc->ndis_resetitem);
+ NdisScheduleWorkItem(&sc->ndis_startitem);
return;
}
diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h
index 68f30f9cff1aa..06f394e2caa8e 100644
--- a/sys/dev/if_ndis/if_ndisvar.h
+++ b/sys/dev/if_ndis/if_ndisvar.h
@@ -52,6 +52,7 @@ struct ndis_shmem {
bus_dma_tag_t ndis_stag;
bus_dmamap_t ndis_smap;
void *ndis_saddr;
+ ndis_physaddr ndis_paddr;
struct ndis_shmem *ndis_next;
};
@@ -123,7 +124,9 @@ struct ndis_softc {
int ndis_devidx;
interface_type ndis_iftype;
driver_object *ndis_dobj;
-
+ ndis_work_item ndis_tickitem;
+ ndis_work_item ndis_startitem;
+ ndis_work_item ndis_resetitem;
bus_dma_tag_t ndis_parent_tag;
struct ndis_shmem *ndis_shlist;
bus_dma_tag_t ndis_mtag;