aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wext.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/wext.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/wext.c')
-rw-r--r--net/mac80211/wext.c40
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
865set: 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