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>
This commit is contained in:
committed by
John W. Linville
parent
acbaf32e94
commit
4be8c3873e
@@ -775,17 +775,17 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
||||
bss_info_changed |= BSS_CHANGED_BASIC_RATES;
|
||||
ieee80211_bss_info_change_notify(sdata, bss_info_changed);
|
||||
|
||||
if (local->powersave &&
|
||||
!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) {
|
||||
if (local->hw.conf.dynamic_ps_timeout > 0)
|
||||
if (local->powersave) {
|
||||
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) &&
|
||||
local->hw.conf.dynamic_ps_timeout > 0) {
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
msecs_to_jiffies(
|
||||
local->hw.conf.dynamic_ps_timeout));
|
||||
else {
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
} else {
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
conf->flags |= IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1779,16 +1779,14 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) {
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK &&
|
||||
local->hw.conf.flags & IEEE80211_CONF_PS) {
|
||||
directed_tim = check_tim(&elems, ifsta->aid, &is_mc);
|
||||
|
||||
if (directed_tim || is_mc) {
|
||||
if (local->hw.conf.flags && IEEE80211_CONF_PS) {
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
ieee80211_send_nullfunc(local, sdata, 0);
|
||||
}
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
ieee80211_send_nullfunc(local, sdata, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2694,9 +2692,10 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
||||
if (local->hw.conf.flags & IEEE80211_CONF_PS)
|
||||
return;
|
||||
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
local->hw.conf.flags |= IEEE80211_CONF_PS;
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
ieee80211_send_nullfunc(local, sdata, 1);
|
||||
|
||||
local->hw.conf.flags |= IEEE80211_CONF_PS;
|
||||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user