iwlwifi: mvm: BT Coex - set low latency vif as primary
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 15 Jan 2014 14:57:54 +0000 (16:57 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 3 Feb 2014 20:23:35 +0000 (22:23 +0200)
If a vif is in low latency mode, it should be in primary
channel.
Also tell BT Coex about the change when a vif enters or
exits low latency mode.

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
drivers/net/wireless/iwlwifi/mvm/utils.c

index b1a572e52f462411f4c4c8efc76fef147dc4dc6d..d38c4aec640eda10a92a91f95d756d5220bd63ed 100644 (file)
@@ -542,6 +542,7 @@ struct iwl_bt_iterator_data {
        bool reduced_tx_power;
        struct ieee80211_chanctx_conf *primary;
        struct ieee80211_chanctx_conf *secondary;
+       bool primary_ll;
 };
 
 static inline
@@ -590,7 +591,14 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
                return;
        }
 
-       /* SoftAP / GO will always be primary */
+       /* low latency is always primary */
+       if (iwl_mvm_vif_low_latency(mvmvif)) {
+               data->primary_ll = true;
+
+               data->secondary = data->primary;
+               data->primary = chanctx_conf;
+       }
+
        if (vif->type == NL80211_IFTYPE_AP) {
                if (!mvmvif->ap_ibss_active)
                        return;
@@ -601,9 +609,17 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
                if (chanctx_conf == data->primary)
                        return;
 
-               /* downgrade the current primary no matter what its type is */
-               data->secondary = data->primary;
-               data->primary = chanctx_conf;
+               if (!data->primary_ll) {
+                       /*
+                        * downgrade the current primary no matter what its
+                        * type is.
+                        */
+                       data->secondary = data->primary;
+                       data->primary = chanctx_conf;
+               } else {
+                       /* there is low latency vif - we will be secondary */
+                       data->secondary = chanctx_conf;
+               }
                return;
        }
 
@@ -613,7 +629,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
        if (!vif->bss_conf.assoc)
                return;
 
-       /* STA / P2P Client, try to be primary if first vif */
+       /*
+        * STA / P2P Client, try to be primary if first vif. If we are in low
+        * latency mode, we are already in primary and just don't do much
+        */
        if (!data->primary || data->primary == chanctx_conf)
                data->primary = chanctx_conf;
        else if (!data->secondary)
index 790da1bea25ed5dfa46ecd0732929baf3ef146c4..c7ee2f3e506b4812dfec98db12e7f4de41a7aa1f 100644 (file)
@@ -550,5 +550,8 @@ int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
        res = iwl_mvm_update_quotas(mvm, NULL);
        if (res)
                return res;
+
+       iwl_mvm_bt_coex_vif_change(mvm);
+
        return iwl_mvm_power_update_mode(mvm, vif);
 }