mt76: dma: introduce mt76_dma_queue_reset routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 7 Mar 2021 18:20:49 +0000 (19:20 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sun, 11 Apr 2021 22:01:25 +0000 (00:01 +0200)
Introduce mt76_dma_queue_reset utility routine to reset a given hw
queue. This is a preliminary patch to introduce mt7921 chip reset
support.

Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/dma.c
drivers/net/wireless/mediatek/mt76/mt76.h

index 6273b2cfce4f1030f46d85b50e419fc4b754dd86..8d4a276130cf69c23deb539f202ba49ece4f4140 100644 (file)
@@ -79,13 +79,38 @@ mt76_free_pending_txwi(struct mt76_dev *dev)
        local_bh_enable();
 }
 
+static void
+mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
+{
+       writel(q->desc_dma, &q->regs->desc_base);
+       writel(q->ndesc, &q->regs->ring_size);
+       q->head = readl(&q->regs->dma_idx);
+       q->tail = q->head;
+}
+
+static void
+mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q)
+{
+       int i;
+
+       if (!q)
+               return;
+
+       /* clear descriptors */
+       for (i = 0; i < q->ndesc; i++)
+               q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE);
+
+       writel(0, &q->regs->cpu_idx);
+       writel(0, &q->regs->dma_idx);
+       mt76_dma_sync_idx(dev, q);
+}
+
 static int
 mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
                     int idx, int n_desc, int bufsize,
                     u32 ring_base)
 {
        int size;
-       int i;
 
        spin_lock_init(&q->lock);
        spin_lock_init(&q->cleanup_lock);
@@ -105,14 +130,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
        if (!q->entry)
                return -ENOMEM;
 
-       /* clear descriptors */
-       for (i = 0; i < q->ndesc; i++)
-               q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE);
-
-       writel(q->desc_dma, &q->regs->desc_base);
-       writel(0, &q->regs->cpu_idx);
-       writel(0, &q->regs->dma_idx);
-       writel(q->ndesc, &q->regs->ring_size);
+       mt76_dma_queue_reset(dev, q);
 
        return 0;
 }
@@ -201,15 +219,6 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,
        memset(e, 0, sizeof(*e));
 }
 
-static void
-mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
-{
-       writel(q->desc_dma, &q->regs->desc_base);
-       writel(q->ndesc, &q->regs->ring_size);
-       q->head = readl(&q->regs->dma_idx);
-       q->tail = q->head;
-}
-
 static void
 mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q)
 {
@@ -642,6 +651,7 @@ mt76_dma_init(struct mt76_dev *dev)
 static const struct mt76_queue_ops mt76_dma_ops = {
        .init = mt76_dma_init,
        .alloc = mt76_dma_alloc_queue,
+       .reset_q = mt76_dma_queue_reset,
        .tx_queue_skb_raw = mt76_dma_tx_queue_skb_raw,
        .tx_queue_skb = mt76_dma_tx_queue_skb,
        .tx_cleanup = mt76_dma_tx_cleanup,
index 4945b0430380acea9d95a211b3e5409816ab90d9..b21a724679273537828b660f3cfaa59f5707f3af 100644 (file)
@@ -192,6 +192,8 @@ struct mt76_queue_ops {
                           bool flush);
 
        void (*kick)(struct mt76_dev *dev, struct mt76_queue *q);
+
+       void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q);
 };
 
 enum mt76_wcid_flags {
@@ -796,6 +798,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev)
 #define mt76_queue_rx_reset(dev, ...)  (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__)
 #define mt76_queue_tx_cleanup(dev, ...)        (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
 #define mt76_queue_kick(dev, ...)      (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__)
+#define mt76_queue_reset(dev, ...)     (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)
 
 #define mt76_for_each_q_rx(dev, i)     \
        for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \