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/wext.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/wext.c')
-rw-r--r-- | net/mac80211/wext.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 3f2db0bda46..1e5b29bdb3a 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
@@ -837,6 +837,9 @@ static int ieee80211_ioctl_siwpower(struct net_device *dev, | |||
837 | int ret = 0, timeout = 0; | 837 | int ret = 0, timeout = 0; |
838 | bool ps; | 838 | bool ps; |
839 | 839 | ||
840 | if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) | ||
841 | return -EOPNOTSUPP; | ||
842 | |||
840 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | 843 | if (sdata->vif.type != NL80211_IFTYPE_STATION) |
841 | return -EINVAL; | 844 | return -EINVAL; |
842 | 845 | ||
@@ -862,32 +865,37 @@ static int ieee80211_ioctl_siwpower(struct net_device *dev, | |||
862 | if (wrq->flags & IW_POWER_TIMEOUT) | 865 | if (wrq->flags & IW_POWER_TIMEOUT) |
863 | timeout = wrq->value / 1000; | 866 | timeout = wrq->value / 1000; |
864 | 867 | ||
865 | set: | 868 | set: |
866 | if (ps == local->powersave && timeout == conf->dynamic_ps_timeout) | 869 | if (ps == local->powersave && timeout == conf->dynamic_ps_timeout) |
867 | return ret; | 870 | return ret; |
868 | 871 | ||
869 | local->powersave = ps; | 872 | local->powersave = ps; |
870 | conf->dynamic_ps_timeout = timeout; | 873 | conf->dynamic_ps_timeout = timeout; |
871 | 874 | ||
872 | if (local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS) { | 875 | if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) |
873 | ret = ieee80211_hw_config(local, | 876 | ret = ieee80211_hw_config(local, |
874 | IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT); | 877 | IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT); |
875 | } else if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) { | 878 | |
876 | if (conf->dynamic_ps_timeout > 0) | 879 | if (!(sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)) |
877 | mod_timer(&local->dynamic_ps_timer, jiffies + | 880 | return ret; |
878 | msecs_to_jiffies(conf->dynamic_ps_timeout)); | 881 | |
879 | else { | 882 | if (conf->dynamic_ps_timeout > 0 && |
880 | if (local->powersave) { | 883 | !(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)) { |
884 | mod_timer(&local->dynamic_ps_timer, jiffies + | ||
885 | msecs_to_jiffies(conf->dynamic_ps_timeout)); | ||
886 | } else { | ||
887 | if (local->powersave) { | ||
888 | if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) | ||
881 | ieee80211_send_nullfunc(local, sdata, 1); | 889 | ieee80211_send_nullfunc(local, sdata, 1); |
882 | conf->flags |= IEEE80211_CONF_PS; | 890 | conf->flags |= IEEE80211_CONF_PS; |
883 | ret = ieee80211_hw_config(local, | 891 | ret = ieee80211_hw_config(local, |
884 | IEEE80211_CONF_CHANGE_PS); | 892 | IEEE80211_CONF_CHANGE_PS); |
885 | } else { | 893 | } else { |
886 | conf->flags &= ~IEEE80211_CONF_PS; | 894 | conf->flags &= ~IEEE80211_CONF_PS; |
887 | ret = ieee80211_hw_config(local, | 895 | ret = ieee80211_hw_config(local, |
888 | IEEE80211_CONF_CHANGE_PS); | 896 | IEEE80211_CONF_CHANGE_PS); |
897 | if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) | ||
889 | ieee80211_send_nullfunc(local, sdata, 0); | 898 | ieee80211_send_nullfunc(local, sdata, 0); |
890 | } | ||
891 | } | 899 | } |
892 | } | 900 | } |
893 | 901 | ||