aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-05-18 02:16:45 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-05-19 09:38:21 -0400
commit5c90422439d62b574fd9e021fabaae2dc9a3065e (patch)
tree07aa1c5b8deab261bf06f40395853ca63078d912 /drivers/net/wireless/iwlwifi/mvm
parent894981ed43fc5e706330469e27972f7c2dd046cb (diff)
iwlwifi: mvm: don't allow diversity if BT Coex / TT forbid it
We should not allow diversity when BT Coex needs the second antenna. Thermal Throttling can also request to stop using the second antenna. Honour those requests. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c33
3 files changed, 35 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 5d2effb4832a..4a5db07ae028 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -1008,6 +1008,7 @@ int iwl_mvm_update_beacon_filter(struct iwl_mvm *mvm,
1008void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1008void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1009 enum iwl_mvm_smps_type_request req_type, 1009 enum iwl_mvm_smps_type_request req_type,
1010 enum ieee80211_smps_mode smps_request); 1010 enum ieee80211_smps_mode smps_request);
1011bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
1011 1012
1012/* Low latency */ 1013/* Low latency */
1013int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1014int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
index acb79af6fa89..539f3a942d43 100644
--- a/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
@@ -163,8 +163,7 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
163 * between the two antennas is sufficiently different to impact 163 * between the two antennas is sufficiently different to impact
164 * performance. 164 * performance.
165 */ 165 */
166 if (active_cnt == 1 && num_of_ant(mvm->fw->valid_rx_ant) > 1 && 166 if (active_cnt == 1 && iwl_mvm_rx_diversity_allowed(mvm)) {
167 !mvm->cfg->rx_with_siso_diversity) {
168 idle_cnt = 2; 167 idle_cnt = 2;
169 active_cnt = 2; 168 active_cnt = 2;
170 } 169 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index b269f1e30e87..42cea32ac546 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -650,6 +650,39 @@ void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
650 ieee80211_request_smps(vif, smps_mode); 650 ieee80211_request_smps(vif, smps_mode);
651} 651}
652 652
653static void iwl_mvm_diversity_iter(void *_data, u8 *mac,
654 struct ieee80211_vif *vif)
655{
656 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
657 bool *result = _data;
658 int i;
659
660 for (i = 0; i < NUM_IWL_MVM_SMPS_REQ; i++) {
661 if (mvmvif->smps_requests[i] == IEEE80211_SMPS_STATIC ||
662 mvmvif->smps_requests[i] == IEEE80211_SMPS_DYNAMIC)
663 *result = false;
664 }
665}
666
667bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
668{
669 bool result = true;
670
671 lockdep_assert_held(&mvm->mutex);
672
673 if (num_of_ant(mvm->fw->valid_rx_ant) == 1)
674 return false;
675
676 if (!mvm->cfg->rx_with_siso_diversity)
677 return false;
678
679 ieee80211_iterate_active_interfaces_atomic(
680 mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
681 iwl_mvm_diversity_iter, &result);
682
683 return result;
684}
685
653int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 686int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
654 bool value) 687 bool value)
655{ 688{