svn commit: r214383 - stable/7/sys/dev/iwi
Bernhard Schmidt
bschmidt at FreeBSD.org
Tue Oct 26 17:31:46 UTC 2010
Author: bschmidt
Date: Tue Oct 26 17:31:46 2010
New Revision: 214383
URL: http://svn.freebsd.org/changeset/base/214383
Log:
MFC r213729:
Fix monitor mode which is implemented by doing a firmware scan. This
is a port from stable/6, seems like the code got lost during the
background scan changes in r170530.
Modified:
stable/7/sys/dev/iwi/if_iwi.c
stable/7/sys/dev/iwi/if_iwivar.h
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/dev/iwi/if_iwi.c
==============================================================================
--- stable/7/sys/dev/iwi/if_iwi.c Tue Oct 26 17:30:34 2010 (r214382)
+++ stable/7/sys/dev/iwi/if_iwi.c Tue Oct 26 17:31:46 2010 (r214383)
@@ -163,6 +163,7 @@ static void iwi_release_fw_dma(struct iw
static int iwi_config(struct iwi_softc *);
static int iwi_get_firmware(struct iwi_softc *);
static void iwi_put_firmware(struct iwi_softc *);
+static void iwi_monitor_scan(void *, int);
static int iwi_scanchan(struct iwi_softc *, unsigned long, int);
static void iwi_scan_start(struct ieee80211com *);
static void iwi_scan_end(struct ieee80211com *);
@@ -291,6 +292,7 @@ iwi_attach(device_t dev)
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);
+ TASK_INIT(&sc->sc_monitortask, 0, iwi_monitor_scan, sc);
callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0);
if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
@@ -978,7 +980,8 @@ iwi_newstate(struct ieee80211com *ic, en
*/
if (ic->ic_state == IEEE80211_S_SCAN)
iwi_assoc(ic);
- }
+ } else if (ic->ic_opmode == IEEE80211_M_MONITOR)
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_monitortask);
break;
case IEEE80211_S_INIT:
/*
@@ -1411,6 +1414,18 @@ iwi_notification_intr(struct iwi_softc *
IWI_STATE_END(sc, IWI_FW_SCANNING);
+ /*
+ * Monitor mode works by doing a passive scan to set
+ * the channel and enable rx. Because we don't want
+ * to abort a scan lest the firmware crash we scan
+ * for a short period of time and automatically restart
+ * the scan when notified the sweep has completed.
+ */
+ if (ic->ic_opmode == IEEE80211_M_MONITOR) {
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_monitortask);
+ break;
+ }
+
if (scan->status == IWI_SCAN_COMPLETED)
ieee80211_scan_next(ic);
@@ -2595,6 +2610,11 @@ iwi_config(struct iwi_softc *sc)
config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
config.disable_unicast_decryption = 1;
config.disable_multicast_decryption = 1;
+ if (ic->ic_opmode == IEEE80211_M_MONITOR) {
+ config.allow_invalid_frames = 1;
+ config.allow_beacon_and_probe_resp = 1;
+ config.allow_mgt = 1;
+ }
DPRINTF(("Configuring adapter\n"));
error = iwi_cmd(sc, IWI_CMD_SET_CONFIG, &config, sizeof config);
if (error != 0)
@@ -2717,6 +2737,17 @@ scan_band(const struct ieee80211_channel
return IEEE80211_IS_CHAN_5GHZ(c) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ;
}
+static void
+iwi_monitor_scan(void *arg, int npending)
+{
+ struct iwi_softc *sc = arg;
+ IWI_LOCK_DECL;
+
+ IWI_LOCK(sc);
+ (void) iwi_scanchan(sc, 2000, 0);
+ IWI_UNLOCK(sc);
+}
+
/*
* Start a scan on the current channel or all channels.
*/
Modified: stable/7/sys/dev/iwi/if_iwivar.h
==============================================================================
--- stable/7/sys/dev/iwi/if_iwivar.h Tue Oct 26 17:30:34 2010 (r214382)
+++ stable/7/sys/dev/iwi/if_iwivar.h Tue Oct 26 17:31:46 2010 (r214383)
@@ -193,6 +193,7 @@ struct iwi_softc {
struct task sc_scanaborttask; /* cancel active scan */
struct task sc_restarttask; /* restart adapter processing */
struct task sc_opstask; /* scan / auth processing */
+ struct task sc_monitortask;
unsigned int sc_softled : 1, /* enable LED gpio status */
sc_ledstate: 1, /* LED on/off state */
More information about the svn-src-stable
mailing list