From 066cc441eb8fcec7a3aeb6a320f5f9e6c21790f1 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 21 Nov 2020 18:23:35 +0100 Subject: [PATCH] mt76: attempt to free up more room when filling the tx queue Run dma cleanup immediately if the queue is almost full, instead of waiting for the tx interrupt Signed-off-by: Felix Fietkau --- dma.c | 3 +++ mt76.h | 1 + tx.c | 8 ++++++++ 3 files changed, 12 insertions(+) diff --git a/dma.c b/dma.c index e2d86eece..8d1074f14 100644 --- a/dma.c +++ b/dma.c @@ -88,6 +88,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, int i; spin_lock_init(&q->lock); + spin_lock_init(&q->cleanup_lock); q->regs = dev->mmio.regs + ring_base + idx * MT_RING_SIZE; q->ndesc = n_desc; @@ -225,6 +226,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush) if (!q) return; + spin_lock_bh(&q->cleanup_lock); if (flush) last = -1; else @@ -243,6 +245,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush) last = readl(&q->regs->dma_idx); } + spin_unlock_bh(&q->cleanup_lock); if (flush) { spin_lock_bh(&q->lock); diff --git a/mt76.h b/mt76.h index d1997a985..58e7145ee 100644 --- a/mt76.h +++ b/mt76.h @@ -126,6 +126,7 @@ struct mt76_queue { struct mt76_queue_regs __iomem *regs; spinlock_t lock; + spinlock_t cleanup_lock; struct mt76_queue_entry *entry; struct mt76_desc *desc; diff --git a/tx.c b/tx.c index 41dd0a806..234c82023 100644 --- a/tx.c +++ b/tx.c @@ -444,6 +444,7 @@ static int mt76_txq_schedule_list(struct mt76_phy *phy, enum mt76_txq_id qid) { struct mt76_queue *q = phy->q_tx[qid]; + struct mt76_dev *dev = phy->dev; struct ieee80211_txq *txq; struct mt76_txq *mtxq; struct mt76_wcid *wcid; @@ -460,6 +461,13 @@ mt76_txq_schedule_list(struct mt76_phy *phy, enum mt76_txq_id qid) if (q->stopped || q->blocked) break; + if (dev->queue_ops->tx_cleanup && + q->queued + 2 * MT_TXQ_FREE_THR >= q->ndesc) { + spin_unlock_bh(&q->lock); + dev->queue_ops->tx_cleanup(dev, q, false); + spin_lock_bh(&q->lock); + } + if (q->queued + MT_TXQ_FREE_THR >= q->ndesc) break;