aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wext.c
diff options
context:
space:
mode:
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 3f2db0bda46c..1e5b29bdb3a7 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