aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/scan.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-04-29 06:26:17 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-05-06 15:14:51 -0400
commit5cff20e6c5a6591a79d3b027af222870f52bb550 (patch)
tree81b6ebb75c1dc87b65258e71526c1581d168156c /net/mac80211/scan.c
parent9955151df7c6452cae2ed9649f53d265c91cf155 (diff)
mac80211: tell driver when idle
When we aren't doing anything in mac80211, we can turn off much of the hardware, depending on the driver/hw. Not doing anything, aka being idle, means: * no monitor interfaces * no AP/mesh/wds interfaces * any station interfaces are in DISABLED state * any IBSS interfaces aren't trying to be in a network * we aren't trying to scan By creating a new function that verifies these conditions and calling it at strategic points where the states of those conditions change, we can easily make mac80211 tell the driver when we are idle to save power. Additionally, this fixes a small quirk where a recalculated powersave state is passed to the driver even if the hardware is about to stopped completely. This patch intentionally doesn't touch radio_enabled because that is currently implemented to be a soft rfkill which is inappropriate here when we need to be able to wake up with low latency. One thing I'm not entirely sure about is this: phy0: device no longer idle - in use wlan0: direct probe to AP 00:11:24:91:07:4d try 1 wlan0 direct probe responded wlan0: authenticate with AP 00:11:24:91:07:4d wlan0: authenticated > phy0: device now idle > phy0: device no longer idle - in use wlan0: associate with AP 00:11:24:91:07:4d wlan0: RX AssocResp from 00:11:24:91:07:4d (capab=0x401 status=0 aid=1) wlan0: associated Is it appropriate to go into idle state for a short time when we have just authenticated, but not associated yet? This happens only with the userspace SME, because we cannot really know how long it will wait before asking us to associate. Would going idle after a short timeout be more appropriate? We may need to revisit this, depending on what happens. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r--net/mac80211/scan.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 127bd54e0e3..c99ef8d04d3 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -302,17 +302,9 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
302 /* we only have to protect scan_req and hw/sw scan */ 302 /* we only have to protect scan_req and hw/sw scan */
303 mutex_unlock(&local->scan_mtx); 303 mutex_unlock(&local->scan_mtx);
304 304
305 if (was_hw_scan) {
306 /*
307 * Somebody might have requested channel change during scan
308 * that we won't have acted upon, try now. ieee80211_hw_config
309 * will set the flag based on actual changes.
310 */
311 ieee80211_hw_config(local, 0);
312 goto done;
313 }
314
315 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 305 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
306 if (was_hw_scan)
307 goto done;
316 308
317 netif_tx_lock_bh(local->mdev); 309 netif_tx_lock_bh(local->mdev);
318 netif_addr_lock(local->mdev); 310 netif_addr_lock(local->mdev);
@@ -351,6 +343,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
351 mutex_unlock(&local->iflist_mtx); 343 mutex_unlock(&local->iflist_mtx);
352 344
353 done: 345 done:
346 ieee80211_recalc_idle(local);
354 ieee80211_mlme_notify_scan_completed(local); 347 ieee80211_mlme_notify_scan_completed(local);
355 ieee80211_ibss_notify_scan_completed(local); 348 ieee80211_ibss_notify_scan_completed(local);
356 ieee80211_mesh_notify_scan_completed(local); 349 ieee80211_mesh_notify_scan_completed(local);
@@ -471,6 +464,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
471 * dependency, so that the scan completed calls 464 * dependency, so that the scan completed calls
472 * have more locking freedom. 465 * have more locking freedom.
473 */ 466 */
467
468 ieee80211_recalc_idle(local);
474 mutex_unlock(&local->scan_mtx); 469 mutex_unlock(&local->scan_mtx);
475 470
476 if (local->ops->hw_scan) 471 if (local->ops->hw_scan)
@@ -487,6 +482,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
487 } else 482 } else
488 local->sw_scanning = false; 483 local->sw_scanning = false;
489 484
485 ieee80211_recalc_idle(local);
486
490 local->scan_req = NULL; 487 local->scan_req = NULL;
491 local->scan_sdata = NULL; 488 local->scan_sdata = NULL;
492 } 489 }