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