|
@@ -1095,6 +1095,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
u32 queues, bool drop)
|
|
|
{
|
|
|
struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
|
|
|
+ u32 scd_queues;
|
|
|
|
|
|
mutex_lock(&priv->mutex);
|
|
|
IWL_DEBUG_MAC80211(priv, "enter\n");
|
|
@@ -1108,18 +1109,19 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * mac80211 will not push any more frames for transmit
|
|
|
- * until the flush is completed
|
|
|
- */
|
|
|
- if (drop) {
|
|
|
- IWL_DEBUG_MAC80211(priv, "send flush command\n");
|
|
|
- if (iwlagn_txfifo_flush(priv, 0)) {
|
|
|
- IWL_ERR(priv, "flush request fail\n");
|
|
|
- goto done;
|
|
|
- }
|
|
|
+ scd_queues = BIT(priv->cfg->base_params->num_of_queues) - 1;
|
|
|
+ scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) |
|
|
|
+ BIT(IWL_DEFAULT_CMD_QUEUE_NUM));
|
|
|
+
|
|
|
+ if (vif)
|
|
|
+ scd_queues &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]);
|
|
|
+
|
|
|
+ IWL_DEBUG_TX_QUEUES(priv, "Flushing SCD queues: 0x%x\n", scd_queues);
|
|
|
+ if (iwlagn_txfifo_flush(priv, scd_queues)) {
|
|
|
+ IWL_ERR(priv, "flush request fail\n");
|
|
|
+ goto done;
|
|
|
}
|
|
|
- IWL_DEBUG_MAC80211(priv, "wait transmit/flush all frames\n");
|
|
|
+ IWL_DEBUG_TX_QUEUES(priv, "wait transmit/flush all frames\n");
|
|
|
iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff);
|
|
|
done:
|
|
|
mutex_unlock(&priv->mutex);
|