iwlwifi: mvm: don't skip mgmt tid when flushing all tids
authorHaim Dreyfuss <haim.dreyfuss@intel.com>
Fri, 15 Nov 2019 07:28:17 +0000 (09:28 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 15 Nov 2019 07:34:29 +0000 (09:34 +0200)
There are various of flows which require tids flushing
(disconnection, suspend, etc...).
Currently, when the driver instructs the FW to flush
he masks all the data tids(0-7).
However, the driver doesn't set the management tid (#15)
which cause the FW not to flush it.
When the FW tries to remove the mgmt queue he throws an assert
since it is not an empty queue.
instead of just set only the data tids set everything and let
the FW ignore the invalid tids.

Signed-off-by: Haim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index 754adc0146beea2bf2a4aad231c5adc11cf288fb..9970f61b9f9f53536e39dd8f1d09f27f7670ef35 100644 (file)
@@ -148,7 +148,8 @@ static ssize_t iwl_dbgfs_tx_flush_write(struct iwl_mvm *mvm, char *buf,
                                    "FLUSHING all tids queues on sta_id = %d\n",
                                    flush_arg);
                mutex_lock(&mvm->mutex);
-               ret = iwl_mvm_flush_sta_tids(mvm, flush_arg, 0xFF, 0) ? : count;
+               ret = iwl_mvm_flush_sta_tids(mvm, flush_arg, 0xFFFF, 0)
+                       ? : count;
                mutex_unlock(&mvm->mutex);
                return ret;
        }
index 61c33b9335e34a0996f30967ad359afc458aa2b3..473d56552e26395fca15bc89eb4050f9cd1bf8f4 100644 (file)
@@ -4644,7 +4644,7 @@ static void iwl_mvm_flush_no_vif(struct iwl_mvm *mvm, u32 queues, bool drop)
                        continue;
 
                if (drop)
-                       iwl_mvm_flush_sta_tids(mvm, i, 0xFF, 0);
+                       iwl_mvm_flush_sta_tids(mvm, i, 0xFFFF, 0);
                else
                        iwl_mvm_wait_sta_queues_empty(mvm,
                                        iwl_mvm_sta_from_mac80211(sta));
index f4778a6a40b96de75ab0f456330ab1c451b3286a..81a88a89ea7422706e8d255c26daec415b8dcb0a 100644 (file)
@@ -2059,7 +2059,7 @@ int iwl_mvm_flush_sta(struct iwl_mvm *mvm, void *sta, bool internal, u32 flags)
 
        if (iwl_mvm_has_new_tx_api(mvm))
                return iwl_mvm_flush_sta_tids(mvm, mvm_sta->sta_id,
-                                             0xff | BIT(IWL_MGMT_TID), flags);
+                                             0xffff, flags);
 
        if (internal)
                return iwl_mvm_flush_tx_path(mvm, int_sta->tfd_queue_msk,