]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iwlwifi: mvm: drop non VO frames when flushing
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 12 Jan 2015 14:34:26 +0000 (16:34 +0200)
committerLuis Henriques <luis.henriques@canonical.com>
Wed, 4 Feb 2015 10:58:32 +0000 (10:58 +0000)
commit 4e6c48e0984e28d064ee8fbc292aee7b7920c507 upstream.

This change has already been implemented in iwldvm:

commit a260e7b3f0307878b99d57ed1406cf2d497923b8
Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Date:   Sun Oct 5 09:11:14 2014 +0300

    iwlwifi: dvm: drop non VO frames when flushing

Since I added the flush() callback implementation in mvm,
we got reports that the queues are stuck while roaming
or suspending.
This commit above helped much for iwldvm, implement the
same behavior for iwlmvm.

Fixes: c5b0e7c0565a ("iwlwifi: mvm: implement mac80211's flush callback")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
[ luis: backport to 3.16 provided by Emmanuel ]
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
drivers/net/wireless/iwlwifi/mvm/mac80211.c

index 08572e212d8f3da881bea737a71ddf25efc13658..ec70feccf77cd434e855fb22a3c568f406fd4cf9 100644 (file)
@@ -2416,6 +2416,7 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif;
        struct iwl_mvm_sta *mvmsta;
+       u32 msk;
 
        if (!vif || vif->type != NL80211_IFTYPE_STATION)
                return;
@@ -2427,13 +2428,14 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
        if (WARN_ON_ONCE(!mvmsta))
                goto done;
 
-       if (drop) {
-               if (iwl_mvm_flush_tx_path(mvm, mvmsta->tfd_queue_msk, true))
-                       IWL_ERR(mvm, "flush request fail\n");
-       } else {
-               iwl_trans_wait_tx_queue_empty(mvm->trans,
-                                             mvmsta->tfd_queue_msk);
-       }
+       msk = mvmsta->tfd_queue_msk;
+       msk &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]);
+
+       if (iwl_mvm_flush_tx_path(mvm, msk, true))
+               IWL_ERR(mvm, "flush request fail\n");
+
+       msk |= BIT(vif->hw_queue[IEEE80211_AC_VO]);
+       iwl_trans_wait_tx_queue_empty(mvm->trans, msk);
 done:
        mutex_unlock(&mvm->mutex);
 }