aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvri Altman <avri.altman@intel.com>2014-05-20 01:03:24 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-05-21 05:51:21 -0400
commitfa7b2e7fd09f17c47ac312ade3aae48247a528f6 (patch)
tree5b400c115098af065717bba328e6905ae964738e
parent0ccab3db2b3d045905e4336a407a370ae0342d49 (diff)
iwlwifi: mvm: don't filter out the first beacon
Enabling beacon filtering should be done only after a beacon has been received. Doing that too early will cause disconnections. This has already been fixed, but the fix didn't take care about the case where the beacon is received after the association, it waited only for association which is not enough. Signed-off-by: Avri Altman <avri.altman@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c12
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h5
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/power.c62
3 files changed, 27 insertions, 52 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index bdc84594b30c..7411f12fd88d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1368,9 +1368,12 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
1368 IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n"); 1368 IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n");
1369 /* reset cqm events tracking */ 1369 /* reset cqm events tracking */
1370 mvmvif->bf_data.last_cqm_event = 0; 1370 mvmvif->bf_data.last_cqm_event = 0;
1371 ret = iwl_mvm_update_beacon_filter(mvm, vif, false, 0); 1371 if (mvmvif->bf_data.bf_enabled) {
1372 if (ret) 1372 ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
1373 IWL_ERR(mvm, "failed to update CQM thresholds\n"); 1373 if (ret)
1374 IWL_ERR(mvm,
1375 "failed to update CQM thresholds\n");
1376 }
1374 } 1377 }
1375 1378
1376 if (changes & BSS_CHANGED_ARP_FILTER) { 1379 if (changes & BSS_CHANGED_ARP_FILTER) {
@@ -1734,8 +1737,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
1734 } else if (old_state == IEEE80211_STA_ASSOC && 1737 } else if (old_state == IEEE80211_STA_ASSOC &&
1735 new_state == IEEE80211_STA_AUTHORIZED) { 1738 new_state == IEEE80211_STA_AUTHORIZED) {
1736 /* enable beacon filtering */ 1739 /* enable beacon filtering */
1737 if (vif->bss_conf.dtim_period) 1740 WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
1738 WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
1739 ret = 0; 1741 ret = 0;
1740 } else if (old_state == IEEE80211_STA_AUTHORIZED && 1742 } else if (old_state == IEEE80211_STA_AUTHORIZED &&
1741 new_state == IEEE80211_STA_ASSOC) { 1743 new_state == IEEE80211_STA_ASSOC) {
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index beca97a3d73b..6ccc88b0f76b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -999,11 +999,6 @@ int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
999 u32 flags); 999 u32 flags);
1000int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm, 1000int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm,
1001 struct ieee80211_vif *vif, bool enable); 1001 struct ieee80211_vif *vif, bool enable);
1002int iwl_mvm_update_beacon_filter(struct iwl_mvm *mvm,
1003 struct ieee80211_vif *vif,
1004 bool force,
1005 u32 flags);
1006
1007/* SMPS */ 1002/* SMPS */
1008void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1003void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1009 enum iwl_mvm_smps_type_request req_type, 1004 enum iwl_mvm_smps_type_request req_type,
diff --git a/drivers/net/wireless/iwlwifi/mvm/power.c b/drivers/net/wireless/iwlwifi/mvm/power.c
index 10576472150a..a2b426b39ab0 100644
--- a/drivers/net/wireless/iwlwifi/mvm/power.c
+++ b/drivers/net/wireless/iwlwifi/mvm/power.c
@@ -123,27 +123,6 @@ void iwl_mvm_beacon_filter_set_cqm_params(struct iwl_mvm *mvm,
123 cmd->ba_enable_beacon_abort = cpu_to_le32(mvmvif->bf_data.ba_enabled); 123 cmd->ba_enable_beacon_abort = cpu_to_le32(mvmvif->bf_data.ba_enabled);
124} 124}
125 125
126int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm,
127 struct ieee80211_vif *vif, bool enable)
128{
129 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
130 struct iwl_beacon_filter_cmd cmd = {
131 IWL_BF_CMD_CONFIG_DEFAULTS,
132 .bf_enable_beacon_filter = cpu_to_le32(1),
133 };
134
135 if (!mvmvif->bf_data.bf_enabled)
136 return 0;
137
138 if (mvm->cur_ucode == IWL_UCODE_WOWLAN)
139 cmd.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_D3);
140
141 mvmvif->bf_data.ba_enabled = enable;
142 iwl_mvm_beacon_filter_set_cqm_params(mvm, vif, &cmd);
143 iwl_mvm_beacon_filter_debugfs_parameters(vif, &cmd);
144 return iwl_mvm_beacon_filter_send_cmd(mvm, &cmd, 0);
145}
146
147static void iwl_mvm_power_log(struct iwl_mvm *mvm, 126static void iwl_mvm_power_log(struct iwl_mvm *mvm,
148 struct iwl_mac_power_cmd *cmd) 127 struct iwl_mac_power_cmd *cmd)
149{ 128{
@@ -831,7 +810,7 @@ static int _iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
831 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 810 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
832 int ret; 811 int ret;
833 812
834 if (mvmvif != mvm->bf_allowed_vif || 813 if (mvmvif != mvm->bf_allowed_vif || !vif->bss_conf.dtim_period ||
835 vif->type != NL80211_IFTYPE_STATION || vif->p2p) 814 vif->type != NL80211_IFTYPE_STATION || vif->p2p)
836 return 0; 815 return 0;
837 816
@@ -859,6 +838,25 @@ int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
859 return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, flags, false); 838 return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, flags, false);
860} 839}
861 840
841int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm,
842 struct ieee80211_vif *vif, bool enable)
843{
844 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
845 struct iwl_beacon_filter_cmd cmd = {
846 IWL_BF_CMD_CONFIG_DEFAULTS,
847 .bf_enable_beacon_filter = cpu_to_le32(1),
848 };
849
850 if (!mvmvif->bf_data.bf_enabled)
851 return 0;
852
853 if (mvm->cur_ucode == IWL_UCODE_WOWLAN)
854 cmd.ba_escape_timer = cpu_to_le32(IWL_BA_ESCAPE_TIMER_D3);
855
856 mvmvif->bf_data.ba_enabled = enable;
857 return _iwl_mvm_enable_beacon_filter(mvm, vif, &cmd, 0, false);
858}
859
862int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm, 860int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
863 struct ieee80211_vif *vif, 861 struct ieee80211_vif *vif,
864 u32 flags) 862 u32 flags)
@@ -935,23 +933,3 @@ int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm,
935 933
936 return ret; 934 return ret;
937} 935}
938
939int iwl_mvm_update_beacon_filter(struct iwl_mvm *mvm,
940 struct ieee80211_vif *vif,
941 bool force,
942 u32 flags)
943{
944 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
945
946 if (mvmvif != mvm->bf_allowed_vif)
947 return 0;
948
949 if (!mvmvif->bf_data.bf_enabled) {
950 /* disable beacon filtering explicitly if force is true */
951 if (force)
952 return iwl_mvm_disable_beacon_filter(mvm, vif, flags);
953 return 0;
954 }
955
956 return iwl_mvm_enable_beacon_filter(mvm, vif, flags);
957}