blob: 49870b22875ac4b15f96c3837cfe19dd30d9edf5 [file] [log] [blame]
developerc533e202023-10-26 21:18:10 +08001From 98e230f53b3e81ec9fc216054ebcf567c5e73406 Mon Sep 17 00:00:00 2001
2From: "sujuan.chen" <sujuan.chen@mediatek.com>
3Date: Mon, 11 Sep 2023 17:57:32 +0800
4Subject: [PATCH 20/25] wifi: mt76: mt7915: wed: change wed token init size to
5 adapt wed version
6
7Signed-off-by: sujuan.chen <sujuan.chen@mediatek.com>
8---
9 mt7915/mac.c | 10 ++++++++--
10 mt7915/mcu.c | 7 +++++--
11 mt7915/mmio.c | 13 ++++++++-----
12 mt7915/mt7915.h | 4 +++-
13 tx.c | 26 ++++++++------------------
14 5 files changed, 32 insertions(+), 28 deletions(-)
15
16diff --git a/mt7915/mac.c b/mt7915/mac.c
17index 59cc1fd7..a473fc61 100644
18--- a/mt7915/mac.c
19+++ b/mt7915/mac.c
20@@ -932,7 +932,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
21 v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4);
22
23 for (cur_info = tx_info; count < total; cur_info++) {
24- u32 msdu, info;
25+ u32 msdu, info, max_token_size = MT7915_TOKEN_SIZE;
26 u8 i;
27
28 if (WARN_ON_ONCE((void *)cur_info >= end))
29@@ -988,6 +988,12 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
30 wcid->stats.tx_failed += tx_failed;
31 }
32
33+ if (mtk_wed_device_active(&mdev->mmio.wed))
34+ max_token_size = (is_mt7915(&dev->mt76) ?
35+ MT7915_WED_TOKEN_SIZE_V0 :
36+ MT7915_WED_TOKEN_SIZE) +
37+ MT7915_WED_SW_TOKEN_SIZE;
38+
39 if (v3 && (info & MT_TX_FREE_MPDU_HEADER_V3))
40 continue;
41
42@@ -1001,7 +1007,7 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len)
43 }
44
45 /* Todo: check if msdu is sw token */
46- if (msdu > MT7915_TOKEN_SIZE)
47+ if (msdu > max_token_size)
48 dev_err(mdev->dev, "Receive invalid token id(%d)\n",
49 msdu);
50
51diff --git a/mt7915/mcu.c b/mt7915/mcu.c
52index ebacfd27..b42f7be9 100644
53--- a/mt7915/mcu.c
54+++ b/mt7915/mcu.c
55@@ -2318,6 +2318,9 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev)
56 static int mt7915_red_set_watermark(struct mt7915_dev *dev)
57 {
58 #define RED_GLOBAL_TOKEN_WATERMARK 2
59+ u16 token_size = is_mt7915(&dev->mt76) ?
60+ MT7915_WED_TOKEN_SIZE_V0 :
61+ MT7915_WED_TOKEN_SIZE;
62 struct {
63 __le32 args[3];
64 u8 cmd;
65@@ -2331,8 +2334,8 @@ static int mt7915_red_set_watermark(struct mt7915_dev *dev)
66 .args[0] = cpu_to_le32(MCU_WA_PARAM_RED_SETTING),
67 .cmd = RED_GLOBAL_TOKEN_WATERMARK,
68 .len = cpu_to_le16(sizeof(req) - sizeof(req.args)),
69- .high_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256),
70- .low_mark = cpu_to_le16(MT7915_HW_TOKEN_SIZE - 256 - 1536),
71+ .high_mark = cpu_to_le16(token_size - 256),
72+ .low_mark = cpu_to_le16(token_size - 256 - 1536),
73 };
74
75 return mt76_mcu_send_msg(&dev->mt76, MCU_WA_PARAM_CMD(SET), &req,
76diff --git a/mt7915/mmio.c b/mt7915/mmio.c
77index aa5c5dd6..2ad7ba4a 100644
78--- a/mt7915/mmio.c
79+++ b/mt7915/mmio.c
80@@ -593,7 +593,7 @@ static int mt7915_mmio_wed_offload_enable(struct mtk_wed_device *wed)
81 dev = container_of(wed, struct mt7915_dev, mt76.mmio.wed);
82
83 spin_lock_bh(&dev->mt76.token_lock);
84- dev->mt76.token_size = wed->wlan.token_start;
85+ dev->mt76.token_size = MT7915_WED_SW_TOKEN_SIZE;
86 spin_unlock_bh(&dev->mt76.token_lock);
87
88 return !wait_event_timeout(dev->mt76.tx_wait,
89@@ -607,7 +607,7 @@ static void mt7915_mmio_wed_offload_disable(struct mtk_wed_device *wed)
90 dev = container_of(wed, struct mt7915_dev, mt76.mmio.wed);
91
92 spin_lock_bh(&dev->mt76.token_lock);
93- dev->mt76.token_size = wed->wlan.token_start;//MT7915_TOKEN_SIZE
94+ dev->mt76.token_size = MT7915_WED_SW_TOKEN_SIZE;
95 spin_unlock_bh(&dev->mt76.token_lock);
96 }
97
98@@ -837,11 +837,14 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
99 wed->wlan.wpdma_rx_glo = res->start + MT_WPDMA_GLO_CFG;
100 wed->wlan.wpdma_rx = res->start + MT_RXQ_WED_DATA_RING_BASE;
101 }
102- wed->wlan.nbuf = MT7915_HW_TOKEN_SIZE;
103+
104+ wed->wlan.nbuf = is_mt7915(&dev->mt76) ?
105+ MT7915_WED_TOKEN_SIZE_V0 :
106+ MT7915_WED_TOKEN_SIZE;
107 wed->wlan.tx_tbit[0] = is_mt7915(&dev->mt76) ? 4 : 30;
108 wed->wlan.tx_tbit[1] = is_mt7915(&dev->mt76) ? 5 : 31;
109 wed->wlan.txfree_tbit = is_mt798x(&dev->mt76) ? 2 : 1;
110- wed->wlan.token_start = MT7915_TOKEN_SIZE - wed->wlan.nbuf;
111+ wed->wlan.token_start = 0;
112 wed->wlan.wcid_512 = !is_mt7915(&dev->mt76);
113
114 wed->wlan.rx_nbuf = 65536;
115@@ -874,7 +877,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
116
117 *irq = wed->irq;
118 dev->mt76.dma_dev = wed->dev;
119- dev->mt76.token_size = wed->wlan.token_start;
120+ dev->mt76.token_size = MT7915_WED_SW_TOKEN_SIZE;
121
122 ret = dma_set_mask(wed->dev, DMA_BIT_MASK(32));
123 if (ret)
124diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
125index 6156850b..6a175374 100644
126--- a/mt7915/mt7915.h
127+++ b/mt7915/mt7915.h
128@@ -62,7 +62,9 @@
129 #define MT7916_EEPROM_SIZE 4096
130
131 #define MT7915_EEPROM_BLOCK_SIZE 16
132-#define MT7915_HW_TOKEN_SIZE 7168
133+#define MT7915_WED_TOKEN_SIZE 8192
134+#define MT7915_WED_TOKEN_SIZE_V0 7168
135+#define MT7915_WED_SW_TOKEN_SIZE 1024
136 #define MT7915_TOKEN_SIZE 8192
137 #define MT7915_RX_TOKEN_SIZE 4096
138
139diff --git a/tx.c b/tx.c
140index e290aef3..96f9009b 100644
141--- a/tx.c
142+++ b/tx.c
143@@ -818,20 +818,18 @@ EXPORT_SYMBOL_GPL(__mt76_set_tx_blocked);
144
145 int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi)
146 {
147- int token;
148+ int token, start = 0;
149+
150+ if (mtk_wed_device_active(&dev->mmio.wed))
151+ start = dev->mmio.wed.wlan.nbuf;
152
153 spin_lock_bh(&dev->token_lock);
154
155- token = idr_alloc(&dev->token, *ptxwi, 0, dev->token_size, GFP_ATOMIC);
156- if (token >= 0)
157+ token = idr_alloc(&dev->token, *ptxwi, start, start + dev->token_size,
158+ GFP_ATOMIC);
159+ if (token >= start)
160 dev->token_count++;
161
162-#ifdef CONFIG_NET_MEDIATEK_SOC_WED
163- if (mtk_wed_device_active(&dev->mmio.wed) &&
164- token >= dev->mmio.wed.wlan.token_start)
165- dev->wed_token_count++;
166-#endif
167-
168 if (dev->token_count >= dev->token_size - MT76_TOKEN_FREE_THR)
169 __mt76_set_tx_blocked(dev, true);
170
171@@ -867,17 +865,9 @@ mt76_token_release(struct mt76_dev *dev, int token, bool *wake)
172 spin_lock_bh(&dev->token_lock);
173
174 txwi = idr_remove(&dev->token, token);
175- if (txwi) {
176+ if (txwi)
177 dev->token_count--;
178
179-#ifdef CONFIG_NET_MEDIATEK_SOC_WED
180- if (mtk_wed_device_active(&dev->mmio.wed) &&
181- token >= dev->mmio.wed.wlan.token_start &&
182- --dev->wed_token_count == 0)
183- wake_up(&dev->tx_wait);
184-#endif
185- }
186-
187 if (dev->token_count < dev->token_size - MT76_TOKEN_FREE_THR &&
188 dev->phy.q_tx[0]->blocked)
189 *wake = true;
190--
1912.18.0
192