blob: 328a4bcbe4b078e3699a567097ff66d93d42d83e [file] [log] [blame]
developerfce0d152024-01-11 13:37:13 +08001From f0b9f017b170690be346d3e08371fdadca0d59d3 Mon Sep 17 00:00:00 2001
developerbd1b38a2023-06-19 11:13:22 +08002From: mtk27745 <rex.lu@mediatek.com>
developer740bee82023-10-16 10:58:43 +08003Date: Mon, 18 Sep 2023 13:22:44 +0800
developerfce0d152024-01-11 13:37:13 +08004Subject: [PATCH] mtk wed add wed3 ser support
developerbd1b38a2023-06-19 11:13:22 +08005
6---
developerfce0d152024-01-11 13:37:13 +08007 drivers/net/ethernet/mediatek/mtk_wed.c | 260 +++++++++++++++++--
developerbd1b38a2023-06-19 11:13:22 +08008 drivers/net/ethernet/mediatek/mtk_wed_regs.h | 73 +++++-
9 include/linux/soc/mediatek/mtk_wed.h | 6 +-
developerfce0d152024-01-11 13:37:13 +080010 3 files changed, 310 insertions(+), 29 deletions(-)
developerbd1b38a2023-06-19 11:13:22 +080011
12diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
developerfce0d152024-01-11 13:37:13 +080013index 561fc6c..f20a4ae 100644
developerbd1b38a2023-06-19 11:13:22 +080014--- a/drivers/net/ethernet/mediatek/mtk_wed.c
15+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
developerfce0d152024-01-11 13:37:13 +080016@@ -99,16 +99,70 @@ mtk_wdma_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +080017 u32 status;
18 u32 mask = MTK_WDMA_GLO_CFG_RX_DMA_BUSY;
19 int busy, i;
20+ u32 value;
21
22 wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_DMA_EN);
23 busy = readx_poll_timeout(mtk_wdma_read_reset, dev, status,
24- !(status & mask), 0, 10000);
25+ !(status & mask), 0, 10000);
26
27+ if (dev->hw->version == 3) {
28+ wdma_clr(dev, MTK_WDMA_PREF_TX_CFG, MTK_WDMA_PREF_TX_CFG_PREF_EN);
29+ wdma_clr(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
30+ busy = read_poll_timeout(wdma_r32, status,
31+ !(status & MTK_WDMA_PREF_TX_CFG_PREF_BUSY), 0, 10000,
32+ false, dev, MTK_WDMA_PREF_TX_CFG);
33+ busy = read_poll_timeout(wdma_r32, status,
34+ !(status & MTK_WDMA_PREF_RX_CFG_PREF_BUSY), 0, 10000,
35+ false, dev, MTK_WDMA_PREF_RX_CFG);
36+
37+ wdma_clr(dev, MTK_WDMA_WRBK_TX_CFG, MTK_WDMA_WRBK_TX_CFG_WRBK_EN);
38+ wdma_clr(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
39+ busy = read_poll_timeout(wdma_r32, status,
40+ !(status & MTK_WDMA_WRBK_TX_CFG_WRBK_BUSY), 0, 10000,
41+ false, dev, MTK_WDMA_WRBK_TX_CFG);
42+ busy = read_poll_timeout(wdma_r32, status,
43+ !(status & MTK_WDMA_WRBK_RX_CFG_WRBK_BUSY), 0, 10000,
44+ false, dev, MTK_WDMA_WRBK_RX_CFG);
45+
46+ /* Prefetch FIFO */
47+ wdma_w32(dev, MTK_WDMA_PREF_RX_FIFO_CFG,
48+ MTK_WDMA_PREF_RX_FIFO_CFG_RING0_CLEAR |
49+ MTK_WDMA_PREF_RX_FIFO_CFG_RING1_CLEAR);
50+ wdma_clr(dev, MTK_WDMA_PREF_RX_FIFO_CFG,
51+ MTK_WDMA_PREF_RX_FIFO_CFG_RING0_CLEAR |
52+ MTK_WDMA_PREF_RX_FIFO_CFG_RING1_CLEAR);
53+
54+ /* Core FIFO */
55+ value = (MTK_WDMA_XDMA_RX_FIFO_CFG_RX_PAR_FIFO_CLEAR |
56+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_CMD_FIFO_CLEAR |
57+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_DMAD_FIFO_CLEAR |
58+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_ARR_FIFO_CLEAR |
59+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_LEN_FIFO_CLEAR |
60+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_WID_FIFO_CLEAR |
61+ MTK_WDMA_XDMA_RX_FIFO_CFG_RX_BID_FIFO_CLEAR);
62+
63+ wdma_w32(dev, MTK_WDMA_XDMA_RX_FIFO_CFG, value);
64+ wdma_clr(dev, MTK_WDMA_XDMA_RX_FIFO_CFG, value);
65+
66+ /* Writeback FIFO */
67+ wdma_w32(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(0), MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
68+ wdma_w32(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(1), MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
69+
70+ wdma_clr(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(0), MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
71+ wdma_clr(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(1), MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
72+
73+ /* Prefetch ring status */
74+ wdma_w32(dev, MTK_WDMA_PREF_SIDX_CFG, MTK_WDMA_PREF_SIDX_CFG_RX_RING_CLEAR);
75+ wdma_clr(dev, MTK_WDMA_PREF_SIDX_CFG, MTK_WDMA_PREF_SIDX_CFG_RX_RING_CLEAR);
76+ /* Writeback ring status */
77+ wdma_w32(dev, MTK_WDMA_WRBK_SIDX_CFG, MTK_WDMA_WRBK_SIDX_CFG_RX_RING_CLEAR);
78+ wdma_clr(dev, MTK_WDMA_WRBK_SIDX_CFG, MTK_WDMA_WRBK_SIDX_CFG_RX_RING_CLEAR);
79+ }
80 wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
81 wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
82
developerfce0d152024-01-11 13:37:13 +080083- for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
84- if (!dev->rx_wdma[i].desc) {
85+ for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
86+ if (!dev->tx_wdma[i].desc) {
87 wdma_w32(dev, MTK_WDMA_RING_RX(i) +
88 MTK_WED_RING_OFS_CPU_IDX, 0);
89 }
90@@ -121,16 +175,65 @@ mtk_wdma_tx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +080091 {
92 u32 status;
93 u32 mask = MTK_WDMA_GLO_CFG_TX_DMA_BUSY;
94- int i;
95+ int busy, i;
96+ u32 value;
97
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, 10000))
101 WARN_ON_ONCE(1);
102
103+ if (dev->hw->version == 3) {
104+ wdma_clr(dev, MTK_WDMA_PREF_TX_CFG, MTK_WDMA_PREF_TX_CFG_PREF_EN);
105+ wdma_clr(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
106+ busy = read_poll_timeout(wdma_r32, status,
107+ !(status & MTK_WDMA_PREF_TX_CFG_PREF_BUSY), 0, 10000,
108+ false, dev, MTK_WDMA_PREF_TX_CFG);
109+ busy = read_poll_timeout(wdma_r32, status,
110+ !(status & MTK_WDMA_PREF_RX_CFG_PREF_BUSY), 0, 10000,
111+ false, dev, MTK_WDMA_PREF_RX_CFG);
112+
113+ wdma_clr(dev, MTK_WDMA_WRBK_TX_CFG, MTK_WDMA_WRBK_TX_CFG_WRBK_EN);
114+ wdma_clr(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
115+ busy = read_poll_timeout(wdma_r32, status,
116+ !(status & MTK_WDMA_WRBK_TX_CFG_WRBK_BUSY), 0, 10000,
117+ false, dev, MTK_WDMA_WRBK_TX_CFG);
118+ busy = read_poll_timeout(wdma_r32, status,
119+ !(status & MTK_WDMA_WRBK_RX_CFG_WRBK_BUSY), 0, 10000,
120+ false, dev, MTK_WDMA_WRBK_RX_CFG);
121+
122+ /* Prefetch FIFO */
123+ wdma_w32(dev, MTK_WDMA_PREF_TX_FIFO_CFG,
124+ MTK_WDMA_PREF_TX_FIFO_CFG_RING0_CLEAR |
125+ MTK_WDMA_PREF_TX_FIFO_CFG_RING1_CLEAR);
126+ wdma_clr(dev, MTK_WDMA_PREF_TX_FIFO_CFG,
127+ MTK_WDMA_PREF_TX_FIFO_CFG_RING0_CLEAR |
128+ MTK_WDMA_PREF_TX_FIFO_CFG_RING1_CLEAR);
129+ /* Core FIFO */
130+ value = (MTK_WDMA_XDMA_TX_FIFO_CFG_TX_PAR_FIFO_CLEAR |
131+ MTK_WDMA_XDMA_TX_FIFO_CFG_TX_CMD_FIFO_CLEAR |
132+ MTK_WDMA_XDMA_TX_FIFO_CFG_TX_DMAD_FIFO_CLEAR |
133+ MTK_WDMA_XDMA_TX_FIFO_CFG_TX_ARR_FIFO_CLEAR);
134+
135+ wdma_w32(dev, MTK_WDMA_XDMA_TX_FIFO_CFG, value);
136+ wdma_clr(dev, MTK_WDMA_XDMA_TX_FIFO_CFG, value);
137+ /* Writeback FIFO */
138+ wdma_w32(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(0), MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
139+ wdma_w32(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(1), MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
140+
141+ wdma_clr(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(0), MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
142+ wdma_clr(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(1), MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
143+
144+ /* Prefetch ring status */
145+ wdma_w32(dev, MTK_WDMA_PREF_SIDX_CFG, MTK_WDMA_PREF_SIDX_CFG_TX_RING_CLEAR);
146+ wdma_clr(dev, MTK_WDMA_PREF_SIDX_CFG, MTK_WDMA_PREF_SIDX_CFG_TX_RING_CLEAR);
147+ /* Writeback ring status */
148+ wdma_w32(dev, MTK_WDMA_WRBK_SIDX_CFG, MTK_WDMA_WRBK_SIDX_CFG_TX_RING_CLEAR);
149+ wdma_clr(dev, MTK_WDMA_WRBK_SIDX_CFG, MTK_WDMA_WRBK_SIDX_CFG_TX_RING_CLEAR);
150+ }
151 wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX);
152 wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
developerfce0d152024-01-11 13:37:13 +0800153- for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
154+ for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
155 wdma_w32(dev, MTK_WDMA_RING_TX(i) +
156 MTK_WED_RING_OFS_CPU_IDX, 0);
157 }
158@@ -913,7 +1016,7 @@ mtk_wed_dma_enable(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800159 MTK_WED_WPDMA_GLO_CFG_RX_DRV_UNS_VER_FORCE_4);
160
161 wdma_set(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
162- //wdma_w32(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
163+ wdma_set(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
164 if (mtk_wed_get_rx_capa(dev)) {
165 wed_set(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
166 MTK_WED_WPDMA_RX_D_PREF_EN |
developerfce0d152024-01-11 13:37:13 +0800167@@ -1476,13 +1579,30 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800168 mtk_wed_mcu_send_msg(wo, MODULE_ID_WO, MTK_WED_WO_CMD_CHANGE_STATE,
169 &state, sizeof(state), true);
170
171+ if (dev->wlan.hwrro) {
172+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_IND_CMD_EN);
173+ mtk_wed_poll_busy(dev, MTK_WED_RRO_RX_HW_STS,
174+ MTK_WED_RX_IND_CMD_BUSY);
175+ mtk_wed_reset(dev, MTK_WED_RESET_RRO_RX_TO_PG);
176+ }
177 wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, MTK_WED_WPDMA_RX_D_RX_DRV_EN);
178 busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
179 MTK_WED_WPDMA_RX_D_RX_DRV_BUSY);
180+ if (dev->hw->version == 3)
181+ busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
182+ MTK_WED_WPDMA_RX_D_PREF_BUSY);
183 if (busy) {
184 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
185 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_D_DRV);
186 } else {
187+ if (dev->hw->version == 3) {
188+ /*1.a. Disable Prefetch HW*/
189+ wed_clr(dev, MTK_WED_WPDMA_RX_D_PREF_CFG, MTK_WED_WPDMA_RX_D_PREF_EN);
190+ mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
191+ MTK_WED_WPDMA_RX_D_PREF_BUSY);
192+ wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
193+ MTK_WED_WPDMA_RX_D_RST_DRV_IDX_ALL);
194+ }
195 wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
196 MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
197 MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
developerfce0d152024-01-11 13:37:13 +0800198@@ -1510,6 +1630,24 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800199 wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0);
200 }
201
202+ if (dev->wlan.hwrro) {
203+ /* Disable RRO MSDU Page Drv */
204+ wed_clr(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG, MTK_WED_RRO_MSDU_PG_DRV_EN);
205+
206+ /* Disable RRO Data Drv */
207+ wed_clr(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_RX_D_DRV_EN);
208+
209+ /* RRO MSDU Page Drv Reset */
210+ wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG, MTK_WED_RRO_MSDU_PG_DRV_CLR);
211+ mtk_wed_poll_busy(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
212+ MTK_WED_RRO_MSDU_PG_DRV_CLR);
213+
214+ /* RRO Data Drv Reset */
215+ wed_w32(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_RX_D_DRV_CLR);
216+ mtk_wed_poll_busy(dev, MTK_WED_RRO_RX_D_CFG(2),
217+ MTK_WED_RRO_RX_D_DRV_CLR);
218+ }
219+
220 /* reset route qm */
221 wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
222 busy = mtk_wed_poll_busy(dev, MTK_WED_CTRL,
developerfce0d152024-01-11 13:37:13 +0800223@@ -1517,8 +1655,13 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800224 if (busy) {
225 mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM);
226 } else {
227- wed_set(dev, MTK_WED_RTQM_GLO_CFG,
228- MTK_WED_RTQM_Q_RST);
229+ if (dev->hw->version == 3) {
230+ wed_set(dev, MTK_WED_RTQM_RST, BIT(0));
231+ wed_clr(dev, MTK_WED_RTQM_RST, BIT(0));
232+ mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM);
233+ } else
234+ wed_set(dev, MTK_WED_RTQM_GLO_CFG,
235+ MTK_WED_RTQM_Q_RST);
236 }
237
238 /* reset tx wdma */
developerfce0d152024-01-11 13:37:13 +0800239@@ -1526,8 +1669,13 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800240
241 /* reset tx wdma drv */
242 wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_TX_DRV_EN);
243- mtk_wed_poll_busy(dev, MTK_WED_CTRL,
244- MTK_WED_CTRL_WDMA_INT_AGENT_BUSY);
245+ if (dev->hw->version == 3)
246+ mtk_wed_poll_busy(dev, MTK_WED_WPDMA_STATUS,
247+ MTK_WED_WPDMA_STATUS_TX_DRV);
248+ else
249+ mtk_wed_poll_busy(dev, MTK_WED_CTRL,
250+ MTK_WED_CTRL_WDMA_INT_AGENT_BUSY);
251+
252 mtk_wed_reset(dev, MTK_WED_RESET_WDMA_TX_DRV);
253
254 /* reset wed rx dma */
developerfce0d152024-01-11 13:37:13 +0800255@@ -1545,9 +1693,17 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800256 /* reset rx bm */
257 wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN);
258 mtk_wed_poll_busy(dev, MTK_WED_CTRL,
259- MTK_WED_CTRL_WED_RX_BM_BUSY);
260+ MTK_WED_CTRL_WED_RX_BM_BUSY);
261 mtk_wed_reset(dev, MTK_WED_RESET_RX_BM);
262
263+ if (dev->wlan.hwrro) {
264+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_PG_BM_EN);
265+ mtk_wed_poll_busy(dev, MTK_WED_CTRL,
266+ MTK_WED_CTRL_WED_RX_PG_BM_BUSY);
267+ wed_set(dev, MTK_WED_RESET, MTK_WED_RESET_RX_PG_BM);
268+ wed_clr(dev, MTK_WED_RESET, MTK_WED_RESET_RX_PG_BM);
269+ }
270+
271 /* wo change to enable state */
272 state = WO_STATE_ENABLE;
273 mtk_wed_mcu_send_msg(wo, MODULE_ID_WO, MTK_WED_WO_CMD_CHANGE_STATE,
developerfce0d152024-01-11 13:37:13 +0800274@@ -1564,6 +1720,9 @@ mtk_wed_rx_reset(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800275 }
276
277 mtk_wed_free_rx_buffer(dev);
278+
279+ if (dev->wlan.hwrro)
280+ mtk_wed_rx_page_free_buffer(dev);
281 }
282
283
developerfce0d152024-01-11 13:37:13 +0800284@@ -1597,18 +1756,54 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800285
286 /* 2. Reset WDMA Rx DMA/Driver_Engine */
287 busy = !!mtk_wdma_rx_reset(dev);
288+ if (dev->hw->version == 3) {
289+ val = wed_r32(dev, MTK_WED_WDMA_GLO_CFG);
290+ val |= MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE;
291+ val &= ~MTK_WED_WDMA_GLO_CFG_RX_DRV_EN;
292+ wed_w32(dev, MTK_WED_WDMA_GLO_CFG, val);
293+ } else
294+ wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
295
296- wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
297 busy = !!(busy ||
298 mtk_wed_poll_busy(dev, MTK_WED_WDMA_GLO_CFG,
299- MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY));
300+ MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY));
301+ if (dev->hw->version == 3)
302+ busy = !!(busy ||
303+ mtk_wed_poll_busy(dev, MTK_WED_WDMA_RX_PREF_CFG,
304+ MTK_WED_WDMA_RX_PREF_BUSY));
305
306 if (busy) {
307 mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
308 mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV);
309 } else {
310+ if (dev->hw->version == 3) {
311+ /*1.a. Disable Prefetch HW*/
312+ wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG, MTK_WED_WDMA_RX_PREF_EN);
313+ mtk_wed_poll_busy(dev, MTK_WED_WDMA_RX_PREF_CFG,
314+ MTK_WED_WDMA_RX_PREF_BUSY);
315+ wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG, MTK_WED_WDMA_RX_PREF_DDONE2_EN);
316+
developerfce0d152024-01-11 13:37:13 +0800317+ /* reset prefetch index */
318+ wed_set(dev, MTK_WED_WDMA_RX_PREF_CFG,
319+ MTK_WED_WDMA_RX_PREF_RX0_SIDX_CLR |
320+ MTK_WED_WDMA_RX_PREF_RX1_SIDX_CLR);
321+
322+ wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG,
323+ MTK_WED_WDMA_RX_PREF_RX0_SIDX_CLR |
324+ MTK_WED_WDMA_RX_PREF_RX1_SIDX_CLR);
325+
326+ /* reset prefetch FIFO */
327+ wed_w32(dev, MTK_WED_WDMA_RX_PREF_FIFO_CFG,
328+ MTK_WED_WDMA_RX_PREF_FIFO_RX0_CLR |
329+ MTK_WED_WDMA_RX_PREF_FIFO_RX1_CLR);
330+ wed_w32(dev, MTK_WED_WDMA_RX_PREF_FIFO_CFG, 0);
developerbd1b38a2023-06-19 11:13:22 +0800331+ /*2. Reset dma index*/
332+ wed_w32(dev, MTK_WED_WDMA_RESET_IDX,
333+ MTK_WED_WDMA_RESET_IDX_RX_ALL);
334+ }
335 wed_w32(dev, MTK_WED_WDMA_RESET_IDX,
336- MTK_WED_WDMA_RESET_IDX_RX | MTK_WED_WDMA_RESET_IDX_DRV);
337+ MTK_WED_WDMA_RESET_IDX_RX |
338+ MTK_WED_WDMA_RESET_IDX_DRV);
339 wed_w32(dev, MTK_WED_WDMA_RESET_IDX, 0);
340
341 wed_set(dev, MTK_WED_WDMA_GLO_CFG,
developerfce0d152024-01-11 13:37:13 +0800342@@ -1623,9 +1818,15 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800343 MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
344
345 for (i = 0; i < 100; i++) {
346- val = wed_r32(dev, MTK_WED_TX_BM_INTF);
347- if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40)
348- break;
349+ if (dev->ver > MTK_WED_V1) {
350+ val = wed_r32(dev, MTK_WED_TX_TKID_INTF);
351+ if (FIELD_GET(MTK_WED_TX_TKID_INTF_TKFIFO_FDEP, val) == 0x40)
352+ break;
353+ } else {
354+ val = wed_r32(dev, MTK_WED_TX_BM_INTF);
355+ if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40)
356+ break;
357+ }
358 }
359 mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT);
360
developerfce0d152024-01-11 13:37:13 +0800361@@ -1634,18 +1835,20 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800362
363 /* 4. Reset WED WPDMA Tx Driver Engine */
364 busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
365- MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY);
366+ MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY);
367 wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
368 MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
369 MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
370
371 busy = !!(busy ||
372 mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
373- MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY));
374+ MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY));
375 if (busy) {
376 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
377 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
378 mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_DRV);
379+ if (dev->hw->version == 3)
380+ wed_w32(dev, MTK_WED_RX1_CTRL2, 0);
381 } else {
382 wed_w32(dev, MTK_WED_WPDMA_RESET_IDX,
383 MTK_WED_WPDMA_RESET_IDX_TX |
developerfce0d152024-01-11 13:37:13 +0800384@@ -1658,11 +1861,17 @@ mtk_wed_reset_dma(struct mtk_wed_device *dev)
developerbd1b38a2023-06-19 11:13:22 +0800385 }
386 }
387
388- if (dev->ver > MTK_WED_V1) {
developerfce0d152024-01-11 13:37:13 +0800389- dev->init_done = false;
390- mtk_wed_rx_reset(dev);
391+ dev->init_done = false;
392+
developerbd1b38a2023-06-19 11:13:22 +0800393+ if (dev->hw->version == 3) {
394+ /*reset wed pao*/
395+ wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_PAO_EN);
396+ mtk_wed_reset(dev, MTK_WED_RESET_TX_PAO);
developerbd1b38a2023-06-19 11:13:22 +0800397 }
developerfce0d152024-01-11 13:37:13 +0800398
399+ if (mtk_wed_get_rx_capa(dev))
400+ mtk_wed_rx_reset(dev);
401+
developerbd1b38a2023-06-19 11:13:22 +0800402 }
403
developerfce0d152024-01-11 13:37:13 +0800404 static int
405@@ -1875,7 +2084,7 @@ mtk_wed_ppe_check(struct mtk_wed_device *dev, struct sk_buff *skb,
406 }
407
developerbd1b38a2023-06-19 11:13:22 +0800408 static void
409-mtk_wed_start_hwrro(struct mtk_wed_device *dev, u32 irq_mask)
410+mtk_wed_start_hwrro(struct mtk_wed_device *dev, u32 irq_mask, bool reset)
411 {
412 int idx, ret;
413
developerfce0d152024-01-11 13:37:13 +0800414@@ -1885,6 +2094,11 @@ mtk_wed_start_hwrro(struct mtk_wed_device *dev, u32 irq_mask)
developerbd1b38a2023-06-19 11:13:22 +0800415 if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hwrro)
416 return;
417
418+ if (reset) {
419+ wed_set(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG, MTK_WED_RRO_MSDU_PG_DRV_EN);
420+ return;
421+ }
422+
423 wed_set(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_MSDU_PG_DRV_CLR);
424 wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG, MTK_WED_RRO_MSDU_PG_DRV_CLR);
425
426diff --git a/drivers/net/ethernet/mediatek/mtk_wed_regs.h b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
427index 25be547..4379dc4 100644
428--- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
429+++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
430@@ -42,6 +42,8 @@ struct mtk_wdma_desc {
431 #define MTK_WED_RESET 0x008
432 #define MTK_WED_RESET_TX_BM BIT(0)
433 #define MTK_WED_RESET_RX_BM BIT(1)
434+#define MTK_WED_RESET_RX_PG_BM BIT(2)
435+#define MTK_WED_RESET_RRO_RX_TO_PG BIT(3)
436 #define MTK_WED_RESET_TX_FREE_AGENT BIT(4)
437 #define MTK_WED_RESET_WPDMA_TX_DRV BIT(8)
438 #define MTK_WED_RESET_WPDMA_RX_DRV BIT(9)
439@@ -64,7 +66,7 @@ struct mtk_wdma_desc {
440 #define MTK_WED_CTRL_WDMA_INT_AGENT_BUSY BIT(3)
441 #define MTK_WED_CTRL_WED_RX_IND_CMD_EN BIT(5)
442 #define MTK_WED_CTRL_WED_RX_PG_BM_EN BIT(6)
443-#define MTK_WED_CTRL_WED_RX_PG_BM_BUSU BIT(7)
444+#define MTK_WED_CTRL_WED_RX_PG_BM_BUSY BIT(7)
445 #define MTK_WED_CTRL_WED_TX_BM_EN BIT(8)
446 #define MTK_WED_CTRL_WED_TX_BM_BUSY BIT(9)
447 #define MTK_WED_CTRL_WED_TX_FREE_AGENT_EN BIT(10)
448@@ -123,6 +125,10 @@ struct mtk_wdma_desc {
449 #define MTK_WED_STATUS 0x060
450 #define MTK_WED_STATUS_TX GENMASK(15, 8)
451
452+#define MTK_WED_WPDMA_STATUS 0x068
453+#define MTK_WED_WPDMA_STATUS_TX_DRV GENMASK(15, 8)
454+
455+
456 #define MTK_WED_TX_BM_CTRL 0x080
457 #define MTK_WED_TX_BM_CTRL_VLD_GRP_NUM GENMASK(6, 0)
458 #define MTK_WED_TX_BM_CTRL_RSV_GRP_NUM GENMASK(22, 16)
459@@ -167,6 +173,9 @@ struct mtk_wdma_desc {
460
461 #define MTK_WED_TX_TKID_CTRL_PAUSE BIT(28)
462
463+#define MTK_WED_TX_TKID_INTF 0x0dc
464+#define MTK_WED_TX_TKID_INTF_TKFIFO_FDEP GENMASK(25, 16)
465+
466 #define MTK_WED_TX_TKID_DYN_THR 0x0e0
467 #define MTK_WED_TX_TKID_DYN_THR_LO GENMASK(6, 0)
468 #define MTK_WED_TX_TKID_DYN_THR_HI GENMASK(22, 16)
469@@ -203,10 +212,11 @@ struct mtk_wdma_desc {
470 #define MTK_WED_GLO_CFG_RX_2B_OFFSET BIT(31)
471
472 #define MTK_WED_RESET_IDX 0x20c
473-#define MTK_WED_RESET_IDX_TX GENMASK(3, 0)
474-#if defined(CONFIG_MEDIATEK_NETSYS_V2)
475+#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
476+#define MTK_WED_RESET_IDX_TX GENMASK(1, 0)
477 #define MTK_WED_RESET_IDX_RX GENMASK(7, 6)
478 #else
479+#define MTK_WED_RESET_IDX_TX GENMASK(3, 0)
480 #define MTK_WED_RESET_IDX_RX GENMASK(17, 16)
481 #endif
482 #define MTK_WED_RESET_WPDMA_IDX_RX GENMASK(31, 30)
483@@ -221,6 +231,7 @@ struct mtk_wdma_desc {
484 #define MTK_WED_RING_RX_DATA(_n) (0x420 + (_n) * 0x10)
485
486 #define MTK_WED_SCR0 0x3c0
487+#define MTK_WED_RX1_CTRL2 0x418
488 #define MTK_WED_WPDMA_INT_TRIGGER 0x504
489 #define MTK_WED_WPDMA_INT_TRIGGER_RX_DONE BIT(1)
490 #define MTK_WED_WPDMA_INT_TRIGGER_TX_DONE GENMASK(5, 4)
491@@ -336,6 +347,7 @@ struct mtk_wdma_desc {
492
493 #define MTK_WED_WPDMA_RX_D_RST_IDX 0x760
494 #define MTK_WED_WPDMA_RX_D_RST_CRX_IDX GENMASK(17, 16)
495+#define MTK_WED_WPDMA_RX_D_RST_DRV_IDX_ALL BIT(20)
496 #define MTK_WED_WPDMA_RX_D_RST_DRV_IDX GENMASK(25, 24)
497
498 #define MTK_WED_WPDMA_RX_GLO_CFG 0x76c
499@@ -352,6 +364,7 @@ struct mtk_wdma_desc {
500
501 #define MTK_WED_WPDMA_RX_D_PREF_CFG 0x7b4
502 #define MTK_WED_WPDMA_RX_D_PREF_EN BIT(0)
503+#define MTK_WED_WPDMA_RX_D_PREF_BUSY BIT(1)
504 #define MTK_WED_WPDMA_RX_D_PREF_BURST_SIZE GENMASK(12, 8)
505 #define MTK_WED_WPDMA_RX_D_PREF_LOW_THRES GENMASK(21, 16)
506
507@@ -373,11 +386,13 @@ struct mtk_wdma_desc {
508
509 #define MTK_WED_WDMA_RX_PREF_CFG 0x950
510 #define MTK_WED_WDMA_RX_PREF_EN BIT(0)
511+#define MTK_WED_WDMA_RX_PREF_BUSY BIT(1)
512 #define MTK_WED_WDMA_RX_PREF_BURST_SIZE GENMASK(12, 8)
513 #define MTK_WED_WDMA_RX_PREF_LOW_THRES GENMASK(21, 16)
514 #define MTK_WED_WDMA_RX_PREF_RX0_SIDX_CLR BIT(24)
515 #define MTK_WED_WDMA_RX_PREF_RX1_SIDX_CLR BIT(25)
516 #define MTK_WED_WDMA_RX_PREF_DDONE2_EN BIT(26)
517+#define MTK_WED_WDMA_RX_PREF_DDONE2_BUSY BIT(27)
518
519 #define MTK_WED_WDMA_RX_PREF_FIFO_CFG 0x95C
520 #define MTK_WED_WDMA_RX_PREF_FIFO_RX0_CLR BIT(0)
521@@ -406,6 +421,7 @@ struct mtk_wdma_desc {
522
523 #define MTK_WED_WDMA_RESET_IDX 0xa08
524 #define MTK_WED_WDMA_RESET_IDX_RX GENMASK(17, 16)
525+#define MTK_WED_WDMA_RESET_IDX_RX_ALL BIT(20)
526 #define MTK_WED_WDMA_RESET_IDX_DRV GENMASK(25, 24)
527
528 #define MTK_WED_WDMA_INT_CLR 0xa24
529@@ -474,21 +490,66 @@ struct mtk_wdma_desc {
530 #define MTK_WDMA_INT_MASK_RX_DELAY BIT(30)
531 #define MTK_WDMA_INT_MASK_RX_COHERENT BIT(31)
532
533+#define MTK_WDMA_XDMA_TX_FIFO_CFG 0x238
534+#define MTK_WDMA_XDMA_TX_FIFO_CFG_TX_PAR_FIFO_CLEAR BIT(0)
535+#define MTK_WDMA_XDMA_TX_FIFO_CFG_TX_CMD_FIFO_CLEAR BIT(4)
536+#define MTK_WDMA_XDMA_TX_FIFO_CFG_TX_DMAD_FIFO_CLEAR BIT(8)
537+#define MTK_WDMA_XDMA_TX_FIFO_CFG_TX_ARR_FIFO_CLEAR BIT(12)
538+
539+#define MTK_WDMA_XDMA_RX_FIFO_CFG 0x23c
540+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_PAR_FIFO_CLEAR BIT(0)
541+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_CMD_FIFO_CLEAR BIT(4)
542+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_DMAD_FIFO_CLEAR BIT(8)
543+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_ARR_FIFO_CLEAR BIT(12)
544+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_LEN_FIFO_CLEAR BIT(15)
545+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_WID_FIFO_CLEAR BIT(18)
546+#define MTK_WDMA_XDMA_RX_FIFO_CFG_RX_BID_FIFO_CLEAR BIT(21)
547+
548+
549+
550 #define MTK_WDMA_INT_GRP1 0x250
551 #define MTK_WDMA_INT_GRP2 0x254
552
553 #define MTK_WDMA_PREF_TX_CFG 0x2d0
554 #define MTK_WDMA_PREF_TX_CFG_PREF_EN BIT(0)
555+#define MTK_WDMA_PREF_TX_CFG_PREF_BUSY BIT(1)
556
557 #define MTK_WDMA_PREF_RX_CFG 0x2dc
558 #define MTK_WDMA_PREF_RX_CFG_PREF_EN BIT(0)
559+#define MTK_WDMA_PREF_RX_CFG_PREF_BUSY BIT(1)
560+
561+#define MTK_WDMA_PREF_RX_FIFO_CFG 0x2e0
562+#define MTK_WDMA_PREF_RX_FIFO_CFG_RING0_CLEAR BIT(0)
563+#define MTK_WDMA_PREF_RX_FIFO_CFG_RING1_CLEAR BIT(16)
564+
565+#define MTK_WDMA_PREF_TX_FIFO_CFG 0x2d4
566+#define MTK_WDMA_PREF_TX_FIFO_CFG_RING0_CLEAR BIT(0)
567+#define MTK_WDMA_PREF_TX_FIFO_CFG_RING1_CLEAR BIT(16)
568+
569+#define MTK_WDMA_PREF_SIDX_CFG 0x2e4
570+#define MTK_WDMA_PREF_SIDX_CFG_TX_RING_CLEAR GENMASK(3, 0)
571+#define MTK_WDMA_PREF_SIDX_CFG_RX_RING_CLEAR GENMASK(5, 4)
572
573 #define MTK_WDMA_WRBK_TX_CFG 0x300
574+#define MTK_WDMA_WRBK_TX_CFG_WRBK_BUSY BIT(0)
575 #define MTK_WDMA_WRBK_TX_CFG_WRBK_EN BIT(30)
576
577+#define MTK_WDMA_WRBK_TX_FIFO_CFG(_n) (0x304 + (_n) * 0x4)
578+#define MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR BIT(0)
579+
580+
581 #define MTK_WDMA_WRBK_RX_CFG 0x344
582+#define MTK_WDMA_WRBK_RX_CFG_WRBK_BUSY BIT(0)
583 #define MTK_WDMA_WRBK_RX_CFG_WRBK_EN BIT(30)
584
585+#define MTK_WDMA_WRBK_RX_FIFO_CFG(_n) (0x348 + (_n) * 0x4)
586+#define MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR BIT(0)
587+
588+
589+#define MTK_WDMA_WRBK_SIDX_CFG 0x388
590+#define MTK_WDMA_WRBK_SIDX_CFG_TX_RING_CLEAR GENMASK(3, 0)
591+#define MTK_WDMA_WRBK_SIDX_CFG_RX_RING_CLEAR GENMASK(5, 4)
592+
593 #define MTK_PCIE_MIRROR_MAP(n) ((n) ? 0x4 : 0x0)
594 #define MTK_PCIE_MIRROR_MAP_EN BIT(0)
595 #define MTK_PCIE_MIRROR_MAP_WED_ID BIT(1)
596@@ -502,6 +563,9 @@ struct mtk_wdma_desc {
597 #define MTK_WED_RTQM_Q_DBG_BYPASS BIT(5)
598 #define MTK_WED_RTQM_TXDMAD_FPORT GENMASK(23, 20)
599
600+#define MTK_WED_RTQM_RST 0xb04
601+
602+
603 #define MTK_WED_RTQM_IGRS0_I2HW_DMAD_CNT 0xb1c
604 #define MTK_WED_RTQM_IGRS0_I2H_DMAD_CNT(_n) (0xb20 + (_n) * 0x4)
605 #define MTK_WED_RTQM_IGRS0_I2HW_PKT_CNT 0xb28
606@@ -691,6 +755,9 @@ struct mtk_wdma_desc {
607 #define MTK_WED_WPDMA_INT_CTRL_RRO_PG2_CLR BIT(17)
608 #define MTK_WED_WPDMA_INT_CTRL_RRO_PG2_DONE_TRIG GENMASK(22, 18)
609
610+#define MTK_WED_RRO_RX_HW_STS 0xf00
611+#define MTK_WED_RX_IND_CMD_BUSY GENMASK(31, 0)
612+
613 #define MTK_WED_RX_IND_CMD_CNT0 0xf20
614 #define MTK_WED_RX_IND_CMD_DBG_CNT_EN BIT(31)
615
616diff --git a/include/linux/soc/mediatek/mtk_wed.h b/include/linux/soc/mediatek/mtk_wed.h
developer740bee82023-10-16 10:58:43 +0800617index 92df4ba..1438692 100644
developerbd1b38a2023-06-19 11:13:22 +0800618--- a/include/linux/soc/mediatek/mtk_wed.h
619+++ b/include/linux/soc/mediatek/mtk_wed.h
620@@ -240,7 +240,7 @@ struct mtk_wed_ops {
621 void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask);
622 void (*ppe_check)(struct mtk_wed_device *dev, struct sk_buff *skb,
623 u32 reason, u32 hash);
624- void (*start_hwrro)(struct mtk_wed_device *dev, u32 irq_mask);
625+ void (*start_hwrro)(struct mtk_wed_device *dev, u32 irq_mask, bool reset);
626 };
627
628 extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops;
629@@ -317,8 +317,8 @@ mtk_wed_device_support_pao(struct mtk_wed_device *dev)
630 (_dev)->ops->reset_dma(_dev)
631 #define mtk_wed_device_ppe_check(_dev, _skb, _reason, _hash) \
632 (_dev)->ops->ppe_check(_dev, _skb, _reason, _hash)
633-#define mtk_wed_device_start_hwrro(_dev, _mask) \
634- (_dev)->ops->start_hwrro(_dev, _mask)
635+#define mtk_wed_device_start_hwrro(_dev, _mask, _reset) \
636+ (_dev)->ops->start_hwrro(_dev, _mask, _reset)
637
638 #else
639 static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
640--
6412.18.0
642