blob: 21367e91564104f77da40686fe2b06a5c28417ce [file] [log] [blame]
developerfd8e1152023-02-14 11:29:23 +08001From fc10309ea47b4d34ace30e6f4e7ff0c0ffa71db2 Mon Sep 17 00:00:00 2001
developer144824b2022-11-25 21:27:43 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Fri, 25 Nov 2022 14:32:35 +0800
developerfd8e1152023-02-14 11:29:23 +08004Subject: [PATCH 3004/3015] mt76: mt7915: wed: find rx token by physical
developerbf24a8a2022-11-30 14:52:20 +08005 address
developer144824b2022-11-25 21:27:43 +08006
7The token id in RxDMAD may be incorrect when it is not the last frame due to
8WED HW bug. Lookup correct token id by physical address in sdp0.
9
developerafd75872022-12-14 21:15:46 +080010Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
developer144824b2022-11-25 21:27:43 +080011---
developerc04f5402023-02-03 09:22:26 +080012 dma.c | 27 ++++++++++++++++++++++++++-
13 1 file changed, 26 insertions(+), 1 deletion(-)
developer144824b2022-11-25 21:27:43 +080014
15diff --git a/dma.c b/dma.c
developerc04f5402023-02-03 09:22:26 +080016index a6bb3730..b58579c5 100644
developer144824b2022-11-25 21:27:43 +080017--- a/dma.c
18+++ b/dma.c
developerc04f5402023-02-03 09:22:26 +080019@@ -402,10 +402,35 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
20 *info = le32_to_cpu(desc->info);
developer144824b2022-11-25 21:27:43 +080021
developerc04f5402023-02-03 09:22:26 +080022 if (mt76_queue_is_wed_rx(q)) {
23+ __le32 buf1;
developer144824b2022-11-25 21:27:43 +080024+ u32 id, find = 0;
25 u32 token = FIELD_GET(MT_DMA_CTL_TOKEN,
26 le32_to_cpu(desc->buf1));
27- struct mt76_txwi_cache *t = mt76_rx_token_release(dev, token);
28+ struct mt76_txwi_cache *t;
developer28d04742023-01-18 14:02:40 +080029+
developer144824b2022-11-25 21:27:43 +080030+ if (*more) {
31+ spin_lock_bh(&dev->rx_token_lock);
32+
33+ idr_for_each_entry(&dev->rx_token, t, id) {
34+ if (t->dma_addr == le32_to_cpu(desc->buf0)) {
35+ find = 1;
developer144824b2022-11-25 21:27:43 +080036+ token = id;
developerc04f5402023-02-03 09:22:26 +080037+
38+ /* Write correct id back to DMA*/
39+ buf1 = desc->buf1;
40+ buf1 = le32_replace_bits(buf1, id,
41+ MT_DMA_CTL_TOKEN);
42+ WRITE_ONCE(desc->buf1, buf1);
developer144824b2022-11-25 21:27:43 +080043+ break;
44+ }
45+ }
46+
47+ spin_unlock_bh(&dev->rx_token_lock);
48+ if (!find)
49+ return NULL;
50+ }
developer28d04742023-01-18 14:02:40 +080051
developer144824b2022-11-25 21:27:43 +080052+ t = mt76_rx_token_release(dev, token);
53 if (!t)
54 return NULL;
55
56--
developerd75d3632023-01-05 14:31:01 +0800572.18.0
developer144824b2022-11-25 21:27:43 +080058