blob: 70230bc1f6f634d921e487001259adf9e3c3ebc6 [file] [log] [blame]
developer2b96a9e2023-08-09 10:28:15 +08001From 2423861357760af2716618d87d65a8d1dff7319c Mon Sep 17 00:00:00 2001
developer3d5faf22022-11-29 18:07:22 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Fri, 25 Nov 2022 14:32:35 +0800
developer2b96a9e2023-08-09 10:28:15 +08004Subject: [PATCH 2003/2010] wifi: mt76: mt7915: wed: find rx token by physical
developerbcc85ca2022-12-05 11:29:56 +08005 address
developer3d5faf22022-11-29 18:07:22 +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
developer780b9152022-12-15 14:09:45 +080010Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
developer3d5faf22022-11-29 18:07:22 +080011---
developerf8871e82023-03-08 17:22:32 +080012 dma.c | 25 ++++++++++++++++++++++++-
13 1 file changed, 24 insertions(+), 1 deletion(-)
developer3d5faf22022-11-29 18:07:22 +080014
15diff --git a/dma.c b/dma.c
developer2b96a9e2023-08-09 10:28:15 +080016index fc92e391..3047f8ba 100644
developer3d5faf22022-11-29 18:07:22 +080017--- a/dma.c
18+++ b/dma.c
developerf8871e82023-03-08 17:22:32 +080019@@ -403,9 +403,32 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
developer3d5faf22022-11-29 18:07:22 +080020
developerf3f5d9b2023-02-07 15:24:34 +080021 if (mt76_queue_is_wed_rx(q)) {
developerf8871e82023-03-08 17:22:32 +080022 u32 buf1 = le32_to_cpu(desc->buf1);
developer3d5faf22022-11-29 18:07:22 +080023+ u32 id, find = 0;
developerf8871e82023-03-08 17:22:32 +080024 u32 token = FIELD_GET(MT_DMA_CTL_TOKEN, buf1);
developer3d5faf22022-11-29 18:07:22 +080025- struct mt76_txwi_cache *t = mt76_rx_token_release(dev, token);
26+ struct mt76_txwi_cache *t;
developer21e74f62023-01-30 14:02:51 +080027+
developer3d5faf22022-11-29 18:07:22 +080028+ 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;
developer3d5faf22022-11-29 18:07:22 +080034+ token = id;
developerf3f5d9b2023-02-07 15:24:34 +080035+
36+ /* Write correct id back to DMA*/
developerf8871e82023-03-08 17:22:32 +080037+ u32p_replace_bits(&buf1, id,
38+ MT_DMA_CTL_TOKEN);
39+ WRITE_ONCE(desc->buf1, cpu_to_le32(buf1));
developer3d5faf22022-11-29 18:07:22 +080040+ break;
41+ }
42+ }
43+
44+ spin_unlock_bh(&dev->rx_token_lock);
45+ if (!find)
46+ return NULL;
47+ }
developer21e74f62023-01-30 14:02:51 +080048
developer3d5faf22022-11-29 18:07:22 +080049+ t = mt76_rx_token_release(dev, token);
50 if (!t)
51 return NULL;
52
53--
developer2b96a9e2023-08-09 10:28:15 +0800542.39.2
developer3d5faf22022-11-29 18:07:22 +080055