aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-04-22 12:44:37 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-04-22 16:57:20 -0400
commit04fe20372e70685d9f15966216cdffd3795fe590 (patch)
tree8de1ed35372e2f2bcfd9f36cb89647ce1507922d /net
parent8e30bc55de98c000b0b836cb42525c82f605f191 (diff)
mac80211: calculate maximum sleep interval
The maximum sleep interval, for powersave purposes, is determined by the DTIM period (it may not be larger) and the required networking latency (it must be small enough to fulfil those constraints). This makes mac80211 calculate the maximum sleep interval based on those constraints, and pass it to the driver. Then the driver should instruct the device to sleep at most that long. Note that the device is responsible for aligning the maximum sleep interval between DTIMs, we make sure it's not longer but it needs to make sure it's between them. Also, group some powersave documentation together and make it more explicit that we support managed mode only, and no IBSS powersaving (yet). Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/mlme.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index e819c02d13f0..df27c68620c9 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -545,10 +545,19 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
545 beaconint_us = ieee80211_tu_to_usec( 545 beaconint_us = ieee80211_tu_to_usec(
546 found->vif.bss_conf.beacon_int); 546 found->vif.bss_conf.beacon_int);
547 547
548 if (beaconint_us > latency) 548 if (beaconint_us > latency) {
549 local->ps_sdata = NULL; 549 local->ps_sdata = NULL;
550 else 550 } else {
551 u8 dtimper = found->vif.bss_conf.dtim_period;
552 int maxslp = 1;
553
554 if (dtimper > 1)
555 maxslp = min_t(int, dtimper,
556 latency / beaconint_us);
557
558 local->hw.conf.max_sleep_interval = maxslp;
551 local->ps_sdata = found; 559 local->ps_sdata = found;
560 }
552 } else { 561 } else {
553 local->ps_sdata = NULL; 562 local->ps_sdata = NULL;
554 } 563 }
@@ -851,8 +860,11 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
851 ieee80211_bss_info_change_notify(sdata, bss_info_changed); 860 ieee80211_bss_info_change_notify(sdata, bss_info_changed);
852 861
853 /* will be same as sdata */ 862 /* will be same as sdata */
854 if (local->ps_sdata) 863 if (local->ps_sdata) {
855 ieee80211_enable_ps(local, sdata); 864 mutex_lock(&local->iflist_mtx);
865 ieee80211_recalc_ps(local, -1);
866 mutex_unlock(&local->iflist_mtx);
867 }
856 868
857 netif_tx_start_all_queues(sdata->dev); 869 netif_tx_start_all_queues(sdata->dev);
858 netif_carrier_on(sdata->dev); 870 netif_carrier_on(sdata->dev);