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