aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-01-07 12:28:20 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-01-29 15:59:58 -0500
commit4be8c3873e0b88397866d3ede578503e188f9ad2 (patch)
tree1ccf8a0c204bb01aca08d90c2d8c37b5e0439bd3 /net/mac80211/mlme.c
parentacbaf32e94cb70218792cac68e5149e482e77441 (diff)
mac80211: extend/document powersave API
This modifies hardware flags for powersave to support three different flags: * IEEE80211_HW_SUPPORTS_PS - indicates general PS support * IEEE80211_HW_PS_NULLFUNC_STACK - indicates nullfunc sending in software * IEEE80211_HW_SUPPORTS_DYNAMIC_PS - indicates dynamic PS on the device It also adds documentation for all this which explains how to set the various flags. Additionally, it fixes a few things: * a spot where && was used to test flags * enable CONF_PS only when associated again Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 7709e7645671..a1e683e305f0 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -775,17 +775,17 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
775 bss_info_changed |= BSS_CHANGED_BASIC_RATES; 775 bss_info_changed |= BSS_CHANGED_BASIC_RATES;
776 ieee80211_bss_info_change_notify(sdata, bss_info_changed); 776 ieee80211_bss_info_change_notify(sdata, bss_info_changed);
777 777
778 if (local->powersave && 778 if (local->powersave) {
779 !(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) { 779 if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) &&
780 if (local->hw.conf.dynamic_ps_timeout > 0) 780 local->hw.conf.dynamic_ps_timeout > 0) {
781 mod_timer(&local->dynamic_ps_timer, jiffies + 781 mod_timer(&local->dynamic_ps_timer, jiffies +
782 msecs_to_jiffies( 782 msecs_to_jiffies(
783 local->hw.conf.dynamic_ps_timeout)); 783 local->hw.conf.dynamic_ps_timeout));
784 else { 784 } else {
785 ieee80211_send_nullfunc(local, sdata, 1); 785 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
786 ieee80211_send_nullfunc(local, sdata, 1);
786 conf->flags |= IEEE80211_CONF_PS; 787 conf->flags |= IEEE80211_CONF_PS;
787 ieee80211_hw_config(local, 788 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
788 IEEE80211_CONF_CHANGE_PS);
789 } 789 }
790 } 790 }
791 791
@@ -1779,16 +1779,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
1779 ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param, 1779 ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
1780 elems.wmm_param_len); 1780 elems.wmm_param_len);
1781 1781
1782 if (!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) { 1782 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK &&
1783 local->hw.conf.flags & IEEE80211_CONF_PS) {
1783 directed_tim = check_tim(&elems, ifsta->aid, &is_mc); 1784 directed_tim = check_tim(&elems, ifsta->aid, &is_mc);
1784 1785
1785 if (directed_tim || is_mc) { 1786 if (directed_tim || is_mc) {
1786 if (local->hw.conf.flags && IEEE80211_CONF_PS) { 1787 local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1787 local->hw.conf.flags &= ~IEEE80211_CONF_PS; 1788 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1788 ieee80211_hw_config(local, 1789 ieee80211_send_nullfunc(local, sdata, 0);
1789 IEEE80211_CONF_CHANGE_PS);
1790 ieee80211_send_nullfunc(local, sdata, 0);
1791 }
1792 } 1790 }
1793 } 1791 }
1794 1792
@@ -2694,9 +2692,10 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
2694 if (local->hw.conf.flags & IEEE80211_CONF_PS) 2692 if (local->hw.conf.flags & IEEE80211_CONF_PS)
2695 return; 2693 return;
2696 2694
2697 ieee80211_send_nullfunc(local, sdata, 1); 2695 if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
2698 local->hw.conf.flags |= IEEE80211_CONF_PS; 2696 ieee80211_send_nullfunc(local, sdata, 1);
2699 2697
2698 local->hw.conf.flags |= IEEE80211_CONF_PS;
2700 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 2699 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2701} 2700}
2702 2701