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.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index 15428048d01a..f6640d047157 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -830,25 +830,46 @@ static int ieee80211_ioctl_siwpower(struct net_device *dev,
830 struct iw_param *wrq, 830 struct iw_param *wrq,
831 char *extra) 831 char *extra)
832{ 832{
833 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
833 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 834 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
834 struct ieee80211_conf *conf = &local->hw.conf; 835 struct ieee80211_conf *conf = &local->hw.conf;
836 int ret = 0;
837 bool ps;
838
839 if (sdata->vif.type != NL80211_IFTYPE_STATION)
840 return -EINVAL;
835 841
836 if (wrq->disabled) { 842 if (wrq->disabled) {
837 conf->flags &= ~IEEE80211_CONF_PS; 843 ps = false;
838 return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 844 goto set;
839 } 845 }
840 846
841 switch (wrq->flags & IW_POWER_MODE) { 847 switch (wrq->flags & IW_POWER_MODE) {
842 case IW_POWER_ON: /* If not specified */ 848 case IW_POWER_ON: /* If not specified */
843 case IW_POWER_MODE: /* If set all mask */ 849 case IW_POWER_MODE: /* If set all mask */
844 case IW_POWER_ALL_R: /* If explicitely state all */ 850 case IW_POWER_ALL_R: /* If explicitely state all */
845 conf->flags |= IEEE80211_CONF_PS; 851 ps = true;
846 break; 852 break;
847 default: /* Otherwise we don't support it */ 853 default: /* Otherwise we don't support it */
848 return -EINVAL; 854 return -EINVAL;
849 } 855 }
850 856
851 return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 857 if (ps == local->powersave)
858 return ret;
859
860set:
861 local->powersave = ps;
862
863 if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
864 if (local->powersave)
865 conf->flags |= IEEE80211_CONF_PS;
866 else
867 conf->flags &= ~IEEE80211_CONF_PS;
868
869 ret = ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
870 }
871
872 return ret;
852} 873}
853 874
854static int ieee80211_ioctl_giwpower(struct net_device *dev, 875static int ieee80211_ioctl_giwpower(struct net_device *dev,
@@ -857,9 +878,8 @@ static int ieee80211_ioctl_giwpower(struct net_device *dev,
857 char *extra) 878 char *extra)
858{ 879{
859 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 880 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
860 struct ieee80211_conf *conf = &local->hw.conf;
861 881
862 wrqu->power.disabled = !(conf->flags & IEEE80211_CONF_PS); 882 wrqu->power.disabled = !local->powersave;
863 883
864 return 0; 884 return 0;
865} 885}