summaryrefslogtreecommitdiff
path: root/sys/dev/if_ndis/if_ndis.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/if_ndis/if_ndis.c')
-rw-r--r--sys/dev/if_ndis/if_ndis.c81
1 files changed, 45 insertions, 36 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 2237259148ec..e35360c676d2 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -147,7 +147,7 @@ static funcptr ndis_rxeof_xfr_done_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_ifstarttask_wrap;
static funcptr ndis_resettask_wrap;
static funcptr ndis_inputtask_wrap;
@@ -162,11 +162,11 @@ static int ndis_raw_xmit (struct ieee80211_node *, struct mbuf *,
const struct ieee80211_bpf_params *);
static void ndis_update_mcast (struct ieee80211com *);
static void ndis_update_promisc (struct ieee80211com *);
-static void ndis_start (struct ifnet *);
-static void ndis_starttask (device_object *, void *);
+static void ndis_ifstart (struct ifnet *);
+static void ndis_ifstarttask (device_object *, void *);
static void ndis_resettask (device_object *, void *);
static void ndis_inputtask (device_object *, void *);
-static int ndis_ioctl (struct ifnet *, u_long, caddr_t);
+static int ndis_ifioctl (struct ifnet *, u_long, caddr_t);
static int ndis_newstate (struct ieee80211vap *, enum ieee80211_state,
int);
static int ndis_nettype_chan (uint32_t);
@@ -246,7 +246,7 @@ ndisdrv_modevent(mod, cmd, arg)
&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,
+ windrv_wrap((funcptr)ndis_ifstarttask, &ndis_ifstarttask_wrap,
2, WINDRV_WRAP_STDCALL);
windrv_wrap((funcptr)ndis_resettask, &ndis_resettask_wrap,
2, WINDRV_WRAP_STDCALL);
@@ -268,7 +268,7 @@ ndisdrv_modevent(mod, cmd, arg)
windrv_unwrap(ndis_linksts_wrap);
windrv_unwrap(ndis_linksts_done_wrap);
windrv_unwrap(ndis_ticktask_wrap);
- windrv_unwrap(ndis_starttask_wrap);
+ windrv_unwrap(ndis_ifstarttask_wrap);
windrv_unwrap(ndis_resettask_wrap);
windrv_unwrap(ndis_inputtask_wrap);
break;
@@ -292,11 +292,14 @@ ndis_setmulti(sc)
int len, mclistsz, error;
uint8_t *mclist;
- ifp = sc->ifp;
if (!NDIS_INITIALIZED(sc))
return;
+ if (sc->ndis_80211)
+ return;
+
+ ifp = sc->ifp;
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
sc->ndis_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
len = sizeof(sc->ndis_filter);
@@ -368,13 +371,14 @@ ndis_set_offload(sc)
struct ifnet *ifp;
int len, error;
- ifp = sc->ifp;
-
if (!NDIS_INITIALIZED(sc))
return (EINVAL);
+ if (sc->ndis_80211)
+ return (EINVAL);
/* See if there's anything to set. */
+ ifp = sc->ifp;
error = ndis_probe_offload(sc);
if (error)
return (error);
@@ -965,8 +969,8 @@ ndis_ifattach(struct ndis_softc *sc)
if_initname(ifp, device_get_name(sc->ndis_dev),
device_get_unit(sc->ndis_dev));
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
- ifp->if_ioctl = ndis_ioctl;
- ifp->if_start = ndis_start;
+ ifp->if_ioctl = ndis_ifioctl;
+ ifp->if_start = ndis_ifstart;
ifp->if_init = ndis_init;
ifp->if_baudrate = 10000000;
IFQ_SET_MAXLEN(&ifp->if_snd, 50);
@@ -1560,19 +1564,23 @@ ndis_txeof(adapter, packet, status)
sc->ndis_txarray[idx] = NULL;
sc->ndis_txpending++;
- if (status == NDIS_STATUS_SUCCESS)
- if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
- else
- if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
-
+ if (!sc->ndis_80211) {
+ struct ifnet *ifp = sc->ifp;
+ if (status == NDIS_STATUS_SUCCESS)
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
+ else
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ }
sc->ndis_tx_timer = 0;
- ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
NDIS_UNLOCK(sc);
- IoQueueWorkItem(sc->ndis_startitem,
- (io_workitem_func)ndis_starttask_wrap,
- WORKQUEUE_CRITICAL, ifp);
+ if (!sc->ndis_80211)
+ IoQueueWorkItem(sc->ndis_startitem,
+ (io_workitem_func)ndis_ifstarttask_wrap,
+ WORKQUEUE_CRITICAL, sc);
+ DPRINTF(("%s: ndis_ifstarttask_wrap sc=%p\n", __func__, sc));
}
static void
@@ -1635,9 +1643,10 @@ ndis_linksts_done(adapter)
IoQueueWorkItem(sc->ndis_tickitem,
(io_workitem_func)ndis_ticktask_wrap,
WORKQUEUE_CRITICAL, sc);
- IoQueueWorkItem(sc->ndis_startitem,
- (io_workitem_func)ndis_starttask_wrap,
- WORKQUEUE_CRITICAL, ifp);
+ if (!sc->ndis_80211)
+ IoQueueWorkItem(sc->ndis_startitem,
+ (io_workitem_func)ndis_ifstarttask_wrap,
+ WORKQUEUE_CRITICAL, sc);
break;
case NDIS_STATUS_MEDIA_DISCONNECT:
if (sc->ndis_link)
@@ -1672,9 +1681,10 @@ ndis_tick(xsc)
IoQueueWorkItem(sc->ndis_resetitem,
(io_workitem_func)ndis_resettask_wrap,
WORKQUEUE_CRITICAL, sc);
- IoQueueWorkItem(sc->ndis_startitem,
- (io_workitem_func)ndis_starttask_wrap,
- WORKQUEUE_CRITICAL, sc->ifp);
+ if (!sc->ndis_80211)
+ IoQueueWorkItem(sc->ndis_startitem,
+ (io_workitem_func)ndis_ifstarttask_wrap,
+ WORKQUEUE_CRITICAL, sc);
}
callout_reset(&sc->ndis_stat_callout, hz, ndis_tick, sc);
@@ -1796,16 +1806,16 @@ ndis_update_promisc(struct ieee80211com *ic)
}
static void
-ndis_starttask(d, arg)
- device_object *d;
- void *arg;
+ndis_ifstarttask(device_object *d, void *arg)
{
- struct ifnet *ifp;
-
- ifp = arg;
+ struct ndis_softc *sc = arg;
+ DPRINTF(("%s: sc=%p, ifp=%p\n", __func__, sc, sc->ifp));
+ if (sc->ndis_80211)
+ return;
+ struct ifnet *ifp = sc->ifp;
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
- ndis_start(ifp);
+ ndis_ifstart(ifp);
}
/*
@@ -1821,8 +1831,7 @@ ndis_starttask(d, arg)
* will do the mapping themselves on a buffer by buffer basis.
*/
static void
-ndis_start(ifp)
- struct ifnet *ifp;
+ndis_ifstart(struct ifnet *ifp)
{
struct ndis_softc *sc;
struct mbuf *m = NULL;
@@ -2880,7 +2889,7 @@ ndis_getstate_80211(struct ndis_softc *sc)
}
static int
-ndis_ioctl(ifp, command, data)
+ndis_ifioctl(ifp, command, data)
struct ifnet *ifp;
u_long command;
caddr_t data;