|
@@ -1451,7 +1451,7 @@ static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
|
|
|
{
|
|
|
u32 tfd_msk = iwl_mvm_mac_get_queues_mask(vif);
|
|
|
|
|
|
- if (tfd_msk) {
|
|
|
+ if (tfd_msk && !iwl_mvm_is_dqa_supported(mvm)) {
|
|
|
/*
|
|
|
* mac80211 first removes all the stations of the vif and
|
|
|
* then removes the vif. When it removes a station it also
|
|
@@ -1460,6 +1460,8 @@ static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
|
|
|
* of these AMPDU sessions are properly closed.
|
|
|
* We still need to take care of the shared queues of the vif.
|
|
|
* Flush them here.
|
|
|
+ * For DQA mode there is no need - broacast and multicast queue
|
|
|
+ * are flushed separately.
|
|
|
*/
|
|
|
mutex_lock(&mvm->mutex);
|
|
|
iwl_mvm_flush_tx_path(mvm, tfd_msk, 0);
|
|
@@ -3988,21 +3990,21 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
|
|
|
/* make sure only TDLS peers or the AP are flushed */
|
|
|
WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls);
|
|
|
|
|
|
- msk |= mvmsta->tfd_queue_msk;
|
|
|
+ if (drop) {
|
|
|
+ if (iwl_mvm_flush_sta(mvm, mvmsta, false, 0))
|
|
|
+ IWL_ERR(mvm, "flush request fail\n");
|
|
|
+ } else {
|
|
|
+ msk |= mvmsta->tfd_queue_msk;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (drop) {
|
|
|
- if (iwl_mvm_flush_tx_path(mvm, msk, 0))
|
|
|
- IWL_ERR(mvm, "flush request fail\n");
|
|
|
- mutex_unlock(&mvm->mutex);
|
|
|
- } else {
|
|
|
- mutex_unlock(&mvm->mutex);
|
|
|
+ mutex_unlock(&mvm->mutex);
|
|
|
|
|
|
- /* this can take a while, and we may need/want other operations
|
|
|
- * to succeed while doing this, so do it without the mutex held
|
|
|
- */
|
|
|
+ /* this can take a while, and we may need/want other operations
|
|
|
+ * to succeed while doing this, so do it without the mutex held
|
|
|
+ */
|
|
|
+ if (!drop)
|
|
|
iwl_trans_wait_tx_queues_empty(mvm->trans, msk);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
|