diff options
author | Kalle Valo <kalle.valo@nokia.com> | 2008-12-18 16:35:13 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-19 15:23:57 -0500 |
commit | e0cb686ff879dc9ac045ad7258ec687088d4e450 (patch) | |
tree | 4792dc94d6a36be8367987b88b922157acf59808 /net/mac80211/mlme.c | |
parent | d10d0e5707fb7b8afa7e68a14d69e752604ee294 (diff) |
mac80211: enable IEEE80211_CONF_PS only when associated
Also disable power save when disassociated. It makes no sense to have
power save enabled while disassociated.
iwlwifi seems to have this check in the driver, but it's better to do this
in mac80211 instead.
Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r-- | net/mac80211/mlme.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 1374b8c750ab..dac8bd37dcf5 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -744,6 +744,11 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, | |||
744 | bss_info_changed |= BSS_CHANGED_BASIC_RATES; | 744 | bss_info_changed |= BSS_CHANGED_BASIC_RATES; |
745 | ieee80211_bss_info_change_notify(sdata, bss_info_changed); | 745 | ieee80211_bss_info_change_notify(sdata, bss_info_changed); |
746 | 746 | ||
747 | if (local->powersave) { | ||
748 | local->hw.conf.flags |= IEEE80211_CONF_PS; | ||
749 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | ||
750 | } | ||
751 | |||
747 | netif_tx_start_all_queues(sdata->dev); | 752 | netif_tx_start_all_queues(sdata->dev); |
748 | netif_carrier_on(sdata->dev); | 753 | netif_carrier_on(sdata->dev); |
749 | 754 | ||
@@ -812,7 +817,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
812 | { | 817 | { |
813 | struct ieee80211_local *local = sdata->local; | 818 | struct ieee80211_local *local = sdata->local; |
814 | struct sta_info *sta; | 819 | struct sta_info *sta; |
815 | u32 changed = 0; | 820 | u32 changed = 0, config_changed = 0; |
816 | 821 | ||
817 | rcu_read_lock(); | 822 | rcu_read_lock(); |
818 | 823 | ||
@@ -859,8 +864,14 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
859 | 864 | ||
860 | local->hw.conf.ht.enabled = false; | 865 | local->hw.conf.ht.enabled = false; |
861 | local->oper_channel_type = NL80211_CHAN_NO_HT; | 866 | local->oper_channel_type = NL80211_CHAN_NO_HT; |
862 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_HT); | 867 | config_changed |= IEEE80211_CONF_CHANGE_HT; |
868 | |||
869 | if (local->hw.conf.flags & IEEE80211_CONF_PS) { | ||
870 | local->hw.conf.flags &= ~IEEE80211_CONF_PS; | ||
871 | config_changed |= IEEE80211_CONF_CHANGE_PS; | ||
872 | } | ||
863 | 873 | ||
874 | ieee80211_hw_config(local, config_changed); | ||
864 | ieee80211_bss_info_change_notify(sdata, changed); | 875 | ieee80211_bss_info_change_notify(sdata, changed); |
865 | 876 | ||
866 | rcu_read_lock(); | 877 | rcu_read_lock(); |