iwlwifi: mvm: Align bt-coex priority with requirements
authorAvri Altman <avri.altman@intel.com>
Mon, 2 Nov 2015 12:16:07 +0000 (14:16 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 1 Dec 2015 19:17:55 +0000 (21:17 +0200)
Fix the gaps between the system requirements and our code.

Signed-off-by: Avri Altman <avri.altman@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/coex.c

index 808f234c953e5fdcfa7771b1138d71115628f1c7..c9ca029c69f4daa6e4a8b9cf27e196464207baae 100644 (file)
@@ -901,6 +901,7 @@ u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
                           struct ieee80211_tx_info *info, u8 ac)
 {
        __le16 fc = hdr->frame_control;
+       bool mplut_enabled = iwl_mvm_is_mplut_supported(mvm);
 
        if (info->band != IEEE80211_BAND_2GHZ)
                return 0;
@@ -908,22 +909,27 @@ u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
        if (unlikely(mvm->bt_tx_prio))
                return mvm->bt_tx_prio - 1;
 
-       /* High prio packet (wrt. BT coex) if it is EAPOL, MCAST or MGMT */
-       if (info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO ||
-            is_multicast_ether_addr(hdr->addr1) ||
-            ieee80211_is_ctl(fc) || ieee80211_is_mgmt(fc) ||
-            ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc))
+       if (likely(ieee80211_is_data(fc))) {
+               if (likely(ieee80211_is_data_qos(fc))) {
+                       switch (ac) {
+                       case IEEE80211_AC_BE:
+                               return mplut_enabled ? 1 : 0;
+                       case IEEE80211_AC_VI:
+                               return mplut_enabled ? 2 : 3;
+                       case IEEE80211_AC_VO:
+                               return 3;
+                       default:
+                               return 0;
+                       }
+               } else if (is_multicast_ether_addr(hdr->addr1)) {
+                       return 3;
+               } else
+                       return 0;
+       } else if (ieee80211_is_mgmt(fc)) {
+               return ieee80211_is_disassoc(fc) ? 0 : 3;
+       } else if (ieee80211_is_ctl(fc)) {
+               /* ignore cfend and cfendack frames as we never send those */
                return 3;
-
-       switch (ac) {
-       case IEEE80211_AC_BE:
-               return 1;
-       case IEEE80211_AC_VO:
-               return 3;
-       case IEEE80211_AC_VI:
-               return 2;
-       default:
-               break;
        }
 
        return 0;