]>
Commit | Line | Data |
---|---|---|
9f772686 | 1 | From: Abhijeet Kolekar <abhijeet.kolekar@intel.com> |
2 | ||
3 | The patch leverages mac80211 configure_filter to enable iwl3945 | |
4 | monitor mode. | |
5 | ||
6 | Signed-off-by: Abhijeet Kolekar <abhijeet.kolekar@intel.com> | |
7 | --- | |
8 | drivers/net/wireless/iwlwifi/iwl-3945.h | 1 + | |
9 | drivers/net/wireless/iwlwifi/iwl3945-base.c | 36 ++++++++++++++++++++++++++- | |
10 | 2 files changed, 36 insertions(+), 1 deletions(-) | |
11 | ||
12 | diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h | |
13 | index fb96c62..9fdc140 100644 | |
14 | --- a/drivers/net/wireless/iwlwifi/iwl-3945.h | |
15 | +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |
16 | @@ -886,6 +886,7 @@ struct iwl3945_priv { | |
17 | struct work_struct report_work; | |
18 | struct work_struct request_scan; | |
19 | struct work_struct beacon_update; | |
20 | + struct work_struct set_monitor; | |
21 | ||
22 | struct tasklet_struct irq_tasklet; | |
23 | ||
24 | diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |
25 | index 7040cde..f021eba 100644 | |
26 | --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c | |
27 | +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |
28 | @@ -6144,6 +6144,24 @@ static void iwl3945_bg_rf_kill(struct work_struct *work) | |
29 | mutex_unlock(&priv->mutex); | |
30 | } | |
31 | ||
32 | +static void iwl3945_bg_set_monitor(struct work_struct *work) | |
33 | +{ | |
34 | + struct iwl3945_priv *priv = container_of(work, | |
35 | + struct iwl3945_priv, set_monitor); | |
36 | + | |
37 | + IWL_DEBUG(IWL_DL_STATE, "setting monitor mode\n"); | |
38 | + | |
39 | + mutex_lock(&priv->mutex); | |
40 | + | |
41 | + if (!iwl3945_is_ready(priv)) | |
42 | + IWL_DEBUG(IWL_DL_STATE, "leave - not ready\n"); | |
43 | + else | |
44 | + if (iwl3945_set_mode(priv, IEEE80211_IF_TYPE_MNTR) != 0) | |
45 | + IWL_ERROR("iwl3945_set_mode() failed\n"); | |
46 | + | |
47 | + mutex_unlock(&priv->mutex); | |
48 | +} | |
49 | + | |
50 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) | |
51 | ||
52 | static void iwl3945_bg_scan_check(struct work_struct *data) | |
53 | @@ -6996,7 +7014,22 @@ static void iwl3945_configure_filter(struct ieee80211_hw *hw, | |
54 | * XXX: dummy | |
55 | * see also iwl3945_connection_init_rx_config | |
56 | */ | |
57 | - *total_flags = 0; | |
58 | + struct iwl3945_priv *priv = hw->priv; | |
59 | + int new_flags = 0; | |
60 | + if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) { | |
61 | + if (*total_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) { | |
62 | + IWL_DEBUG_MAC80211("Enter: type %d (0x%x, 0x%x)\n", | |
63 | + IEEE80211_IF_TYPE_MNTR, | |
64 | + changed_flags, *total_flags); | |
65 | + /* queue work 'cuz mac80211 is holding a lock which | |
66 | + * prevents us from issuing (synchronous) f/w cmds */ | |
67 | + queue_work(priv->workqueue, &priv->set_monitor); | |
68 | + new_flags &= FIF_PROMISC_IN_BSS | | |
69 | + FIF_OTHER_BSS | | |
70 | + FIF_ALLMULTI; | |
71 | + } | |
72 | + } | |
73 | + *total_flags = new_flags; | |
74 | } | |
75 | ||
76 | static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw, | |
77 | @@ -7872,6 +7905,7 @@ static void iwl3945_setup_deferred_work(struct iwl3945_priv *priv) | |
78 | INIT_WORK(&priv->abort_scan, iwl3945_bg_abort_scan); | |
79 | INIT_WORK(&priv->rf_kill, iwl3945_bg_rf_kill); | |
80 | INIT_WORK(&priv->beacon_update, iwl3945_bg_beacon_update); | |
81 | + INIT_WORK(&priv->set_monitor, iwl3945_bg_set_monitor); | |
82 | INIT_DELAYED_WORK(&priv->post_associate, iwl3945_bg_post_associate); | |
83 | INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start); | |
84 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); | |
85 | -- | |
86 | 1.5.3.6 | |
87 |