blob: df34806b25fd2215e2bb10f6ceb758cbfee5600f [file] [log] [blame]
developerc1b2cd12022-07-28 18:35:24 +08001From f70e83ccdca85840c3bf9e7a31fb871a12724dc2 Mon Sep 17 00:00:00 2001
2From: Sujuan Chen <sujuan.chen@mediatek.com>
3Date: Thu, 28 Jul 2022 14:49:16 +0800
4Subject: [PATCH 3/3] add wed ser support
5
6Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
7---
developer2ed23d42022-08-09 16:20:46 +08008 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +-
developer553bdd92022-08-12 09:58:45 +08009 drivers/net/ethernet/mediatek/mtk_wed.c | 347 ++++++++++++++-----
developer2ed23d42022-08-09 16:20:46 +080010 drivers/net/ethernet/mediatek/mtk_wed.h | 2 +
developerc1b2cd12022-07-28 18:35:24 +080011 drivers/net/ethernet/mediatek/mtk_wed_regs.h | 12 +
developer2ed23d42022-08-09 16:20:46 +080012 include/linux/soc/mediatek/mtk_wed.h | 28 +-
developer553bdd92022-08-12 09:58:45 +080013 5 files changed, 297 insertions(+), 101 deletions(-)
developerc1b2cd12022-07-28 18:35:24 +080014
developer2ed23d42022-08-09 16:20:46 +080015diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
16index c582bb9..5259141 100644
17--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
18+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developerbc6b5852022-11-22 21:09:44 +080019@@ -3619,10 +3619,14 @@ static void mtk_pending_work(struct work_struct *work)
20 for (i = 0; i < MTK_MAC_COUNT; i++) {
21 if (!eth->netdev[i])
22 continue;
developer2ed23d42022-08-09 16:20:46 +080023+#ifdef CONFIG_NET_MEDIATEK_SOC_WED
developerbc6b5852022-11-22 21:09:44 +080024+ mtk_wed_fe_reset(MTK_FE_START_RESET);
developer2ed23d42022-08-09 16:20:46 +080025+#else
developerbc6b5852022-11-22 21:09:44 +080026 call_netdevice_notifiers(MTK_FE_START_RESET, eth->netdev[i]);
27 rtnl_unlock();
28 wait_for_completion_timeout(&wait_ser_done, 5000);
29 rtnl_lock();
developer2ed23d42022-08-09 16:20:46 +080030+#endif
developerbc6b5852022-11-22 21:09:44 +080031 break;
32 }
developer2ed23d42022-08-09 16:20:46 +080033
developerbc6b5852022-11-22 21:09:44 +080034@@ -3690,7 +3694,11 @@ static void mtk_pending_work(struct work_struct *work)
35 continue;
36 call_netdevice_notifiers(MTK_FE_RESET_NAT_DONE, eth->netdev[i]);
37 pr_info("[%s] HNAT reset done !\n", __func__);
developer2ed23d42022-08-09 16:20:46 +080038+#ifdef CONFIG_NET_MEDIATEK_SOC_WED
developerbc6b5852022-11-22 21:09:44 +080039+ mtk_wed_fe_reset(MTK_FE_RESET_DONE);
developer2ed23d42022-08-09 16:20:46 +080040+#else
developerbc6b5852022-11-22 21:09:44 +080041 call_netdevice_notifiers(MTK_FE_RESET_DONE, eth->netdev[i]);
developer2ed23d42022-08-09 16:20:46 +080042+#endif
developerbc6b5852022-11-22 21:09:44 +080043 pr_info("[%s] WiFi SER reset done !\n", __func__);
44 break;
45 }
developerc1b2cd12022-07-28 18:35:24 +080046diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
developer553bdd92022-08-12 09:58:45 +080047index 7552795..c98d749 100644
developerc1b2cd12022-07-28 18:35:24 +080048--- a/drivers/net/ethernet/mediatek/mtk_wed.c
49+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
developer2ed23d42022-08-09 16:20:46 +080050@@ -13,8 +13,10 @@
51 #include <linux/debugfs.h>
52 #include <linux/iopoll.h>
53 #include <linux/soc/mediatek/mtk_wed.h>
54+#include <net/rtnetlink.h>
55
56 #include "mtk_eth_soc.h"
57+#include "mtk_eth_reset.h"
58 #include "mtk_wed_regs.h"
59 #include "mtk_wed.h"
60 #include "mtk_ppe.h"
61@@ -71,23 +73,27 @@ mtk_wdma_read_reset(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +080062 return wdma_r32(dev, MTK_WDMA_GLO_CFG);
63 }
64
65-static void
66+static int
67 mtk_wdma_rx_reset(struct mtk_wed_device *dev)
68 {
69 u32 status;
70 u32 mask = MTK_WDMA_GLO_CFG_RX_DMA_BUSY;
71- int i;
72+ int busy, i;
73
74 wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_DMA_EN);
75- if (readx_poll_timeout(mtk_wdma_read_reset, dev, status,
76- !(status & mask), 0, 1000))
77- WARN_ON_ONCE(1);
78+ busy = readx_poll_timeout(mtk_wdma_read_reset, dev, status,
79+ !(status & mask), 0, 10000);
80+
81+ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
82+ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
83
84 for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
85 if (!dev->rx_wdma[i].desc) {
86 wdma_w32(dev, MTK_WDMA_RING_RX(i) +
87 MTK_WED_RING_OFS_CPU_IDX, 0);
88 }
89+
90+ return busy;
91 }
92
93 static void
developer2ed23d42022-08-09 16:20:46 +080094@@ -99,14 +105,14 @@ mtk_wdma_tx_reset(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +080095
96 wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN);
97 if (readx_poll_timeout(mtk_wdma_read_reset, dev, status,
98- !(status & mask), 0, 1000))
99+ !(status & mask), 0, 10000))
100 WARN_ON_ONCE(1);
101
102+ wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX);
103+ wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
104 for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
developer2ed23d42022-08-09 16:20:46 +0800105- if (!dev->tx_wdma[i].desc) {
developer553bdd92022-08-12 09:58:45 +0800106- wdma_w32(dev, MTK_WDMA_RING_TX(i) +
107- MTK_WED_RING_OFS_CPU_IDX, 0);
developer2ed23d42022-08-09 16:20:46 +0800108- }
developer553bdd92022-08-12 09:58:45 +0800109+ wdma_w32(dev, MTK_WDMA_RING_TX(i) +
110+ MTK_WED_RING_OFS_CPU_IDX, 0);
developer2ed23d42022-08-09 16:20:46 +0800111 }
112
113 static u32
developerc1b2cd12022-07-28 18:35:24 +0800114@@ -505,8 +511,8 @@ mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev, int idx)
115 wifi_w32(dev, dev->wlan.wpdma_rx_glo -
116 dev->wlan.phy_base, val);
117 } else {
118- dev_err(dev->hw->dev, "mtk_wed%d: rx dma enable failed!\n",
119- dev->hw->index);
120+ dev_err(dev->hw->dev, "mtk_wed%d: rx(%d) dma enable failed!\n",
121+ dev->hw->index, idx);
122 }
123 }
124
125@@ -557,7 +563,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
126 FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL,
127 0x2));
128
129- for (idx = 0; idx < MTK_WED_RX_QUEUES; idx++)
130+ for (idx = 0; idx < dev->hw->ring_num; idx++)
131 mtk_wed_check_wfdma_rx_fill(dev, idx);
132 }
133 }
134@@ -597,26 +603,31 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
135 }
136
137 static void
138-mtk_wed_stop(struct mtk_wed_device *dev)
139+mtk_wed_stop(struct mtk_wed_device *dev, bool reset)
140 {
141- mtk_wed_dma_disable(dev);
142- mtk_wed_set_512_support(dev, false);
143-
144 if (dev->ver > MTK_WED_V1) {
145 wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
146 wed_w32(dev, MTK_WED_EXT_INT_MASK2, 0);
147 }
148 mtk_wed_set_ext_int(dev, false);
149
150- wed_clr(dev, MTK_WED_CTRL,
151- MTK_WED_CTRL_WDMA_INT_AGENT_EN |
152- MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
153- MTK_WED_CTRL_WED_TX_BM_EN |
154- MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
155-
156- if (dev->ver > MTK_WED_V1) {
157+ if (!reset) {
158+ mtk_wed_dma_disable(dev);
159+ mtk_wed_set_512_support(dev, false);
160+ if (dev->ver > MTK_WED_V1) {
161+ wed_clr(dev, MTK_WED_CTRL,
162+ MTK_WED_CTRL_RX_RRO_QM_EN |
163+ MTK_WED_CTRL_RX_ROUTE_QM_EN |
164+ MTK_WED_CTRL_WED_RX_BM_EN);
165+ } else {
166+ regmap_write(dev->hw->mirror,
167+ dev->hw->index * 4, 0);
168+ }
169 wed_clr(dev, MTK_WED_CTRL,
170- MTK_WED_CTRL_WED_RX_BM_EN);
171+ MTK_WED_CTRL_WDMA_INT_AGENT_EN |
172+ MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
173+ MTK_WED_CTRL_WED_TX_BM_EN |
174+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
175 }
176
177 wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
178@@ -634,16 +645,13 @@ mtk_wed_detach(struct mtk_wed_device *dev)
179
180 mutex_lock(&hw_lock);
181
182- mtk_wed_stop(dev);
183+ mtk_wed_stop(dev, false);
184
185- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
186- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
187+ mtk_wdma_rx_reset(dev);
188
189 mtk_wed_reset(dev, MTK_WED_RESET_WED);
190
191- wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN);
192- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX);
193- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
194+ mtk_wdma_tx_reset(dev);
195
196 mtk_wed_free_buffer(dev);
197 mtk_wed_free_tx_rings(dev);
198@@ -653,8 +661,6 @@ mtk_wed_detach(struct mtk_wed_device *dev)
199 mtk_wed_wo_exit(hw);
200 }
201
202- mtk_wdma_rx_reset(dev);
203-
developer144824b2022-11-25 21:27:43 +0800204 if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
developerc1b2cd12022-07-28 18:35:24 +0800205 wlan_node = dev->wlan.pci_dev->dev.of_node;
206 if (of_dma_is_coherent(wlan_node))
207@@ -748,7 +754,7 @@ mtk_wed_hw_init_early(struct mtk_wed_device *dev)
208 {
209 u32 mask, set;
210
211- mtk_wed_stop(dev);
212+ mtk_wed_stop(dev, false);
213 mtk_wed_reset(dev, MTK_WED_RESET_WED);
214
215 if (dev->ver > MTK_WED_V1)
216@@ -961,44 +967,127 @@ mtk_wed_ring_reset(struct mtk_wdma_desc *desc, int size, int scale, bool tx)
217 }
218
219 static u32
220-mtk_wed_check_busy(struct mtk_wed_device *dev)
221+mtk_wed_check_busy(struct mtk_wed_device *dev, u32 reg, u32 mask)
222 {
223- if (wed_r32(dev, MTK_WED_GLO_CFG) & MTK_WED_GLO_CFG_TX_DMA_BUSY)
224- return true;
225-
226- if (wed_r32(dev, MTK_WED_WPDMA_GLO_CFG) &
227- MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY)
228- return true;
229-
230- if (wed_r32(dev, MTK_WED_CTRL) & MTK_WED_CTRL_WDMA_INT_AGENT_BUSY)
231- return true;
232-
233- if (wed_r32(dev, MTK_WED_WDMA_GLO_CFG) &
234- MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY)
235- return true;
236-
237- if (wdma_r32(dev, MTK_WDMA_GLO_CFG) &
238- MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY)
239- return true;
240-
241- if (wed_r32(dev, MTK_WED_CTRL) &
242- (MTK_WED_CTRL_WED_TX_BM_BUSY | MTK_WED_CTRL_WED_TX_FREE_AGENT_BUSY))
243+ if (wed_r32(dev, reg) & mask)
244 return true;
245
246 return false;
247 }
248
249 static int
250-mtk_wed_poll_busy(struct mtk_wed_device *dev)
251+mtk_wed_poll_busy(struct mtk_wed_device *dev, u32 reg, u32 mask)
252 {
253- int sleep = 15000;
254+ int sleep = 1000;
255 int timeout = 100 * sleep;
256 u32 val;
257
258 return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep,
259- timeout, false, dev);
260+ timeout, false, dev, reg, mask);
developer553bdd92022-08-12 09:58:45 +0800261+}
262+
developerc1b2cd12022-07-28 18:35:24 +0800263+static void
264+mtk_wed_rx_reset(struct mtk_wed_device *dev)
265+{
266+ struct mtk_wed_wo *wo = dev->hw->wed_wo;
267+ u8 state = WO_STATE_SER_RESET;
268+ bool busy = false;
269+ int i;
270+
developer144824b2022-11-25 21:27:43 +0800271+ mtk_wed_mcu_send_msg(wo, MODULE_ID_WO, MTK_WED_WO_CMD_CHANGE_STATE,
developerc1b2cd12022-07-28 18:35:24 +0800272+ &state, sizeof(state), true);
273+
274+ wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, MTK_WED_WPDMA_RX_D_RX_DRV_EN);
275+ busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
276+ MTK_WED_WPDMA_RX_D_RX_DRV_BUSY);
277+ if (busy) {
278+ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
279+ mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_D_DRV);
280+ } else {
281+ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
282+ MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
283+ MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
284+
285+ wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
286+ MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE |
287+ MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE);
288+ wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
289+ MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE |
290+ MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE);
291+
292+ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
293+ }
294+
295+ /* reset rro qm */
296+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_RRO_QM_EN);
297+ busy = mtk_wed_poll_busy(dev, MTK_WED_CTRL,
298+ MTK_WED_CTRL_RX_RRO_QM_BUSY);
299+ if (busy) {
300+ mtk_wed_reset(dev, MTK_WED_RESET_RX_RRO_QM);
301+ } else {
302+ wed_set(dev, MTK_WED_RROQM_RST_IDX,
303+ MTK_WED_RROQM_RST_IDX_MIOD |
304+ MTK_WED_RROQM_RST_IDX_FDBK);
305+ wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0);
306+ }
307+
308+ /* reset route qm */
309+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
310+ busy = mtk_wed_poll_busy(dev, MTK_WED_CTRL,
311+ MTK_WED_CTRL_RX_ROUTE_QM_BUSY);
312+ if (busy) {
313+ mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM);
314+ } else {
315+ wed_set(dev, MTK_WED_RTQM_GLO_CFG,
316+ MTK_WED_RTQM_Q_RST);
317+ }
318+
319+ /* reset tx wdma */
320+ mtk_wdma_tx_reset(dev);
321+
322+ /* reset tx wdma drv */
323+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_TX_DRV_EN);
324+ mtk_wed_poll_busy(dev, MTK_WED_CTRL,
325+ MTK_WED_CTRL_WDMA_INT_AGENT_BUSY);
326+ mtk_wed_reset(dev, MTK_WED_RESET_WDMA_TX_DRV);
327+
328+ /* reset wed rx dma */
329+ busy = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG,
330+ MTK_WED_GLO_CFG_RX_DMA_BUSY);
331+ wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_RX_DMA_EN);
332+ if (busy) {
333+ mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA);
334+ } else {
335+ wed_set(dev, MTK_WED_RESET_IDX,
336+ MTK_WED_RESET_IDX_RX);
337+ wed_w32(dev, MTK_WED_RESET_IDX, 0);
338+ }
339+
340+ /* reset rx bm */
341+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN);
342+ mtk_wed_poll_busy(dev, MTK_WED_CTRL,
343+ MTK_WED_CTRL_WED_RX_BM_BUSY);
344+ mtk_wed_reset(dev, MTK_WED_RESET_RX_BM);
345+
346+ /* wo change to enable state */
347+ state = WO_STATE_ENABLE;
developer144824b2022-11-25 21:27:43 +0800348+ mtk_wed_mcu_send_msg(wo, MODULE_ID_WO, MTK_WED_WO_CMD_CHANGE_STATE,
developerc1b2cd12022-07-28 18:35:24 +0800349+ &state, sizeof(state), true);
350+
351+ /* wed_rx_ring_reset */
352+ for (i = 0; i < ARRAY_SIZE(dev->rx_ring); i++) {
353+ struct mtk_wdma_desc *desc = dev->rx_ring[i].desc;
354+
355+ if (!desc)
356+ continue;
357+
358+ mtk_wed_ring_reset(desc, MTK_WED_RX_RING_SIZE, 1, false);
359+ }
360+
361+ mtk_wed_free_rx_bm(dev);
developer553bdd92022-08-12 09:58:45 +0800362 }
363
developerc1b2cd12022-07-28 18:35:24 +0800364+
365 static void
366 mtk_wed_reset_dma(struct mtk_wed_device *dev)
367 {
368@@ -1012,25 +1101,28 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
369 if (!desc)
370 continue;
371
372- mtk_wed_ring_reset(desc, MTK_WED_TX_RING_SIZE, dev->ver, true);
373+ mtk_wed_ring_reset(desc, MTK_WED_TX_RING_SIZE, 1, true);
374 }
375
376- if (mtk_wed_poll_busy(dev))
377- busy = mtk_wed_check_busy(dev);
378+ /* 1.Reset WED Tx DMA */
379+ wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_TX_DMA_EN);
380+ busy = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_TX_DMA_BUSY);
381
382 if (busy) {
383 mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA);
384 } else {
385 wed_w32(dev, MTK_WED_RESET_IDX,
386- MTK_WED_RESET_IDX_TX |
387- MTK_WED_RESET_IDX_RX);
388+ MTK_WED_RESET_IDX_TX);
389 wed_w32(dev, MTK_WED_RESET_IDX, 0);
390 }
391
392- wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
393- wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
394+ /* 2. Reset WDMA Rx DMA/Driver_Engine */
395+ busy = !!mtk_wdma_rx_reset(dev);
396
397- mtk_wdma_rx_reset(dev);
398+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
399+ busy = !!(busy ||
400+ mtk_wed_poll_busy(dev, MTK_WED_WDMA_GLO_CFG,
401+ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY));
402
403 if (busy) {
404 mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
405@@ -1047,15 +1139,30 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
406 MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
407 }
408
409+ /* 3. Reset WED WPDMA Tx Driver Engine */
410+ wed_clr(dev, MTK_WED_CTRL,
411+ MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
412+
413 for (i = 0; i < 100; i++) {
414 val = wed_r32(dev, MTK_WED_TX_BM_INTF);
415 if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40)
416 break;
417 }
418-
419 mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT);
420+
421+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_BM_EN);
422 mtk_wed_reset(dev, MTK_WED_RESET_TX_BM);
423
424+ /* 4. Reset WED WPDMA Tx Driver Engine */
425+ busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
426+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY);
427+ wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
428+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
429+ MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
430+
431+ busy = !!(busy ||
432+ mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
433+ MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY));
434 if (busy) {
435 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
436 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
437@@ -1065,6 +1172,16 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
438 MTK_WED_WPDMA_RESET_IDX_TX |
439 MTK_WED_WPDMA_RESET_IDX_RX);
440 wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
441+ if (dev->ver > MTK_WED_V1) {
442+ wed_w32(dev, MTK_WED_RESET_IDX,
443+ MTK_WED_RESET_WPDMA_IDX_RX);
444+ wed_w32(dev, MTK_WED_RESET_IDX, 0);
445+ }
446+ }
447+
448+ if (dev->ver > MTK_WED_V1) {
449+ dev->init_done = false;
450+ mtk_wed_rx_reset(dev);
451 }
452
developer2ed23d42022-08-09 16:20:46 +0800453 }
454@@ -1101,13 +1218,15 @@ mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
455 }
456
457 static int
458-mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
459+mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev,
460+ int idx, int size, bool reset)
461 {
462 struct mtk_wed_ring *wdma = &dev->tx_wdma[idx];
463
464- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
465- dev->ver, true))
466- return -ENOMEM;
467+ if(!reset)
468+ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
469+ dev->ver, true))
470+ return -ENOMEM;
471
472 wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
473 wdma->desc_phys);
474@@ -1124,13 +1243,15 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
developerc1b2cd12022-07-28 18:35:24 +0800475 }
developer2ed23d42022-08-09 16:20:46 +0800476
477 static int
478-mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
479+mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev,
480+ int idx, int size, bool reset)
481 {
482 struct mtk_wed_ring *wdma = &dev->rx_wdma[idx];
483
484- if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
485- dev->ver, true))
486- return -ENOMEM;
487+ if (!reset)
488+ if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
489+ dev->ver, true))
490+ return -ENOMEM;
491
492 wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
493 wdma->desc_phys);
494@@ -1140,7 +1261,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
495 MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
496 wdma_w32(dev,
497 MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
498-
499+ if (reset)
500+ mtk_wed_ring_reset(wdma->desc, MTK_WED_WDMA_RING_SIZE,
501+ dev->ver, true);
502 if (idx == 0) {
503 wed_w32(dev, MTK_WED_WDMA_RING_TX
504 + MTK_WED_RING_OFS_BASE, wdma->desc_phys);
505@@ -1253,9 +1376,12 @@ mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
developerc1b2cd12022-07-28 18:35:24 +0800506 {
507 int i, ret;
508
509+ if (dev->ver > MTK_WED_V1)
510+ ret = mtk_wed_rx_bm_alloc(dev);
511+
512 for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
513 if (!dev->tx_wdma[i].desc)
developer2ed23d42022-08-09 16:20:46 +0800514- mtk_wed_wdma_rx_ring_setup(dev, i, 16);
515+ mtk_wed_wdma_rx_ring_setup(dev, i, 16, false);
516
517 mtk_wed_hw_init(dev);
518
519@@ -1340,10 +1466,6 @@ mtk_wed_attach(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +0800520 goto error;
521
522 if (dev->ver > MTK_WED_V1) {
523- ret = mtk_wed_rx_bm_alloc(dev);
524- if (ret)
525- goto error;
526-
527 ret = mtk_wed_rro_alloc(dev);
528 if (ret)
529 goto error;
developer2ed23d42022-08-09 16:20:46 +0800530@@ -1351,6 +1473,10 @@ mtk_wed_attach(struct mtk_wed_device *dev)
531
532 mtk_wed_hw_init_early(dev);
533
534+ init_completion(&dev->fe_reset_done);
535+ init_completion(&dev->wlan_reset_done);
536+ atomic_set(&dev->fe_reset, 0);
537+
538 if (dev->ver == MTK_WED_V1)
539 regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
540 BIT(hw->index), 0);
541@@ -1367,7 +1493,8 @@ out:
developerc1b2cd12022-07-28 18:35:24 +0800542 }
543
544 static int
545-mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
546+mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx,
547+ void __iomem *regs, bool reset)
548 {
549 struct mtk_wed_ring *ring = &dev->tx_ring[idx];
550
developer2ed23d42022-08-09 16:20:46 +0800551@@ -1385,10 +1512,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
developerc1b2cd12022-07-28 18:35:24 +0800552
553 BUG_ON(idx > ARRAY_SIZE(dev->tx_ring));
554
555- if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE, 1, true))
556- return -ENOMEM;
developer2ed23d42022-08-09 16:20:46 +0800557+ if (!reset)
developerc1b2cd12022-07-28 18:35:24 +0800558+ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE,
559+ 1, true))
560+ return -ENOMEM;
561
developer2ed23d42022-08-09 16:20:46 +0800562- if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE))
563+ if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, reset))
564 return -ENOMEM;
developerc1b2cd12022-07-28 18:35:24 +0800565
developer2ed23d42022-08-09 16:20:46 +0800566 ring->reg_base = MTK_WED_RING_TX(idx);
567@@ -1436,21 +1565,24 @@ mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
developerc1b2cd12022-07-28 18:35:24 +0800568 }
569
570 static int
571-mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
572+mtk_wed_rx_ring_setup(struct mtk_wed_device *dev,
573+ int idx, void __iomem *regs, bool reset)
574 {
575 struct mtk_wed_ring *ring = &dev->rx_ring[idx];
576
577 BUG_ON(idx > ARRAY_SIZE(dev->rx_ring));
578
developer2ed23d42022-08-09 16:20:46 +0800579+ if (!reset)
developerc1b2cd12022-07-28 18:35:24 +0800580+ if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE,
581+ 1, false))
582+ return -ENOMEM;
583
584- if (mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE, 1, false))
585- return -ENOMEM;
586-
587- if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE))
developer2ed23d42022-08-09 16:20:46 +0800588+ if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE, reset))
589 return -ENOMEM;
590
developerc1b2cd12022-07-28 18:35:24 +0800591 ring->reg_base = MTK_WED_RING_RX_DATA(idx);
592 ring->wpdma = regs;
593+ dev->hw->ring_num = idx + 1;
594
595 /* WPDMA -> WED */
596 wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
developer2ed23d42022-08-09 16:20:46 +0800597@@ -1492,6 +1624,41 @@ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
598 wed_w32(dev, MTK_WED_INT_MASK, mask);
599 }
600
601+void mtk_wed_fe_reset(int cmd)
602+{
603+ int i;
604+
605+ for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
606+ struct mtk_wed_hw *hw = hw_list[i];
607+ struct mtk_wed_device *dev;
608+
609+ dev = hw->wed_dev ;
610+ if (!dev)
611+ continue;
612+
613+ switch (cmd) {
614+ case MTK_FE_START_RESET:
615+ pr_info("%s: receive fe reset start event, trigger SER\n", __func__);
616+ atomic_set(&dev->fe_reset, 1);
617+ dev->wlan.ser_trigger(dev);
618+ rtnl_unlock();
619+ wait_for_completion(&dev->wlan_reset_done);
620+ rtnl_lock();
621+
622+ break;
623+ case MTK_FE_RESET_DONE:
624+ pr_info("%s: receive fe reset done event, continue SER\n", __func__);
625+ complete(&dev->fe_reset_done);
626+ break;
627+ default:
628+ break;
629+ }
630+
631+ }
632+
633+ return;
634+}
635+
636 int mtk_wed_flow_add(int index)
637 {
638 struct mtk_wed_hw *hw = hw_list[index];
developerc1b2cd12022-07-28 18:35:24 +0800639diff --git a/drivers/net/ethernet/mediatek/mtk_wed.h b/drivers/net/ethernet/mediatek/mtk_wed.h
developer2ed23d42022-08-09 16:20:46 +0800640index 8ef5253..f757eac 100644
developerc1b2cd12022-07-28 18:35:24 +0800641--- a/drivers/net/ethernet/mediatek/mtk_wed.h
642+++ b/drivers/net/ethernet/mediatek/mtk_wed.h
643@@ -47,6 +47,7 @@ struct mtk_wed_hw {
644 u32 num_flows;
645 u32 wdma_phy;
646 char dirname[5];
647+ int ring_num;
648 int irq;
649 int index;
650 u32 ver;
developer2ed23d42022-08-09 16:20:46 +0800651@@ -196,5 +197,6 @@ void mtk_wed_mcu_rx_event(struct mtk_wed_wo *wo, struct sk_buff *skb);
652 int mtk_wed_mcu_send_msg(struct mtk_wed_wo *wo,int to_id, int cmd,
653 const void *data, int len, bool wait_resp);
654 int mtk_wed_wo_rx_poll(struct napi_struct *napi, int budget);
655+void mtk_wed_fe_reset(int cmd);
656
657 #endif
developerc1b2cd12022-07-28 18:35:24 +0800658diff --git a/drivers/net/ethernet/mediatek/mtk_wed_regs.h b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
659index 9d021e2..cfcd94f 100644
660--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
661+++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
662@@ -38,11 +38,15 @@ struct mtk_wdma_desc {
663
664 #define MTK_WED_RESET 0x008
665 #define MTK_WED_RESET_TX_BM BIT(0)
666+#define MTK_WED_RESET_RX_BM BIT(1)
667 #define MTK_WED_RESET_TX_FREE_AGENT BIT(4)
668 #define MTK_WED_RESET_WPDMA_TX_DRV BIT(8)
669 #define MTK_WED_RESET_WPDMA_RX_DRV BIT(9)
670+#define MTK_WED_RESET_WPDMA_RX_D_DRV BIT(10)
671 #define MTK_WED_RESET_WPDMA_INT_AGENT BIT(11)
672 #define MTK_WED_RESET_WED_TX_DMA BIT(12)
673+#define MTK_WED_RESET_WED_RX_DMA BIT(13)
674+#define MTK_WED_RESET_WDMA_TX_DRV BIT(16)
675 #define MTK_WED_RESET_WDMA_RX_DRV BIT(17)
676 #define MTK_WED_RESET_WDMA_INT_AGENT BIT(19)
677 #define MTK_WED_RESET_RX_RRO_QM BIT(20)
678@@ -186,7 +190,12 @@ struct mtk_wdma_desc {
679
680 #define MTK_WED_RESET_IDX 0x20c
681 #define MTK_WED_RESET_IDX_TX GENMASK(3, 0)
682+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
683+#define MTK_WED_RESET_IDX_RX GENMASK(7, 6)
684+#else
685 #define MTK_WED_RESET_IDX_RX GENMASK(17, 16)
686+#endif
687+#define MTK_WED_RESET_WPDMA_IDX_RX GENMASK(31, 30)
688
689 #define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4)
690 #define MTK_WED_RX_MIB(_n) (0x2e0 + (_n) * 4)
691@@ -300,6 +309,9 @@ struct mtk_wdma_desc {
692
693 #define MTK_WED_WPDMA_RX_D_GLO_CFG 0x75c
694 #define MTK_WED_WPDMA_RX_D_RX_DRV_EN BIT(0)
695+#define MTK_WED_WPDMA_RX_D_RX_DRV_BUSY BIT(1)
696+#define MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE BIT(3)
697+#define MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE BIT(4)
698 #define MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL GENMASK(11, 7)
699 #define MTK_WED_WPDMA_RX_D_RXD_READ_LEN GENMASK(31, 24)
700
701diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
developer2ed23d42022-08-09 16:20:46 +0800702index 9a9cc1b..31f4a26 100644
developerc1b2cd12022-07-28 18:35:24 +0800703--- a/include/linux/soc/mediatek/mtk_wed.h
704+++ b/include/linux/soc/mediatek/mtk_wed.h
developer144824b2022-11-25 21:27:43 +0800705@@ -161,23 +161,27 @@ struct mtk_wed_device {
developer2ed23d42022-08-09 16:20:46 +0800706 void (*release_rx_buf)(struct mtk_wed_device *wed);
developer144824b2022-11-25 21:27:43 +0800707 void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
708 struct mtk_wed_wo_rx_stats *stats);
developer2ed23d42022-08-09 16:20:46 +0800709+ void (*ser_trigger)(struct mtk_wed_device *wed);
710 } wlan;
711+ struct completion fe_reset_done;
712+ struct completion wlan_reset_done;
713+ atomic_t fe_reset;
714 #endif
715 };
716
developerc1b2cd12022-07-28 18:35:24 +0800717 struct mtk_wed_ops {
718 int (*attach)(struct mtk_wed_device *dev);
719 int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring,
720- void __iomem *regs);
721+ void __iomem *regs, bool reset);
722 int (*txfree_ring_setup)(struct mtk_wed_device *dev,
723 void __iomem *regs);
724 int (*rx_ring_setup)(struct mtk_wed_device *dev, int ring,
725- void __iomem *regs);
726+ void __iomem *regs, bool reset);
727 int (*msg_update)(struct mtk_wed_device *dev, int cmd_id,
728 void *data, int len);
729 void (*detach)(struct mtk_wed_device *dev);
730
731- void (*stop)(struct mtk_wed_device *dev);
732+ void (*stop)(struct mtk_wed_device *dev, bool reset);
733 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
734 void (*reset_dma)(struct mtk_wed_device *dev);
735
developer144824b2022-11-25 21:27:43 +0800736@@ -226,12 +230,13 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +0800737 #define mtk_wed_device_active(_dev) !!(_dev)->ops
738 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
739 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
740-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \
741- (_dev)->ops->tx_ring_setup(_dev, _ring, _regs)
742+#define mtk_wed_device_stop(_dev, _reset) (_dev)->ops->stop(_dev, _reset)
743+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) \
744+ (_dev)->ops->tx_ring_setup(_dev, _ring, _regs, _reset)
745 #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \
746 (_dev)->ops->txfree_ring_setup(_dev, _regs)
747-#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) \
748- (_dev)->ops->rx_ring_setup(_dev, _ring, _regs)
749+#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) \
750+ (_dev)->ops->rx_ring_setup(_dev, _ring, _regs, _reset)
751 #define mtk_wed_device_update_msg(_dev, _id, _msg, _len) \
752 (_dev)->ops->msg_update(_dev, _id, _msg, _len)
753 #define mtk_wed_device_reg_read(_dev, _reg) \
developer144824b2022-11-25 21:27:43 +0800754@@ -242,6 +247,8 @@ mtk_wed_get_rx_capa(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +0800755 (_dev)->ops->irq_get(_dev, _mask)
756 #define mtk_wed_device_irq_set_mask(_dev, _mask) \
757 (_dev)->ops->irq_set_mask(_dev, _mask)
758+#define mtk_wed_device_dma_reset(_dev) \
759+ (_dev)->ops->reset_dma(_dev)
760 #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \
761 (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash)
762 #else
developer144824b2022-11-25 21:27:43 +0800763@@ -251,14 +258,15 @@ static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
developerc1b2cd12022-07-28 18:35:24 +0800764 }
765 #define mtk_wed_device_detach(_dev) do {} while (0)
766 #define mtk_wed_device_start(_dev, _mask) do {} while (0)
767-#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV
768+#define mtk_wed_device_stop(_dev, _reset) do {} while (0)
769+#define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV
770 #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV
771-#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs) -ENODEV
772-#define mtk_wed_device_update_msg(_dev, _id, _msg, _len) -ENODEV
773+#define mtk_wed_device_rx_ring_setup(_dev, _ring, _regs, _reset) -ENODEV
774 #define mtk_wed_device_reg_read(_dev, _reg) 0
775 #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0)
776 #define mtk_wed_device_irq_get(_dev, _mask) 0
777 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
778+#define mtk_wed_device_dma_reset(_dev) do {} while (0)
779 #define mtk_wed_device_ppe_check(_dev, _hash) do {} while (0)
780 #endif
781
782--
7832.18.0
784