blob: ff4656bede012f58deb16d0f4e69918d0f5e362f [file] [log] [blame]
developer144824b2022-11-25 21:27:43 +08001From b563403b2ca597970fda5a912433108b3b364349 Mon Sep 17 00:00:00 2001
2From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Fri, 25 Nov 2022 14:32:35 +0800
4Subject: [PATCH 3008/3010] mt76: mt7915: find rx token by physical address
5
6The token id in RxDMAD may be incorrect when it is not the last frame due to
7WED HW bug. Lookup correct token id by physical address in sdp0.
8
9Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
10---
11 dma.c | 21 ++++++++++++++++++++-
12 1 file changed, 20 insertions(+), 1 deletion(-)
13
14diff --git a/dma.c b/dma.c
15index 8987c35f..c3adec5f 100644
16--- a/dma.c
17+++ b/dma.c
18@@ -372,10 +372,29 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
19
20 if ((q->flags & MT_QFLAG_WED) &&
21 FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_Q_RX) {
22+ u32 id, find = 0;
23 u32 token = FIELD_GET(MT_DMA_CTL_TOKEN,
24 le32_to_cpu(desc->buf1));
25- struct mt76_txwi_cache *t = mt76_rx_token_release(dev, token);
26+ struct mt76_txwi_cache *t;
27+
28+ if (*more) {
29+ spin_lock_bh(&dev->rx_token_lock);
30+
31+ idr_for_each_entry(&dev->rx_token, t, id) {
32+ if (t->dma_addr == le32_to_cpu(desc->buf0)) {
33+ find = 1;
34+ desc->buf1 = FIELD_PREP(MT_DMA_CTL_TOKEN, id);
35+ token = id;
36+ break;
37+ }
38+ }
39+
40+ spin_unlock_bh(&dev->rx_token_lock);
41+ if (!find)
42+ return NULL;
43+ }
44
45+ t = mt76_rx_token_release(dev, token);
46 if (!t)
47 return NULL;
48
49--
502.18.0
51