svn commit: r191108 - in user/thompsa/vaptq/sys/dev: if_ndis ipw
iwi iwn
Andrew Thompson
thompsa at FreeBSD.org
Wed Apr 15 10:05:21 PDT 2009
Author: thompsa
Date: Wed Apr 15 17:05:20 2009
New Revision: 191108
URL: http://svn.freebsd.org/changeset/base/191108
Log:
Remove the deferral of scanning calls now that it can sleep.
Modified:
user/thompsa/vaptq/sys/dev/if_ndis/if_ndis.c
user/thompsa/vaptq/sys/dev/if_ndis/if_ndisvar.h
user/thompsa/vaptq/sys/dev/ipw/if_ipw.c
user/thompsa/vaptq/sys/dev/ipw/if_ipwvar.h
user/thompsa/vaptq/sys/dev/iwi/if_iwi.c
user/thompsa/vaptq/sys/dev/iwi/if_iwivar.h
user/thompsa/vaptq/sys/dev/iwn/if_iwn.c
user/thompsa/vaptq/sys/dev/iwn/if_iwnvar.h
Modified: user/thompsa/vaptq/sys/dev/if_ndis/if_ndis.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/if_ndis/if_ndis.c Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/if_ndis/if_ndis.c Wed Apr 15 17:05:20 2009 (r191108)
@@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/sysctl.h>
#include <sys/kthread.h>
-#include <sys/taskqueue.h>
#include <net/if.h>
@@ -173,7 +172,7 @@ static int ndis_newstate (struct ieee802
int);
static int ndis_nettype_chan (uint32_t);
static int ndis_nettype_mode (uint32_t);
-static void ndis_scan (void *, int);
+static void ndis_scan (void *);
static void ndis_scan_results (struct ndis_softc *);
static void ndis_scan_start (struct ieee80211com *);
static void ndis_scan_end (struct ieee80211com *);
@@ -739,11 +738,7 @@ ndis_attach(dev)
uint32_t arg;
int r;
- sc->ndis_tq = taskqueue_create("nids_taskq", M_NOWAIT | M_ZERO,
- taskqueue_thread_enqueue, &sc->ndis_tq);
- taskqueue_start_threads(&sc->ndis_tq, 1, PI_NET, "%s taskq",
- device_get_nameunit(dev));
- TASK_INIT(&sc->ndis_scantask, 0, ndis_scan, sc);
+ callout_init(&sc->ndis_scan_callout, CALLOUT_MPSAFE);
ifp->if_ioctl = ndis_ioctl_80211;
ic->ic_ifp = ifp;
@@ -1050,10 +1045,6 @@ ndis_detach(dev)
} else
NDIS_UNLOCK(sc);
- if (sc->ndis_80211) {
- taskqueue_drain(sc->ndis_tq, &sc->ndis_scantask);
- }
-
if (sc->ndis_tickitem != NULL)
IoFreeWorkItem(sc->ndis_tickitem);
if (sc->ndis_startitem != NULL)
@@ -1115,8 +1106,6 @@ ndis_detach(dev)
if (sc->ndis_iftype == PCIBus)
bus_dma_tag_destroy(sc->ndis_parent_tag);
- if (sc->ndis_80211)
- taskqueue_free(sc->ndis_tq);
return(0);
}
@@ -3289,54 +3278,18 @@ ndis_newstate(struct ieee80211vap *vap,
}
static void
-ndis_scan(void *arg, int npending)
+ndis_scan(void *arg)
{
struct ndis_softc *sc = arg;
struct ieee80211com *ic;
struct ieee80211vap *vap;
- struct ieee80211_scan_state *ss;
- ndis_80211_ssid ssid;
- int error, len;
ic = sc->ifp->if_l2com;
- ss = ic->ic_scan;
vap = TAILQ_FIRST(&ic->ic_vaps);
- if (!NDIS_INITIALIZED(sc)) {
- DPRINTF(("%s: scan aborted\n", __func__));
- ieee80211_cancel_scan(vap);
- return;
- }
-
- len = sizeof(ssid);
- bzero((char *)&ssid, len);
- if (ss->ss_nssid == 0)
- ssid.ns_ssidlen = 1;
- else {
- /* Perform a directed scan */
- ssid.ns_ssidlen = ss->ss_ssid[0].len;
- bcopy(ss->ss_ssid[0].ssid, ssid.ns_ssid, ssid.ns_ssidlen);
- }
-
- error = ndis_set_info(sc, OID_802_11_SSID, &ssid, &len);
- if (error)
- DPRINTF(("%s: set ESSID failed\n", __func__));
-
- len = 0;
- error = ndis_set_info(sc, OID_802_11_BSSID_LIST_SCAN,
- NULL, &len);
- if (error) {
- DPRINTF(("%s: scan command failed\n", __func__));
- ieee80211_cancel_scan(vap);
- return;
- }
-
- pause("ssidscan", hz * 3);
- if (!NDIS_INITIALIZED(sc))
- /* The interface was downed while we were sleeping */
- return;
-
+ NDIS_LOCK(sc);
ndis_scan_results(sc);
+ NDIS_UNLOCK(sc);
ieee80211_scan_done(vap);
}
@@ -3467,8 +3420,48 @@ ndis_scan_start(struct ieee80211com *ic)
{
struct ifnet *ifp = ic->ic_ifp;
struct ndis_softc *sc = ifp->if_softc;
+ struct ieee80211vap *vap;
+ struct ieee80211_scan_state *ss;
+ ndis_80211_ssid ssid;
+ int error, len;
+
+ ss = ic->ic_scan;
+ vap = TAILQ_FIRST(&ic->ic_vaps);
+
+ NDIS_LOCK(sc);
+ if (!NDIS_INITIALIZED(sc)) {
+ DPRINTF(("%s: scan aborted\n", __func__));
+ NDIS_UNLOCK(sc);
+ ieee80211_cancel_scan(vap);
+ return;
+ }
+
+ len = sizeof(ssid);
+ bzero((char *)&ssid, len);
+ if (ss->ss_nssid == 0)
+ ssid.ns_ssidlen = 1;
+ else {
+ /* Perform a directed scan */
+ ssid.ns_ssidlen = ss->ss_ssid[0].len;
+ bcopy(ss->ss_ssid[0].ssid, ssid.ns_ssid, ssid.ns_ssidlen);
+ }
+
+ error = ndis_set_info(sc, OID_802_11_SSID, &ssid, &len);
+ if (error)
+ DPRINTF(("%s: set ESSID failed\n", __func__));
- taskqueue_enqueue(sc->ndis_tq, &sc->ndis_scantask);
+ len = 0;
+ error = ndis_set_info(sc, OID_802_11_BSSID_LIST_SCAN,
+ NULL, &len);
+ if (error) {
+ DPRINTF(("%s: scan command failed\n", __func__));
+ NDIS_UNLOCK(sc);
+ ieee80211_cancel_scan(vap);
+ return;
+ }
+ NDIS_UNLOCK(sc);
+ /* Set a timer to collect the results */
+ callout_reset(&sc->ndis_scan_callout, hz * 3, ndis_scan, sc);
}
static void
Modified: user/thompsa/vaptq/sys/dev/if_ndis/if_ndisvar.h
==============================================================================
--- user/thompsa/vaptq/sys/dev/if_ndis/if_ndisvar.h Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/if_ndis/if_ndisvar.h Wed Apr 15 17:05:20 2009 (r191108)
@@ -180,6 +180,7 @@ struct ndis_softc {
ndis_miniport_block *ndis_block;
ndis_miniport_characteristics *ndis_chars;
interface_type ndis_type;
+ struct callout ndis_scan_callout;
struct callout ndis_stat_callout;
int ndis_maxpkts;
ndis_oid *ndis_oids;
@@ -219,8 +220,6 @@ struct ndis_softc {
struct ifqueue ndis_rxqueue;
kspin_lock ndis_rxlock;
- struct taskqueue *ndis_tq; /* private task queue */
- struct task ndis_scantask;
int (*ndis_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
int ndis_tx_timer;
Modified: user/thompsa/vaptq/sys/dev/ipw/if_ipw.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/ipw/if_ipw.c Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/ipw/if_ipw.c Wed Apr 15 17:05:20 2009 (r191108)
@@ -120,7 +120,6 @@ static uint16_t ipw_read_prom_word(struc
static void ipw_rx_cmd_intr(struct ipw_softc *, struct ipw_soft_buf *);
static void ipw_assocsuccess(void *, int);
static void ipw_assocfailed(void *, int);
-static void ipw_scandone(void *, int);
static void ipw_bmiss(void *, int);
static void ipw_rx_newstate_intr(struct ipw_softc *, struct ipw_soft_buf *);
static void ipw_rx_data_intr(struct ipw_softc *, struct ipw_status *,
@@ -166,7 +165,6 @@ static void ipw_read_mem_1(struct ipw_so
#endif
static void ipw_write_mem_1(struct ipw_softc *, bus_size_t,
const uint8_t *, bus_size_t);
-static void ipw_scan_task(void *, int);
static int ipw_scan(struct ipw_softc *);
static void ipw_scan_start(struct ieee80211com *);
static void ipw_scan_end(struct ieee80211com *);
@@ -239,7 +237,6 @@ ipw_attach(device_t dev)
MTX_DEF | MTX_RECURSE);
TASK_INIT(&sc->sc_init_task, 0, ipw_init_task, sc);
- TASK_INIT(&sc->sc_scan_task, 0, ipw_scan_task, sc);
TASK_INIT(&sc->sc_bmiss_task, 0, ipw_bmiss, sc);
callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0);
@@ -418,7 +415,6 @@ ipw_detach(device_t dev)
callout_drain(&sc->sc_wdtimer);
taskqueue_drain(taskqueue_fast, &sc->sc_init_task);
- taskqueue_drain(taskqueue_fast, &sc->sc_scan_task);
taskqueue_drain(taskqueue_fast, &sc->sc_bmiss_task);
ipw_release(sc);
@@ -513,7 +509,6 @@ ipw_vap_create(struct ieee80211com *ic,
TASK_INIT(&ivp->assoc_success_task, 0, ipw_assocsuccess, vap);
TASK_INIT(&ivp->assoc_failed_task, 0, ipw_assocfailed, vap);
- TASK_INIT(&ivp->scandone_task, 0, ipw_scandone, vap);
ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
/* override with driver methods */
@@ -1032,14 +1027,6 @@ ipw_assocfailed(void *arg, int npending)
}
static void
-ipw_scandone(void *arg, int npending)
-{
- struct ieee80211vap *vap = arg;
-
- ieee80211_scan_done(vap);
-}
-
-static void
ipw_bmiss(void *arg, int npending)
{
struct ieee80211com *ic = arg;
@@ -1106,8 +1093,7 @@ ipw_rx_newstate_intr(struct ipw_softc *s
break;
}
if (sc->flags & IPW_FLAG_SCANNING) {
- taskqueue_enqueue(taskqueue_swi,
- &IPW_VAP(vap)->scandone_task);
+ ieee80211_scan_done(vap);
sc->flags &= ~IPW_FLAG_SCANNING;
sc->sc_scan_timer = 0;
}
@@ -2177,20 +2163,6 @@ ipw_setscanopts(struct ipw_softc *sc, ui
return ipw_cmd(sc, IPW_CMD_SET_SCAN_OPTIONS, &opts, sizeof(opts));
}
-/*
- * Handler for sc_scan_task. This is a simple wrapper around ipw_scan().
- */
-static void
-ipw_scan_task(void *context, int pending)
-{
- struct ipw_softc *sc = context;
- IPW_LOCK_DECL;
-
- IPW_LOCK(sc);
- ipw_scan(sc);
- IPW_UNLOCK(sc);
-}
-
static int
ipw_scan(struct ipw_softc *sc)
{
@@ -2722,8 +2694,7 @@ ipw_scan_start(struct ieee80211com *ic)
IPW_LOCK_DECL;
IPW_LOCK(sc);
- if (!(sc->flags & IPW_FLAG_SCANNING))
- taskqueue_enqueue(taskqueue_swi, &sc->sc_scan_task);
+ ipw_scan(sc);
IPW_UNLOCK(sc);
}
Modified: user/thompsa/vaptq/sys/dev/ipw/if_ipwvar.h
==============================================================================
--- user/thompsa/vaptq/sys/dev/ipw/if_ipwvar.h Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/ipw/if_ipwvar.h Wed Apr 15 17:05:20 2009 (r191108)
@@ -80,7 +80,6 @@ struct ipw_vap {
struct ieee80211vap vap;
struct task assoc_success_task;
struct task assoc_failed_task;
- struct task scandone_task;
int (*newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
@@ -93,8 +92,6 @@ struct ipw_softc {
struct mtx sc_mtx;
struct task sc_init_task;
- struct task sc_scan_task;
- struct task sc_chan_task;
struct task sc_bmiss_task;
struct callout sc_wdtimer; /* watchdog timer */
Modified: user/thompsa/vaptq/sys/dev/iwi/if_iwi.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/iwi/if_iwi.c Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/iwi/if_iwi.c Wed Apr 15 17:05:20 2009 (r191108)
@@ -186,12 +186,8 @@ static void iwi_put_firmware(struct iwi_
static int iwi_scanchan(struct iwi_softc *, unsigned long, int);
static void iwi_scan_start(struct ieee80211com *);
static void iwi_scan_end(struct ieee80211com *);
-static void iwi_scanabort(void *, int);
static void iwi_set_channel(struct ieee80211com *);
static void iwi_scan_curchan(struct ieee80211_scan_state *, unsigned long maxdwell);
-#if 0
-static void iwi_scan_allchan(struct ieee80211com *, unsigned long maxdwell);
-#endif
static void iwi_scan_mindwell(struct ieee80211_scan_state *);
static void iwi_ops(void *, int);
static int iwi_queue_cmd(struct iwi_softc *, int, unsigned long);
@@ -309,7 +305,6 @@ iwi_attach(device_t dev)
TASK_INIT(&sc->sc_radiofftask, 0, iwi_radio_off, sc);
TASK_INIT(&sc->sc_restarttask, 0, iwi_restart, sc);
TASK_INIT(&sc->sc_opstask, 0, iwi_ops, sc);
- TASK_INIT(&sc->sc_scanaborttask, 0, iwi_scanabort, sc);
callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0);
callout_init_mtx(&sc->sc_rftimer, &sc->sc_mtx, 0);
@@ -2666,7 +2661,7 @@ scan_band(const struct ieee80211_channel
* Start a scan on the current channel or all channels.
*/
static int
-iwi_scanchan(struct iwi_softc *sc, unsigned long maxdwell, int mode)
+iwi_scanchan(struct iwi_softc *sc, unsigned long maxdwell, int allchan)
{
struct ieee80211com *ic;
struct ieee80211_channel *chan;
@@ -2713,7 +2708,7 @@ iwi_scanchan(struct iwi_softc *sc, unsig
return (error);
}
- if (mode == IWI_SCAN_ALLCHAN) {
+ if (allchan) {
int i, next, band, b, bstart;
/*
* Convert scan list to run-length encoded channel list
@@ -2782,20 +2777,6 @@ iwi_scanchan(struct iwi_softc *sc, unsig
return (iwi_cmd(sc, IWI_CMD_SCAN_EXT, &scan, sizeof scan));
}
-static void
-iwi_scanabort(void *arg, int npending)
-{
- struct iwi_softc *sc = arg;
- IWI_LOCK_DECL;
-
- IWI_LOCK(sc);
- sc->flags &= ~IWI_FLAG_CHANNEL_SCAN;
- /* NB: make sure we're still scanning */
- if (sc->fw_state == IWI_FW_SCANNING)
- iwi_cmd(sc, IWI_CMD_ABORT_SCAN, NULL, 0);
- IWI_UNLOCK(sc);
-}
-
static int
iwi_set_sensitivity(struct iwi_softc *sc, int8_t rssi_dbm)
{
@@ -3538,11 +3519,7 @@ iwi_ops(void *arg0, int npending)
{
static const char *opnames[] = {
[IWI_CMD_FREE] = "FREE",
- [IWI_SCAN_START] = "SCAN_START",
- [IWI_SET_CHANNEL] = "SET_CHANNEL",
[IWI_DISASSOC] = "DISASSOC",
- [IWI_SCAN_CURCHAN] = "SCAN_CURCHAN",
- [IWI_SCAN_ALLCHAN] = "SCAN_ALLCHAN",
[IWI_SET_WME] = "SET_WME",
};
struct iwi_softc *sc = arg0;
@@ -3585,21 +3562,7 @@ again:
if (vap->iv_state == IEEE80211_S_RUN)
(void) iwi_wme_setparams(sc, ic);
break;
- case IWI_SCAN_START:
- sc->flags |= IWI_FLAG_CHANNEL_SCAN;
- break;
- case IWI_SCAN_CURCHAN:
- case IWI_SCAN_ALLCHAN:
- if (!(sc->flags & IWI_FLAG_CHANNEL_SCAN)) {
- DPRINTF(("%s: ic_scan_curchan while not scanning\n",
- __func__));
- goto done;
- }
- if (iwi_scanchan(sc, arg, cmd))
- ieee80211_cancel_scan(vap);
- break;
}
-done:
IWI_UNLOCK(sc);
/* Take another pass */
@@ -3627,10 +3590,7 @@ iwi_queue_cmd(struct iwi_softc *sc, int
static void
iwi_scan_start(struct ieee80211com *ic)
{
- struct ifnet *ifp = ic->ic_ifp;
- struct iwi_softc *sc = ifp->if_softc;
-
- iwi_queue_cmd(sc, IWI_SCAN_START, 0);
+ /* ignore */
}
static void
@@ -3648,20 +3608,13 @@ iwi_scan_curchan(struct ieee80211_scan_s
struct ieee80211vap *vap = ss->ss_vap;
struct ifnet *ifp = vap->iv_ic->ic_ifp;
struct iwi_softc *sc = ifp->if_softc;
+ IWI_LOCK_DECL;
- iwi_queue_cmd(sc, IWI_SCAN_CURCHAN, maxdwell);
-}
-
-#if 0
-static void
-iwi_scan_allchan(struct ieee80211com *ic, unsigned long maxdwell)
-{
- struct ifnet *ifp = ic->ic_ifp;
- struct iwi_softc *sc = ifp->if_softc;
-
- iwi_queue_cmd(sc, IWI_SCAN_ALLCHAN, maxdwell);
+ IWI_LOCK(sc);
+ if (iwi_scanchan(sc, maxdwell, 0))
+ ieee80211_cancel_scan(vap);
+ IWI_UNLOCK(sc);
}
-#endif
static void
iwi_scan_mindwell(struct ieee80211_scan_state *ss)
@@ -3674,6 +3627,12 @@ iwi_scan_end(struct ieee80211com *ic)
{
struct ifnet *ifp = ic->ic_ifp;
struct iwi_softc *sc = ifp->if_softc;
+ IWI_LOCK_DECL;
- taskqueue_enqueue(sc->sc_tq2, &sc->sc_scanaborttask);
+ IWI_LOCK(sc);
+ sc->flags &= ~IWI_FLAG_CHANNEL_SCAN;
+ /* NB: make sure we're still scanning */
+ if (sc->fw_state == IWI_FW_SCANNING)
+ iwi_cmd(sc, IWI_CMD_ABORT_SCAN, NULL, 0);
+ IWI_UNLOCK(sc);
}
Modified: user/thompsa/vaptq/sys/dev/iwi/if_iwivar.h
==============================================================================
--- user/thompsa/vaptq/sys/dev/iwi/if_iwivar.h Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/iwi/if_iwivar.h Wed Apr 15 17:05:20 2009 (r191108)
@@ -195,7 +195,6 @@ struct iwi_softc {
struct task sc_radiontask; /* radio on processing */
struct task sc_radiofftask; /* radio off processing */
- struct task sc_scanaborttask; /* cancel active scan */
struct task sc_restarttask; /* restart adapter processing */
struct task sc_opstask; /* scan / auth processing */
@@ -225,12 +224,8 @@ struct iwi_softc {
int sc_cmd_cur; /* current queued scan task */
int sc_cmd_next; /* last queued scan task */
#define IWI_CMD_FREE 0 /* for marking slots unused */
-#define IWI_SCAN_START 1
-#define IWI_SET_CHANNEL 2
-#define IWI_DISASSOC 3
-#define IWI_SCAN_CURCHAN 4
-#define IWI_SCAN_ALLCHAN 5
-#define IWI_SET_WME 6
+#define IWI_DISASSOC 1
+#define IWI_SET_WME 2
struct iwi_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
Modified: user/thompsa/vaptq/sys/dev/iwn/if_iwn.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/iwn/if_iwn.c Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/iwn/if_iwn.c Wed Apr 15 17:05:20 2009 (r191108)
@@ -1774,7 +1774,7 @@ iwn_notif_intr(struct iwn_softc *sc)
"scan finished nchan=%d status=%d chan=%d\n",
scan->nchan, scan->status, scan->chan);
- iwn_queue_cmd(sc, IWN_SCAN_NEXT, 0, IWN_QUEUE_NORMAL);
+ ieee80211_scan_next(vap);
break;
}
}
@@ -4300,7 +4300,10 @@ iwn_scan_start(struct ieee80211com *ic)
struct ifnet *ifp = ic->ic_ifp;
struct iwn_softc *sc = ifp->if_softc;
- iwn_queue_cmd(sc, IWN_SCAN_START, 0, IWN_QUEUE_NORMAL);
+ IWN_LOCK(sc);
+ /* make the link LED blink while we're scanning */
+ iwn_set_led(sc, IWN_LED_LINK, 20, 2);
+ IWN_UNLOCK(sc);
}
/*
@@ -4309,10 +4312,7 @@ iwn_scan_start(struct ieee80211com *ic)
static void
iwn_scan_end(struct ieee80211com *ic)
{
- struct ifnet *ifp = ic->ic_ifp;
- struct iwn_softc *sc = ifp->if_softc;
-
- iwn_queue_cmd(sc, IWN_SCAN_STOP, 0, IWN_QUEUE_NORMAL);
+ /* ignore */
}
/*
@@ -4323,15 +4323,29 @@ iwn_set_channel(struct ieee80211com *ic)
{
struct ifnet *ifp = ic->ic_ifp;
struct iwn_softc *sc = ifp->if_softc;
+ struct ieee80211vap *vap;
const struct ieee80211_channel *c = ic->ic_curchan;
+ int error;
+
+ vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */
+ IWN_LOCK(sc);
if (c != sc->sc_curchan) {
sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq);
sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags);
- iwn_queue_cmd(sc, IWN_SET_CHAN, 0, IWN_QUEUE_NORMAL);
+
+ error = iwn_config(sc);
+ if (error != 0) {
+ DPRINTF(sc, IWN_DEBUG_STATE,
+ "%s: set chan failed, cancel scan\n",
+ __func__);
+ //XXX Handle failed scan correctly
+ ieee80211_cancel_scan(vap);
+ }
}
+ IWN_UNLOCK(sc);
}
/*
@@ -4342,8 +4356,13 @@ iwn_scan_curchan(struct ieee80211_scan_s
{
struct ieee80211vap *vap = ss->ss_vap;
struct iwn_softc *sc = vap->iv_ic->ic_ifp->if_softc;
+ int error;
- iwn_queue_cmd(sc, IWN_SCAN_CURCHAN, 0, IWN_QUEUE_NORMAL);
+ IWN_LOCK(sc);
+ error = iwn_scan(sc);
+ IWN_UNLOCK(sc);
+ if (error != 0)
+ ieee80211_cancel_scan(vap);
}
/*
@@ -4367,7 +4386,7 @@ iwn_ops(void *arg0, int pending)
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ieee80211vap *vap;
- int cmd, arg, error;
+ int cmd, arg;
for (;;) {
IWN_CMD_LOCK(sc);
@@ -4393,36 +4412,6 @@ iwn_ops(void *arg0, int pending)
vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */
switch (cmd) {
- case IWN_SCAN_START:
- /* make the link LED blink while we're scanning */
- iwn_set_led(sc, IWN_LED_LINK, 20, 2);
- break;
- case IWN_SCAN_STOP:
- break;
- case IWN_SCAN_NEXT:
- ieee80211_scan_next(vap);
- break;
- case IWN_SCAN_CURCHAN:
- error = iwn_scan(sc);
- if (error != 0) {
- IWN_UNLOCK(sc);
- ieee80211_cancel_scan(vap);
- IWN_LOCK(sc);
- return;
- }
- break;
- case IWN_SET_CHAN:
- error = iwn_config(sc);
- if (error != 0) {
- DPRINTF(sc, IWN_DEBUG_STATE,
- "%s: set chan failed, cancel scan\n",
- __func__);
- IWN_UNLOCK(sc);
- //XXX Handle failed scan correctly
- ieee80211_cancel_scan(vap);
- return;
- }
- break;
case IWN_REINIT:
IWN_UNLOCK(sc);
iwn_init(sc);
@@ -4512,11 +4501,6 @@ static const char *
iwn_ops_str(int cmd)
{
switch (cmd) {
- case IWN_SCAN_START: return "SCAN_START";
- case IWN_SCAN_CURCHAN: return "SCAN_CURCHAN";
- case IWN_SCAN_STOP: return "SCAN_STOP";
- case IWN_SET_CHAN: return "SET_CHAN";
- case IWN_SCAN_NEXT: return "SCAN_NEXT";
case IWN_RADIO_ENABLE: return "RADIO_ENABLE";
case IWN_RADIO_DISABLE: return "RADIO_DISABLE";
case IWN_REINIT: return "REINIT";
Modified: user/thompsa/vaptq/sys/dev/iwn/if_iwnvar.h
==============================================================================
--- user/thompsa/vaptq/sys/dev/iwn/if_iwnvar.h Wed Apr 15 16:36:13 2009 (r191107)
+++ user/thompsa/vaptq/sys/dev/iwn/if_iwnvar.h Wed Apr 15 17:05:20 2009 (r191108)
@@ -181,22 +181,17 @@ struct iwn_softc {
bus_size_t sc_sz;
/* command queue related variables */
-#define IWN_SCAN_START (1<<0)
-#define IWN_SCAN_CURCHAN (1<<1)
-#define IWN_SCAN_STOP (1<<2)
-#define IWN_SET_CHAN (1<<3)
-#define IWN_SCAN_NEXT (1<<4)
-#define IWN_RADIO_ENABLE (1<<5)
-#define IWN_RADIO_DISABLE (1<<6)
-#define IWN_REINIT (1<<7)
+#define IWN_RADIO_ENABLE (1<<0)
+#define IWN_RADIO_DISABLE (1<<1)
+#define IWN_REINIT (1<<2)
#define IWN_CMD_MAXOPS 10
/* command queuing request type */
#define IWN_QUEUE_NORMAL 0
#define IWN_QUEUE_CLEAR 1
int sc_cmd[IWN_CMD_MAXOPS];
int sc_cmd_arg[IWN_CMD_MAXOPS];
- int sc_cmd_cur; /* current queued scan task */
- int sc_cmd_next; /* last queued scan task */
+ int sc_cmd_cur; /* current queued task */
+ int sc_cmd_next; /* last queued task */
struct mtx sc_cmdlock;
/* Task queues used to control the driver */
More information about the svn-src-user
mailing list