1// SPDX-License-Identifier: ISC
2/* Copyright (C) 2020 MediaTek Inc. */
3
4#include "mt7915.h"
5#include "../dma.h"
6#include "mac.h"
7
8static int
9mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base)
10{
11	struct mt7915_dev *dev = phy->dev;
12	struct mtk_wed_device *wed = NULL;
13
14	if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {
15		if (is_mt798x(&dev->mt76))
16			ring_base += MT_TXQ_ID(0) * MT_RING_SIZE;
17		else
18			ring_base = MT_WED_TX_RING_BASE;
19
20		idx -= MT_TXQ_ID(0);
21		wed = &dev->mt76.mmio.wed;
22	}
23
24	return mt76_connac_init_tx_queues(phy->mt76, idx, n_desc, ring_base,
25					  wed, MT_WED_Q_TX(idx));
26}
27
28static int mt7915_poll_tx(struct napi_struct *napi, int budget)
29{
30	struct mt7915_dev *dev;
31
32	dev = container_of(napi, struct mt7915_dev, mt76.tx_napi);
33
34	mt76_connac_tx_cleanup(&dev->mt76);
35	if (napi_complete_done(napi, 0))
36		mt7915_irq_enable(dev, MT_INT_TX_DONE_MCU);
37
38	return 0;
39}
40
41static void mt7915_dma_config(struct mt7915_dev *dev)
42{
43#define Q_CONFIG(q, wfdma, int, id) do {		\
44		if (wfdma)				\
45			dev->wfdma_mask |= (1 << (q));	\
46		dev->q_int_mask[(q)] = int;		\
47		dev->q_id[(q)] = id;			\
48	} while (0)
49
50#define MCUQ_CONFIG(q, wfdma, int, id)	Q_CONFIG(q, (wfdma), (int), (id))
51#define RXQ_CONFIG(q, wfdma, int, id)	Q_CONFIG(__RXQ(q), (wfdma), (int), (id))
52#define TXQ_CONFIG(q, wfdma, int, id)	Q_CONFIG(__TXQ(q), (wfdma), (int), (id))
53
54	if (is_mt7915(&dev->mt76)) {
55		RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0,
56			   MT7915_RXQ_BAND0);
57		RXQ_CONFIG(MT_RXQ_MCU, WFDMA1, MT_INT_RX_DONE_WM,
58			   MT7915_RXQ_MCU_WM);
59		RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA1, MT_INT_RX_DONE_WA,
60			   MT7915_RXQ_MCU_WA);
61		RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1,
62			   MT7915_RXQ_BAND1);
63		RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA1, MT_INT_RX_DONE_WA_EXT,
64			   MT7915_RXQ_MCU_WA_EXT);
65		RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA1, MT_INT_RX_DONE_WA_MAIN,
66			   MT7915_RXQ_MCU_WA);
67		TXQ_CONFIG(0, WFDMA1, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);
68		TXQ_CONFIG(1, WFDMA1, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);
69		MCUQ_CONFIG(MT_MCUQ_WM, WFDMA1, MT_INT_TX_DONE_MCU_WM,
70			    MT7915_TXQ_MCU_WM);
71		MCUQ_CONFIG(MT_MCUQ_WA, WFDMA1, MT_INT_TX_DONE_MCU_WA,
72			    MT7915_TXQ_MCU_WA);
73		MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA1, MT_INT_TX_DONE_FWDL,
74			    MT7915_TXQ_FWDL);
75	} else {
76		RXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM,
77			   MT7916_RXQ_MCU_WM);
78		RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916,
79			   MT7916_RXQ_MCU_WA_EXT);
80		MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM,
81			    MT7915_TXQ_MCU_WM);
82		MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA_MT7916,
83			    MT7915_TXQ_MCU_WA);
84		MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL,
85			    MT7915_TXQ_FWDL);
86
87		if (is_mt7916(&dev->mt76) && mtk_wed_device_active(&dev->mt76.mmio.wed)) {
88			RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_WED_RX_DONE_BAND0_MT7916,
89				   MT7916_RXQ_BAND0);
90			RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MT7916,
91				   MT7916_RXQ_MCU_WA);
92			if (dev->hif2)
93				RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0,
94					   MT_INT_RX_DONE_BAND1_MT7916,
95					   MT7916_RXQ_BAND1);
96			else
97				RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0,
98					   MT_INT_WED_RX_DONE_BAND1_MT7916,
99					   MT7916_RXQ_BAND1);
100			RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MAIN_MT7916,
101				   MT7916_RXQ_MCU_WA_MAIN);
102			TXQ_CONFIG(0, WFDMA0, MT_INT_WED_TX_DONE_BAND0,
103				   MT7915_TXQ_BAND0);
104			TXQ_CONFIG(1, WFDMA0, MT_INT_WED_TX_DONE_BAND1,
105				   MT7915_TXQ_BAND1);
106		} else {
107			RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0_MT7916,
108				   MT7916_RXQ_BAND0);
109			RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA,
110				   MT7916_RXQ_MCU_WA);
111			RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916,
112				   MT7916_RXQ_BAND1);
113			RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN_MT7916,
114				   MT7916_RXQ_MCU_WA_MAIN);
115			TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
116				   MT7915_TXQ_BAND0);
117			TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,
118				   MT7915_TXQ_BAND1);
119		}
120	}
121}
122
123static void __mt7915_dma_prefetch(struct mt7915_dev *dev, u32 ofs)
124{
125#define PREFETCH(_base, _depth)	((_base) << 16 | (_depth))
126	u32 base = 0;
127
128	/* prefetch SRAM wrapping boundary for tx/rx ring. */
129	mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_FWDL) + ofs, PREFETCH(0x0, 0x4));
130	mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WM) + ofs, PREFETCH(0x40, 0x4));
131	mt76_wr(dev, MT_TXQ_EXT_CTRL(0) + ofs, PREFETCH(0x80, 0x4));
132	mt76_wr(dev, MT_TXQ_EXT_CTRL(1) + ofs, PREFETCH(0xc0, 0x4));
133	mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WA) + ofs, PREFETCH(0x100, 0x4));
134
135	mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MCU) + ofs,
136		PREFETCH(0x140, 0x4));
137	mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MCU_WA) + ofs,
138		PREFETCH(0x180, 0x4));
139	if (!is_mt7915(&dev->mt76)) {
140		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MAIN_WA) + ofs,
141			PREFETCH(0x1c0, 0x4));
142		base = 0x40;
143	}
144	mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1_WA) + ofs,
145		PREFETCH(0x1c0 + base, 0x4));
146	mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MAIN) + ofs,
147		PREFETCH(0x200 + base, 0x4));
148	mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1) + ofs,
149		PREFETCH(0x240 + base, 0x4));
150
151	/* for mt7915, the ring which is next the last
152	 * used ring must be initialized.
153	 */
154	if (is_mt7915(&dev->mt76)) {
155		ofs += 0x4;
156		mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WA) + ofs,
157			PREFETCH(0x140, 0x0));
158		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1_WA) + ofs,
159			PREFETCH(0x200 + base, 0x0));
160		mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1) + ofs,
161			PREFETCH(0x280 + base, 0x0));
162	}
163}
164
165void mt7915_dma_prefetch(struct mt7915_dev *dev)
166{
167	__mt7915_dma_prefetch(dev, 0);
168	if (dev->hif2)
169		__mt7915_dma_prefetch(dev, MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0));
170}
171
172static void mt7915_dma_disable(struct mt7915_dev *dev, bool rst)
173{
174	struct mt76_dev *mdev = &dev->mt76;
175	u32 hif1_ofs = 0;
176
177	if (dev->hif2)
178		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
179
180	/* reset */
181	if (rst) {
182		mt76_clear(dev, MT_WFDMA0_RST,
183			   MT_WFDMA0_RST_DMASHDL_ALL_RST |
184			   MT_WFDMA0_RST_LOGIC_RST);
185
186		mt76_set(dev, MT_WFDMA0_RST,
187			 MT_WFDMA0_RST_DMASHDL_ALL_RST |
188			 MT_WFDMA0_RST_LOGIC_RST);
189
190		if (is_mt7915(mdev)) {
191			mt76_clear(dev, MT_WFDMA1_RST,
192				   MT_WFDMA1_RST_DMASHDL_ALL_RST |
193				   MT_WFDMA1_RST_LOGIC_RST);
194
195			mt76_set(dev, MT_WFDMA1_RST,
196				 MT_WFDMA1_RST_DMASHDL_ALL_RST |
197				 MT_WFDMA1_RST_LOGIC_RST);
198		}
199
200		if (dev->hif2) {
201			mt76_clear(dev, MT_WFDMA0_RST + hif1_ofs,
202				   MT_WFDMA0_RST_DMASHDL_ALL_RST |
203				   MT_WFDMA0_RST_LOGIC_RST);
204
205			mt76_set(dev, MT_WFDMA0_RST + hif1_ofs,
206				 MT_WFDMA0_RST_DMASHDL_ALL_RST |
207				 MT_WFDMA0_RST_LOGIC_RST);
208
209			if (is_mt7915(mdev)) {
210				mt76_clear(dev, MT_WFDMA1_RST + hif1_ofs,
211					   MT_WFDMA1_RST_DMASHDL_ALL_RST |
212					   MT_WFDMA1_RST_LOGIC_RST);
213
214				mt76_set(dev, MT_WFDMA1_RST + hif1_ofs,
215					 MT_WFDMA1_RST_DMASHDL_ALL_RST |
216					 MT_WFDMA1_RST_LOGIC_RST);
217			}
218		}
219	}
220
221	/* disable */
222	mt76_clear(dev, MT_WFDMA0_GLO_CFG,
223		   MT_WFDMA0_GLO_CFG_TX_DMA_EN |
224		   MT_WFDMA0_GLO_CFG_RX_DMA_EN |
225		   MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
226		   MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
227		   MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
228
229	if (is_mt7915(mdev))
230		mt76_clear(dev, MT_WFDMA1_GLO_CFG,
231			   MT_WFDMA1_GLO_CFG_TX_DMA_EN |
232			   MT_WFDMA1_GLO_CFG_RX_DMA_EN |
233			   MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
234			   MT_WFDMA1_GLO_CFG_OMIT_RX_INFO |
235			   MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2);
236
237	if (dev->hif2) {
238		mt76_clear(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
239			   MT_WFDMA0_GLO_CFG_TX_DMA_EN |
240			   MT_WFDMA0_GLO_CFG_RX_DMA_EN |
241			   MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
242			   MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
243			   MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
244
245		if (is_mt7915(mdev))
246			mt76_clear(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
247				   MT_WFDMA1_GLO_CFG_TX_DMA_EN |
248				   MT_WFDMA1_GLO_CFG_RX_DMA_EN |
249				   MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
250				   MT_WFDMA1_GLO_CFG_OMIT_RX_INFO |
251				   MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2);
252	}
253}
254
255int mt7915_dma_start(struct mt7915_dev *dev, bool reset, bool wed_reset)
256{
257	struct mt76_dev *mdev = &dev->mt76;
258	u32 hif1_ofs = 0;
259	u32 irq_mask;
260
261	if (dev->hif2)
262		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
263
264	/* enable wpdma tx/rx */
265	if (!reset) {
266		mt76_set(dev, MT_WFDMA0_GLO_CFG,
267			MT_WFDMA0_GLO_CFG_TX_DMA_EN |
268			MT_WFDMA0_GLO_CFG_RX_DMA_EN |
269			MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
270			MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
271
272		if (is_mt7915(mdev))
273			mt76_set(dev, MT_WFDMA1_GLO_CFG,
274				MT_WFDMA1_GLO_CFG_TX_DMA_EN |
275				MT_WFDMA1_GLO_CFG_RX_DMA_EN |
276				MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
277				MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
278
279		if (dev->hif2) {
280			mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,
281				MT_WFDMA0_GLO_CFG_TX_DMA_EN |
282				MT_WFDMA0_GLO_CFG_RX_DMA_EN |
283				MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
284				MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
285
286			if (is_mt7915(mdev))
287				mt76_set(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,
288					MT_WFDMA1_GLO_CFG_TX_DMA_EN |
289					MT_WFDMA1_GLO_CFG_RX_DMA_EN |
290					MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |
291					MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);
292
293			mt76_set(dev, MT_WFDMA_HOST_CONFIG,
294				MT_WFDMA_HOST_CONFIG_PDMA_BAND);
295		}
296	}
297
298	/* enable interrupts for TX/RX rings */
299	irq_mask = MT_INT_RX_DONE_MCU |
300		   MT_INT_TX_DONE_MCU |
301		   MT_INT_MCU_CMD;
302
303	if (!dev->phy.mt76->band_idx)
304		irq_mask |= MT_INT_BAND0_RX_DONE;
305
306	if (dev->dbdc_support || dev->phy.mt76->band_idx)
307		irq_mask |= MT_INT_BAND1_RX_DONE;
308
309	if (mtk_wed_device_active(&dev->mt76.mmio.wed) && wed_reset) {
310		u32 wed_irq_mask = irq_mask;
311		int ret;
312
313		wed_irq_mask |= MT_INT_TX_DONE_BAND0 | MT_INT_TX_DONE_BAND1;
314		if (!is_mt798x(&dev->mt76))
315			mt76_wr(dev, MT_INT_WED_MASK_CSR, wed_irq_mask);
316		else
317			mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
318
319		ret = mt7915_mcu_wed_enable_rx_stats(dev);
320		if (ret)
321			return ret;
322
323		mtk_wed_device_start(&dev->mt76.mmio.wed, wed_irq_mask);
324	}
325
326	irq_mask = reset ? MT_INT_MCU_CMD : irq_mask;
327
328	mt7915_irq_enable(dev, irq_mask);
329	mt7915_irq_disable(dev, 0);
330
331	return 0;
332}
333
334static int mt7915_dma_enable(struct mt7915_dev *dev, bool reset)
335{
336	struct mt76_dev *mdev = &dev->mt76;
337	u32 hif1_ofs = 0;
338
339	if (dev->hif2)
340		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
341
342	/* reset dma idx */
343	mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR, ~0);
344	if (is_mt7915(mdev))
345		mt76_wr(dev, MT_WFDMA1_RST_DTX_PTR, ~0);
346	if (dev->hif2) {
347		mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR + hif1_ofs, ~0);
348		if (is_mt7915(mdev))
349			mt76_wr(dev, MT_WFDMA1_RST_DTX_PTR + hif1_ofs, ~0);
350	}
351
352	/* configure delay interrupt off */
353	mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0, 0);
354	if (is_mt7915(mdev)) {
355		mt76_wr(dev, MT_WFDMA1_PRI_DLY_INT_CFG0, 0);
356	} else {
357		mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG1, 0);
358		mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG2, 0);
359	}
360
361	if (dev->hif2) {
362		mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0 + hif1_ofs, 0);
363		if (is_mt7915(mdev)) {
364			mt76_wr(dev, MT_WFDMA1_PRI_DLY_INT_CFG0 +
365				hif1_ofs, 0);
366		} else {
367			mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG1 +
368				hif1_ofs, 0);
369			mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG2 +
370				hif1_ofs, 0);
371		}
372	}
373
374	/* configure perfetch settings */
375	mt7915_dma_prefetch(dev);
376
377	/* hif wait WFDMA idle */
378	mt76_set(dev, MT_WFDMA0_BUSY_ENA,
379		 MT_WFDMA0_BUSY_ENA_TX_FIFO0 |
380		 MT_WFDMA0_BUSY_ENA_TX_FIFO1 |
381		 MT_WFDMA0_BUSY_ENA_RX_FIFO);
382
383	if (is_mt7915(mdev))
384		mt76_set(dev, MT_WFDMA1_BUSY_ENA,
385			 MT_WFDMA1_BUSY_ENA_TX_FIFO0 |
386			 MT_WFDMA1_BUSY_ENA_TX_FIFO1 |
387			 MT_WFDMA1_BUSY_ENA_RX_FIFO);
388
389	if (dev->hif2) {
390		mt76_set(dev, MT_WFDMA0_BUSY_ENA + hif1_ofs,
391			 MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO0 |
392			 MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO1 |
393			 MT_WFDMA0_PCIE1_BUSY_ENA_RX_FIFO);
394
395		if (is_mt7915(mdev))
396			mt76_set(dev, MT_WFDMA1_BUSY_ENA + hif1_ofs,
397				 MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO0 |
398				 MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO1 |
399				 MT_WFDMA1_PCIE1_BUSY_ENA_RX_FIFO);
400	}
401
402	mt76_poll(dev, MT_WFDMA_EXT_CSR_HIF_MISC,
403		  MT_WFDMA_EXT_CSR_HIF_MISC_BUSY, 0, 1000);
404
405	return mt7915_dma_start(dev, reset, true);
406}
407
408int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
409{
410	struct mt76_dev *mdev = &dev->mt76;
411	u32 wa_rx_base, wa_rx_idx;
412	u32 hif1_ofs = 0;
413	int ret;
414
415	mt7915_dma_config(dev);
416
417	mt76_dma_attach(&dev->mt76);
418
419	if (dev->hif2)
420		hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);
421
422	mt7915_dma_disable(dev, true);
423
424	if (mtk_wed_device_active(&mdev->mmio.wed)) {
425		if (!is_mt798x(mdev)) {
426			u8 wed_control_rx1 = is_mt7915(mdev) ? 1 : 2;
427
428			mt76_set(dev, MT_WFDMA_HOST_CONFIG,
429				 MT_WFDMA_HOST_CONFIG_WED);
430			mt76_wr(dev, MT_WFDMA_WED_RING_CONTROL,
431				FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_TX0, 18) |
432				FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_TX1, 19) |
433				FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_RX1,
434					   wed_control_rx1));
435			if (is_mt7915(mdev))
436				mt76_rmw(dev, MT_WFDMA0_EXT0_CFG, MT_WFDMA0_EXT0_RXWB_KEEP,
437					 MT_WFDMA0_EXT0_RXWB_KEEP);
438		}
439	} else {
440		mt76_clear(dev, MT_WFDMA_HOST_CONFIG, MT_WFDMA_HOST_CONFIG_WED);
441	}
442
443	/* init tx queue */
444	ret = mt7915_init_tx_queues(&dev->phy,
445				    MT_TXQ_ID(dev->phy.mt76->band_idx),
446				    MT7915_TX_RING_SIZE,
447				    MT_TXQ_RING_BASE(0));
448	if (ret)
449		return ret;
450
451	if (phy2) {
452		ret = mt7915_init_tx_queues(phy2,
453					    MT_TXQ_ID(phy2->mt76->band_idx),
454					    MT7915_TX_RING_SIZE,
455					    MT_TXQ_RING_BASE(1));
456		if (ret)
457			return ret;
458	}
459
460	/* command to WM */
461	ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM,
462				  MT_MCUQ_ID(MT_MCUQ_WM),
463				  MT7915_TX_MCU_RING_SIZE,
464				  MT_MCUQ_RING_BASE(MT_MCUQ_WM));
465	if (ret)
466		return ret;
467
468	/* command to WA */
469	ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WA,
470				  MT_MCUQ_ID(MT_MCUQ_WA),
471				  MT7915_TX_MCU_RING_SIZE,
472				  MT_MCUQ_RING_BASE(MT_MCUQ_WA));
473	if (ret)
474		return ret;
475
476	/* firmware download */
477	ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_FWDL,
478				  MT_MCUQ_ID(MT_MCUQ_FWDL),
479				  MT7915_TX_FWDL_RING_SIZE,
480				  MT_MCUQ_RING_BASE(MT_MCUQ_FWDL));
481	if (ret)
482		return ret;
483
484	/* event from WM */
485	ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
486			       MT_RXQ_ID(MT_RXQ_MCU),
487			       MT7915_RX_MCU_RING_SIZE,
488			       MT_RX_BUF_SIZE,
489			       MT_RXQ_RING_BASE(MT_RXQ_MCU));
490	if (ret)
491		return ret;
492
493	/* event from WA */
494	if (mtk_wed_device_active(&mdev->mmio.wed) && is_mt7915(mdev)) {
495		wa_rx_base = MT_WED_RX_RING_BASE;
496		wa_rx_idx = MT7915_RXQ_MCU_WA;
497		mdev->q_rx[MT_RXQ_MCU_WA].flags = MT_WED_Q_TXFREE;
498		mdev->q_rx[MT_RXQ_MCU_WA].wed = &mdev->mmio.wed;
499	} else {
500		wa_rx_base = MT_RXQ_RING_BASE(MT_RXQ_MCU_WA);
501		wa_rx_idx = MT_RXQ_ID(MT_RXQ_MCU_WA);
502	}
503	ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
504			       wa_rx_idx, MT7915_RX_MCU_RING_SIZE,
505			       MT_RX_BUF_SIZE, wa_rx_base);
506	if (ret)
507		return ret;
508
509	/* rx data queue for band0 */
510	if (!dev->phy.mt76->band_idx) {
511		if (mtk_wed_device_active(&mdev->mmio.wed) &&
512		    mtk_wed_get_rx_capa(&mdev->mmio.wed)) {
513			mdev->q_rx[MT_RXQ_MAIN].flags =
514				MT_WED_Q_RX(MT7915_RXQ_BAND0);
515			dev->mt76.rx_token_size += MT7915_RX_RING_SIZE;
516			mdev->q_rx[MT_RXQ_MAIN].wed = &mdev->mmio.wed;
517		}
518
519		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],
520				       MT_RXQ_ID(MT_RXQ_MAIN),
521				       MT7915_RX_RING_SIZE,
522				       MT_RX_BUF_SIZE,
523				       MT_RXQ_RING_BASE(MT_RXQ_MAIN));
524		if (ret)
525			return ret;
526	}
527
528	/* tx free notify event from WA for band0 */
529	if (!is_mt7915(mdev)) {
530		wa_rx_base = MT_RXQ_RING_BASE(MT_RXQ_MAIN_WA);
531		wa_rx_idx = MT_RXQ_ID(MT_RXQ_MAIN_WA);
532
533		if (mtk_wed_device_active(&mdev->mmio.wed)) {
534			mdev->q_rx[MT_RXQ_MAIN_WA].flags = MT_WED_Q_TXFREE;
535			mdev->q_rx[MT_RXQ_MAIN_WA].wed = &mdev->mmio.wed;
536			if (is_mt7916(mdev)) {
537				wa_rx_base =  MT_WED_RX_RING_BASE;
538				wa_rx_idx = MT7915_RXQ_MCU_WA;
539			}
540		}
541
542		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN_WA],
543				       wa_rx_idx, MT7915_RX_MCU_RING_SIZE,
544				       MT_RX_BUF_SIZE, wa_rx_base);
545		if (ret)
546			return ret;
547	}
548
549	if (dev->dbdc_support || dev->phy.mt76->band_idx) {
550		if (mtk_wed_device_active(&mdev->mmio.wed) &&
551		    mtk_wed_get_rx_capa(&mdev->mmio.wed)) {
552			mdev->q_rx[MT_RXQ_BAND1].flags =
553				MT_WED_Q_RX(MT7915_RXQ_BAND1);
554			dev->mt76.rx_token_size += MT7915_RX_RING_SIZE;
555			mdev->q_rx[MT_RXQ_BAND1].wed = &mdev->mmio.wed;
556		}
557
558		/* rx data queue for band1 */
559		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1],
560				       MT_RXQ_ID(MT_RXQ_BAND1),
561				       MT7915_RX_RING_SIZE,
562				       MT_RX_BUF_SIZE,
563				       MT_RXQ_RING_BASE(MT_RXQ_BAND1) + hif1_ofs);
564		if (ret)
565			return ret;
566
567		/* tx free notify event from WA for band1 */
568		ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1_WA],
569				       MT_RXQ_ID(MT_RXQ_BAND1_WA),
570				       MT7915_RX_MCU_RING_SIZE,
571				       MT_RX_BUF_SIZE,
572				       MT_RXQ_RING_BASE(MT_RXQ_BAND1_WA) + hif1_ofs);
573		if (ret)
574			return ret;
575	}
576
577	ret = mt76_init_queues(dev, mt76_dma_rx_poll);
578	if (ret < 0)
579		return ret;
580
581	netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
582			  mt7915_poll_tx);
583	napi_enable(&dev->mt76.tx_napi);
584
585	mt7915_dma_enable(dev, false);
586
587	return 0;
588}
589
590int mt7915_dma_reset(struct mt7915_dev *dev, bool force)
591{
592	struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];
593	struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
594	int i;
595
596	/* clean up hw queues */
597	for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++) {
598		mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
599		if (mphy_ext)
600			mt76_queue_tx_cleanup(dev, mphy_ext->q_tx[i], true);
601	}
602
603	for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++)
604		mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);
605
606	mt76_for_each_q_rx(&dev->mt76, i)
607		mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);
608
609	/* reset wfsys */
610	if (force)
611		mt7915_wfsys_reset(dev);
612
613	if (mtk_wed_device_active(wed))
614		mtk_wed_device_dma_reset(wed);
615
616	mt7915_dma_disable(dev, force);
617	mt76_wed_dma_reset(&dev->mt76);
618
619	/* reset hw queues */
620	for (i = 0; i < __MT_TXQ_MAX; i++) {
621		mt76_dma_reset_tx_queue(&dev->mt76, dev->mphy.q_tx[i]);
622		if (mphy_ext)
623			mt76_dma_reset_tx_queue(&dev->mt76, mphy_ext->q_tx[i]);
624	}
625
626	for (i = 0; i < __MT_MCUQ_MAX; i++)
627		mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
628
629	mt76_for_each_q_rx(&dev->mt76, i) {
630		if (mt76_queue_is_wed_tx_free(&dev->mt76.q_rx[i]))
631			continue;
632
633		mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
634	}
635
636	mt76_tx_status_check(&dev->mt76, true);
637
638	mt76_for_each_q_rx(&dev->mt76, i)
639		mt76_queue_rx_reset(dev, i);
640
641	if (mtk_wed_device_active(wed) && is_mt7915(&dev->mt76))
642		mt76_rmw(dev, MT_WFDMA0_EXT0_CFG, MT_WFDMA0_EXT0_RXWB_KEEP,
643			 MT_WFDMA0_EXT0_RXWB_KEEP);
644
645	mt7915_dma_enable(dev, !force);
646
647	return 0;
648}
649
650void mt7915_dma_cleanup(struct mt7915_dev *dev)
651{
652	mt7915_dma_disable(dev, true);
653
654	mt76_dma_cleanup(&dev->mt76);
655}
656