diff --git a/dma.c b/dma.c index fea8efa1..14d3ddc6 100644 --- a/dma.c +++ b/dma.c @@ -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; diff --git a/mt76.h b/mt76.h index e2a5e28b..a2e373bd 100644 --- a/mt76.h +++ b/mt76.h @@ -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, diff --git a/mt7603_dma.c b/mt7603_dma.c index f9f0f54e..b3390b7e 100644 --- a/mt7603_dma.c +++ b/mt7603_dma.c @@ -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; diff --git a/mt76x2_dma.c b/mt76x2_dma.c index 89167eb2..567469ff 100644 --- a/mt76x2_dma.c +++ b/mt76x2_dma.c @@ -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;