move dma rx cleanup to core

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2016-01-28 20:35:26 +01:00
parent 0f896990cd
commit 0bbfb5653f
4 changed files with 35 additions and 47 deletions
+19 -2
View File
@@ -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,
};
+7 -4
View File
@@ -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__)
+3 -19
View File
@@ -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);
}
+6 -22
View File
@@ -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);
}