simplify dma cleanup

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2015-06-13 09:26:41 +02:00
parent fdefddc35f
commit ee01a1784d
+18 -33
View File
@@ -20,12 +20,6 @@ struct mt76_txwi_cache {
struct list_head list; struct list_head list;
}; };
enum mt76_dma_dequeue {
DMA_DEQUEUE_FLUSH,
DMA_DEQUEUE_DDONE,
DMA_DEQUEUE_IDX,
};
static inline int static inline int
mt76_rx_buf_offset(struct mt76_dev *dev) mt76_rx_buf_offset(struct mt76_dev *dev)
{ {
@@ -266,29 +260,14 @@ free:
} }
static int static int
mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, enum mt76_dma_dequeue type) mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush)
{ {
int ret = -1; int ret = -1;
u16 idx;
bool skip;
if (!q->queued) if (!q->queued)
return -1; return -1;
switch (type) { if (!flush && !(q->desc[q->tail].ctrl & cpu_to_le32(MT_DMA_CTL_DMA_DONE)))
case DMA_DEQUEUE_DDONE:
skip = !(q->desc[q->tail].ctrl & cpu_to_le32(MT_DMA_CTL_DMA_DONE));
break;
case DMA_DEQUEUE_IDX:
idx = ioread32(&q->regs->dma_idx);
skip = (q->tail == idx);
break;
case DMA_DEQUEUE_FLUSH:
skip = false;
break;
}
if (skip)
return -1; return -1;
ret = q->tail; ret = q->tail;
@@ -335,18 +314,24 @@ mt76_tx_cleanup_entry(struct mt76_dev *dev, struct mt76_queue *q, int idx,
static void static void
mt76_tx_cleanup_queue(struct mt76_dev *dev, struct mt76_queue *q, bool flush) mt76_tx_cleanup_queue(struct mt76_dev *dev, struct mt76_queue *q, bool flush)
{ {
enum mt76_dma_dequeue type = flush ? DMA_DEQUEUE_FLUSH : DMA_DEQUEUE_IDX; int idx, last;
int idx;
spin_lock_bh(&q->lock); spin_lock_bh(&q->lock);
do { idx = q->tail;
idx = mt76_dma_dequeue(dev, q, type); if (flush)
if (idx < 0) last = -1;
break; else
last = ioread32(&q->regs->dma_idx);
mt76_tx_cleanup_entry(dev, q, idx, flush); while (q->queued && q->tail != last) {
} while (1); mt76_tx_cleanup_entry(dev, q, q->tail, flush);
q->tail = (q->tail + 1) % q->ndesc;
q->queued--;
if (q->tail == last)
last = ioread32(&q->regs->dma_idx);
}
spin_unlock_bh(&q->lock); spin_unlock_bh(&q->lock);
} }
@@ -381,7 +366,7 @@ mt76_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
spin_lock_bh(&q->lock); spin_lock_bh(&q->lock);
do { do {
idx = mt76_dma_dequeue(dev, q, DMA_DEQUEUE_FLUSH); idx = mt76_dma_dequeue(dev, q, true);
if (idx < 0) if (idx < 0)
break; break;
@@ -449,7 +434,7 @@ mt76_process_rx_queue(struct mt76_dev *dev, struct mt76_queue *q, int budget)
int done = 0; int done = 0;
while (done < budget) { while (done < budget) {
idx = mt76_dma_dequeue(dev, q, DMA_DEQUEUE_DDONE); idx = mt76_dma_dequeue(dev, q, false);
if (idx < 0) if (idx < 0)
break; break;