mt76: dma: introduce mt76_dma_queue_reset routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 7 Mar 2021 18:20:49 +0000 (19:20 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 11 Jul 2021 10:56:06 +0000 (12:56 +0200)
commit 3990465db6829c91e8ebfde51ba2d98885020249 upstream.

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>
Cc: Deren Wu <Deren.Wu@mediatek.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/mediatek/mt76/dma.c
drivers/net/wireless/mediatek/mt76/mt76.h

index 7196fa9047e6d1b20fa368482678d30f08325891..14d6b7ee5a139671eb031f4d0a0fd0119bc02323 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)
 {
@@ -640,6 +649,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 36a430f09f64ced256e18ffca01dcc71b1fe9662..09fd6f86116b0cc57553cddfaeaa6632d7625553 100644 (file)
@@ -191,6 +191,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 {
@@ -786,6 +788,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) && \