mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user