diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-04-29 06:26:17 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-05-06 15:14:51 -0400 |
commit | 5cff20e6c5a6591a79d3b027af222870f52bb550 (patch) | |
tree | 81b6ebb75c1dc87b65258e71526c1581d168156c /net/mac80211/scan.c | |
parent | 9955151df7c6452cae2ed9649f53d265c91cf155 (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.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 127bd54e0e38..c99ef8d04d3d 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 | } |