mac80211: Ensure power-level set properly for scanning.
authorBen Greear <greearb@candelatech.com>
Mon, 7 Feb 2011 21:44:38 +0000 (13:44 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 9 Feb 2011 21:09:48 +0000 (16:09 -0500)
My previous patch to optimize scanning on operating channel
accidentally removed the code that would ensure power was
set to maximum for scanning.

This patch re-adds that functionality.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/main.c
net/mac80211/scan.c

index 86562ce99221f8c3b91eca9c3e28d731c3fe577c..e7eb2cfaf400bd5d650b4e11c0582a01f92f74b7 100644 (file)
@@ -199,7 +199,8 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
                changed |= IEEE80211_CONF_CHANGE_SMPS;
        }
 
-       if (scan_chan)
+       if ((local->scanning & SCAN_SW_SCANNING) ||
+           (local->scanning & SCAN_HW_SCANNING))
                power = chan->max_power;
        else
                power = local->power_constr_level ?
index 0e70d7a160b42aa8eaa8e3df8fbe4af53b7d6422..842954509925cbda1476da0155e5008421a564a5 100644 (file)
@@ -307,11 +307,15 @@ static void __ieee80211_scan_completed_finish(struct ieee80211_hw *hw,
        mutex_lock(&local->mtx);
        on_oper_chan = ieee80211_cfg_on_oper_channel(local);
 
+       WARN_ON(local->scanning & (SCAN_SW_SCANNING | SCAN_HW_SCANNING));
+
        if (was_hw_scan || !on_oper_chan) {
                if (WARN_ON(local->scan_channel))
                        local->scan_channel = NULL;
                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
-       }
+       } else
+               /* Set power back to normal operating levels. */
+               ieee80211_hw_config(local, 0);
 
        if (!was_hw_scan) {
                bool on_oper_chan2;
@@ -377,6 +381,9 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
 
        ieee80211_configure_filter(local);
 
+       /* We need to set power level at maximum rate for scanning. */
+       ieee80211_hw_config(local, 0);
+
        ieee80211_queue_delayed_work(&local->hw,
                                     &local->scan_work,
                                     IEEE80211_CHANNEL_TIME);