diff --git a/dma.c b/dma.c index 2d23467b..b22dbd46 100644 --- a/dma.c +++ b/dma.c @@ -134,6 +134,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush) { struct mt76_queue *q = &dev->q_tx[qid]; struct mt76_queue_entry entry; + bool wake = false; int last; if (!q->ndesc) @@ -153,8 +154,10 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush) if (entry.skb) dev->drv->tx_complete_skb(dev, q, &entry, flush); - if (entry.txwi) + if (entry.txwi) { mt76_put_txwi(dev, entry.txwi); + wake = true; + } q->tail = (q->tail + 1) % q->ndesc; q->queued--; @@ -168,7 +171,11 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush) else mt76_dma_sync_idx(dev, q); + wake = wake && qid < IEEE80211_NUM_ACS && q->queued < q->ndesc - 8; spin_unlock_bh(&q->lock); + + if (wake) + ieee80211_wake_queue(dev->hw, qid); } static void * diff --git a/mt76x2_tx.c b/mt76x2_tx.c index 309e7dad..8d9f134f 100644 --- a/mt76x2_tx.c +++ b/mt76x2_tx.c @@ -41,8 +41,6 @@ void mt76x2_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, void mt76x2_tx_complete(struct mt76x2_dev *dev, struct sk_buff *skb) { struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); - struct mt76_queue *q; - int qid = skb_get_queue_mapping(skb); if (info->flags & IEEE80211_TX_CTL_AMPDU) { ieee80211_free_txskb(mt76_hw(dev), skb); @@ -52,10 +50,6 @@ void mt76x2_tx_complete(struct mt76x2_dev *dev, struct sk_buff *skb) info->flags |= IEEE80211_TX_STAT_ACK; ieee80211_tx_status(mt76_hw(dev), skb); } - - q = &dev->mt76.q_tx[qid]; - if (q->queued < q->ndesc - 8) - ieee80211_wake_queue(mt76_hw(dev), qid); } int mt76x2_tx_prepare_skb(struct mt76_dev *mdev, void *txwi,