dma: tell the driver if the buffer was the last one

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2016-02-01 21:50:08 +01:00
parent ac6f0a12dc
commit 1b5492bd23
4 changed files with 14 additions and 7 deletions
+8 -4
View File
@@ -128,7 +128,7 @@ mt76_dma_tx_cleanup(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
static void *
mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
int *len, u32 *info)
int *len, u32 *info, bool *more)
{
struct mt76_queue_entry *e = &q->entry[idx];
struct mt76_desc *desc = &q->desc[idx];
@@ -140,7 +140,9 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
if (len) {
u32 ctl = ACCESS_ONCE(desc->ctrl);
*len = MT76_GET(MT_DMA_CTL_SD_LEN0, ctl);
*more = !(ctl & MT_DMA_CTL_LAST_SEC0);
}
if (info)
*info = le32_to_cpu(desc->info);
@@ -152,10 +154,11 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
static void *
mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
int *len, u32 *info)
int *len, u32 *info, bool *more)
{
int idx = q->tail;
*more = false;
if (!q->queued)
return NULL;
@@ -165,7 +168,7 @@ mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
q->tail = (q->tail + 1) % q->ndesc;
q->queued--;
return mt76_dma_get_buf(dev, q, idx, len, info);
return mt76_dma_get_buf(dev, q, idx, len, info, more);
}
static void
@@ -220,10 +223,11 @@ static void
mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
{
void *buf;
bool more;
spin_lock_bh(&q->lock);
do {
buf = mt76_dma_dequeue(dev, q, true, NULL, NULL);
buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
if (!buf)
break;
+2 -1
View File
@@ -81,6 +81,7 @@ struct mt76_queue {
int buf_offset;
dma_addr_t desc_dma;
struct sk_buff *rx_head;
};
struct mt76_queue_ops {
@@ -90,7 +91,7 @@ struct mt76_queue_ops {
u32 buf0, int len0, u32 buf1, int len1, u32 info);
void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
int *len, u32 *info);
int *len, u32 *info, bool *more);
void (*tx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
void (*done)(struct mt76_dev *dev, struct mt76_queue *q,
+2 -1
View File
@@ -132,9 +132,10 @@ mt7603_process_rx_queue(struct mt7603_dev *dev, struct mt76_queue *q, int budget
int len;
int done = 0;
bool napi = q == &dev->q_rx;
bool more;
while (done < budget) {
data = mt76_queue_dequeue(dev, q, false, &len, NULL);
data = mt76_queue_dequeue(dev, q, false, &len, NULL, &more);
if (!data)
break;
+2 -1
View File
@@ -158,11 +158,12 @@ mt76x2_process_rx_queue(struct mt76x2_dev *dev, struct mt76_queue *q, int budget
int len;
int done = 0;
bool napi = q == &dev->q_rx;
bool more;
while (done < budget) {
u32 info;
data = mt76_queue_dequeue(dev, q, false, &len, &info);
data = mt76_queue_dequeue(dev, q, false, &len, &info, &more);
if (!data)
break;