From 0bbfb5653f0815bbb49f58df2ad445c2af67cc86 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 28 Jan 2016 20:35:26 +0100 Subject: [PATCH] move dma rx cleanup to core Signed-off-by: Felix Fietkau --- dma.c | 21 +++++++++++++++++++-- mt76.h | 11 +++++++---- mt7603_dma.c | 22 +++------------------- mt76x2_dma.c | 28 ++++++---------------------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/dma.c b/dma.c index 7220b91a..fea8efa1 100644 --- a/dma.c +++ b/dma.c @@ -93,7 +93,7 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx, } static void -mt76_dma_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush, +mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush, void (*done)(struct mt76_dev *dev, struct mt76_queue *q, struct mt76_queue_entry *e)) { @@ -216,12 +216,29 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q, bool napi) return frames; } +static void +mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q) +{ + void *buf; + + spin_lock_bh(&q->lock); + do { + buf = mt76_dma_dequeue(dev, q, true, NULL, NULL); + if (!buf) + break; + + skb_free_frag(buf); + } while (1); + spin_unlock_bh(&q->lock); +} + static const struct mt76_queue_ops mt76_dma_ops = { .alloc = mt76_dma_alloc_queue, .add_buf = mt76_dma_add_buf, .rx_fill = mt76_dma_rx_fill, .dequeue = mt76_dma_dequeue, - .cleanup = mt76_dma_cleanup, + .tx_cleanup = mt76_dma_tx_cleanup, + .rx_cleanup = mt76_dma_rx_cleanup, .kick = mt76_dma_kick_queue, }; diff --git a/mt76.h b/mt76.h index 2a8cd5ab..e2a5e28b 100644 --- a/mt76.h +++ b/mt76.h @@ -92,12 +92,14 @@ struct mt76_queue_ops { void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, int *len, u32 *info); - void (*cleanup)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, - void (*done)(struct mt76_dev *dev, struct mt76_queue *q, - struct mt76_queue_entry *e)); + void (*tx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, + void (*done)(struct mt76_dev *dev, struct mt76_queue *q, + struct mt76_queue_entry *e)); int (*rx_fill)(struct mt76_dev *dev, struct mt76_queue *q, bool napi); + void (*rx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q); + void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); }; @@ -220,7 +222,8 @@ static inline u16 mt76_rev(struct mt76_dev *dev) #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_add_buf(dev, ...) (dev)->mt76.queue_ops->add_buf(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_dequeue(dev, ...) (dev)->mt76.queue_ops->dequeue(&((dev)->mt76), __VA_ARGS__) -#define mt76_queue_cleanup(dev, ...) (dev)->mt76.queue_ops->cleanup(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) +#define mt76_queue_rx_cleanup(dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_rx_fill(dev, ...) (dev)->mt76.queue_ops->rx_fill(&((dev)->mt76), __VA_ARGS__) #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) diff --git a/mt7603_dma.c b/mt7603_dma.c index 86490e15..56dc9067 100644 --- a/mt7603_dma.c +++ b/mt7603_dma.c @@ -67,26 +67,10 @@ mt7603_tx_cleanup_entry(struct mt76_dev *mdev, struct mt76_queue *q, dev_kfree_skb_any(e->skb); } -static void -mt7603_rx_cleanup(struct mt7603_dev *dev, struct mt76_queue *q) -{ - void *buf; - - spin_lock_bh(&q->lock); - do { - buf = mt76_queue_dequeue(dev, q, true, NULL, NULL); - if (!buf) - break; - - skb_free_frag(buf); - } while (1); - spin_unlock_bh(&q->lock); -} - static void mt7603_tx_cleanup(struct mt7603_dev *dev, struct mt76_queue *q, bool flush) { - mt76_queue_cleanup(dev, q, flush, mt7603_tx_cleanup_entry); + mt76_queue_tx_cleanup(dev, q, flush, mt7603_tx_cleanup_entry); } static int @@ -310,6 +294,6 @@ void mt7603_dma_cleanup(struct mt7603_dev *dev) tasklet_kill(&dev->rx_tasklet); for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) mt7603_tx_cleanup(dev, &dev->mt76.q_tx[i], true); - mt7603_rx_cleanup(dev, &dev->q_rx); - mt7603_rx_cleanup(dev, &dev->mcu.q_rx); + mt76_queue_rx_cleanup(dev, &dev->q_rx); + mt76_queue_rx_cleanup(dev, &dev->mcu.q_rx); } diff --git a/mt76x2_dma.c b/mt76x2_dma.c index d62ec2ad..0eca0a9f 100644 --- a/mt76x2_dma.c +++ b/mt76x2_dma.c @@ -96,28 +96,12 @@ mt76x2_tx_cleanup_entry(struct mt76_dev *mdev, struct mt76_queue *q, } static void -mt76x2_rx_cleanup(struct mt76x2_dev *dev, struct mt76_queue *q) -{ - void *buf; - - spin_lock_bh(&q->lock); - do { - buf = mt76_queue_dequeue(dev, q, true, NULL, NULL); - if (!buf) - break; - - skb_free_frag(buf); - } while (1); - spin_unlock_bh(&q->lock); -} - -static void -mt76_tx_cleanup(struct mt76x2_dev *dev, struct mt76_queue *q, bool flush) +mt76x2_tx_cleanup(struct mt76x2_dev *dev, struct mt76_queue *q, bool flush) { if (!q->desc) return; - mt76_queue_cleanup(dev, q, flush, mt76x2_tx_cleanup_entry); + mt76_queue_tx_cleanup(dev, q, flush, mt76x2_tx_cleanup_entry); } static int @@ -230,7 +214,7 @@ mt76x2_tx_tasklet(unsigned long data) mt76x2_mac_process_tx_status_fifo(dev); for (i = ARRAY_SIZE(dev->mt76.q_tx) - 1; i >= 0; i--) - mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], false); + mt76x2_tx_cleanup(dev, &dev->mt76.q_tx[i], false); mt76x2_mac_poll_tx_status(dev, false); mt76x2_irq_enable(dev, MT_INT_TX_DONE_ALL); @@ -333,7 +317,7 @@ void mt76x2_dma_cleanup(struct mt76x2_dev *dev) tasklet_kill(&dev->tx_tasklet); tasklet_kill(&dev->rx_tasklet); for (i = 0; i < ARRAY_SIZE(dev->mt76.q_tx); i++) - mt76_tx_cleanup(dev, &dev->mt76.q_tx[i], true); - mt76x2_rx_cleanup(dev, &dev->q_rx); - mt76x2_rx_cleanup(dev, &dev->mcu.q_rx); + mt76x2_tx_cleanup(dev, &dev->mt76.q_tx[i], true); + mt76_queue_rx_cleanup(dev, &dev->q_rx); + mt76_queue_rx_cleanup(dev, &dev->mcu.q_rx); }