blob: f78778946595ab0b8548c80f9d832532f77bcf00 [file] [log] [blame]
developer356ecec2022-11-14 10:25:04 +08001From 70c17335911119c353fdf709d8ce1688509c02d0 Mon Sep 17 00:00:00 2001
developer6abc5082022-09-27 17:39:17 +08002From: Peter Chiu <chui-hao.chiu@mediatek.com>
3Date: Tue, 27 Sep 2022 16:34:26 +0800
developer356ecec2022-11-14 10:25:04 +08004Subject: [PATCH 3009/3011] mt76: mt7915: find rx token by physical address
developer6abc5082022-09-27 17:39:17 +08005
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: Peter Chiu <chui-hao.chiu@mediatek.com>
developer887da632022-10-28 09:35:38 +080010Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
developer6abc5082022-09-27 17:39:17 +080011---
12 dma.c | 19 ++++++++++++++++++-
13 1 file changed, 18 insertions(+), 1 deletion(-)
14
15diff --git a/dma.c b/dma.c
developer356ecec2022-11-14 10:25:04 +080016index d63b02f5..a7a4538a 100644
developer6abc5082022-09-27 17:39:17 +080017--- a/dma.c
18+++ b/dma.c
19@@ -380,11 +380,28 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
developerc226de82022-10-03 12:24:57 +080020
developer6abc5082022-09-27 17:39:17 +080021 type = FIELD_GET(MT_QFLAG_WED_TYPE, q->flags);
22 if (mtk_wed_device_active(wed) && type == MT76_WED_Q_RX) {
23- u32 token;
24+ u32 token, id, find = 0;
25 struct mt76_txwi_cache *r;
developerc226de82022-10-03 12:24:57 +080026
developer6abc5082022-09-27 17:39:17 +080027 token = FIELD_GET(MT_DMA_CTL_TOKEN, desc->buf1);
developerc226de82022-10-03 12:24:57 +080028
developer6abc5082022-09-27 17:39:17 +080029+ if (*more) {
30+ spin_lock_bh(&dev->rx_token_lock);
31+
32+ idr_for_each_entry(&dev->rx_token, r, id) {
33+ if (r->dma_addr == le32_to_cpu(desc->buf0)) {
34+ find = 1;
35+ desc->buf1 = FIELD_PREP(MT_DMA_CTL_TOKEN, id);
36+ token = id;
37+ break;
38+ }
39+ }
40+
41+ spin_unlock_bh(&dev->rx_token_lock);
42+ if (!find)
43+ return NULL;
44+
45+ }
46 r = mt76_rx_token_release(dev, token);
47 if (!r)
48 return NULL;
developerc226de82022-10-03 12:24:57 +080049--
developer887da632022-10-28 09:35:38 +0800502.18.0
developer6abc5082022-09-27 17:39:17 +080051