diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-01-07 12:28:20 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-29 15:59:58 -0500 |
commit | 4be8c3873e0b88397866d3ede578503e188f9ad2 (patch) | |
tree | 1ccf8a0c204bb01aca08d90c2d8c37b5e0439bd3 /net/mac80211/mlme.c | |
parent | acbaf32e94cb70218792cac68e5149e482e77441 (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.c | 31 |
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 | ||