1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2023 MediaTek Inc. */
4 #include <linux/module.h>
5 #include <linux/firmware.h>
11 irqreturn_t mt792x_irq_handler(int irq, void *dev_instance)
13 struct mt792x_dev *dev = dev_instance;
15 if (test_bit(MT76_REMOVED, &dev->mt76.phy.state))
17 mt76_wr(dev, dev->irq_map->host_irq_enable, 0);
19 if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state))
22 tasklet_schedule(&dev->mt76.irq_tasklet);
26 EXPORT_SYMBOL_GPL(mt792x_irq_handler);
28 void mt792x_irq_tasklet(unsigned long data)
30 struct mt792x_dev *dev = (struct mt792x_dev *)data;
31 const struct mt792x_irq_map *irq_map = dev->irq_map;
34 mt76_wr(dev, irq_map->host_irq_enable, 0);
36 intr = mt76_rr(dev, MT_WFDMA0_HOST_INT_STA);
37 intr &= dev->mt76.mmio.irqmask;
38 mt76_wr(dev, MT_WFDMA0_HOST_INT_STA, intr);
40 trace_dev_irq(&dev->mt76, intr, dev->mt76.mmio.irqmask);
42 mask |= intr & (irq_map->rx.data_complete_mask |
43 irq_map->rx.wm_complete_mask |
44 irq_map->rx.wm2_complete_mask);
45 if (intr & dev->irq_map->tx.mcu_complete_mask)
46 mask |= dev->irq_map->tx.mcu_complete_mask;
48 if (intr & MT_INT_MCU_CMD) {
51 intr_sw = mt76_rr(dev, MT_MCU_CMD);
52 /* ack MCU2HOST_SW_INT_STA */
53 mt76_wr(dev, MT_MCU_CMD, intr_sw);
54 if (intr_sw & MT_MCU_CMD_WAKE_RX_PCIE) {
55 mask |= irq_map->rx.data_complete_mask;
56 intr |= irq_map->rx.data_complete_mask;
60 mt76_set_irq_mask(&dev->mt76, irq_map->host_irq_enable, mask, 0);
62 if (intr & dev->irq_map->tx.all_complete_mask)
63 napi_schedule(&dev->mt76.tx_napi);
65 if (intr & irq_map->rx.wm_complete_mask)
66 napi_schedule(&dev->mt76.napi[MT_RXQ_MCU]);
68 if (intr & irq_map->rx.wm2_complete_mask)
69 napi_schedule(&dev->mt76.napi[MT_RXQ_MCU_WA]);
71 if (intr & irq_map->rx.data_complete_mask)
72 napi_schedule(&dev->mt76.napi[MT_RXQ_MAIN]);
74 EXPORT_SYMBOL_GPL(mt792x_irq_tasklet);
76 void mt792x_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q)
78 struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
79 const struct mt792x_irq_map *irq_map = dev->irq_map;
82 mt76_connac_irq_enable(mdev, irq_map->rx.data_complete_mask);
83 else if (q == MT_RXQ_MCU_WA)
84 mt76_connac_irq_enable(mdev, irq_map->rx.wm2_complete_mask);
86 mt76_connac_irq_enable(mdev, irq_map->rx.wm_complete_mask);
88 EXPORT_SYMBOL_GPL(mt792x_rx_poll_complete);
90 #define PREFETCH(base, depth) ((base) << 16 | (depth))
91 static void mt792x_dma_prefetch(struct mt792x_dev *dev)
93 if (is_mt7925(&dev->mt76)) {
95 mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0000, 0x4));
96 mt76_wr(dev, MT_WFDMA0_RX_RING1_EXT_CTRL, PREFETCH(0x0040, 0x4));
97 mt76_wr(dev, MT_WFDMA0_RX_RING2_EXT_CTRL, PREFETCH(0x0080, 0x4));
98 mt76_wr(dev, MT_WFDMA0_RX_RING3_EXT_CTRL, PREFETCH(0x00c0, 0x4));
100 mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, PREFETCH(0x0100, 0x10));
101 mt76_wr(dev, MT_WFDMA0_TX_RING1_EXT_CTRL, PREFETCH(0x0200, 0x10));
102 mt76_wr(dev, MT_WFDMA0_TX_RING2_EXT_CTRL, PREFETCH(0x0300, 0x10));
103 mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x0400, 0x10));
104 mt76_wr(dev, MT_WFDMA0_TX_RING15_EXT_CTRL, PREFETCH(0x0500, 0x4));
105 mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x0540, 0x4));
108 mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0, 0x4));
109 mt76_wr(dev, MT_WFDMA0_RX_RING2_EXT_CTRL, PREFETCH(0x40, 0x4));
110 mt76_wr(dev, MT_WFDMA0_RX_RING3_EXT_CTRL, PREFETCH(0x80, 0x4));
111 mt76_wr(dev, MT_WFDMA0_RX_RING4_EXT_CTRL, PREFETCH(0xc0, 0x4));
112 mt76_wr(dev, MT_WFDMA0_RX_RING5_EXT_CTRL, PREFETCH(0x100, 0x4));
114 mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, PREFETCH(0x140, 0x4));
115 mt76_wr(dev, MT_WFDMA0_TX_RING1_EXT_CTRL, PREFETCH(0x180, 0x4));
116 mt76_wr(dev, MT_WFDMA0_TX_RING2_EXT_CTRL, PREFETCH(0x1c0, 0x4));
117 mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x200, 0x4));
118 mt76_wr(dev, MT_WFDMA0_TX_RING4_EXT_CTRL, PREFETCH(0x240, 0x4));
119 mt76_wr(dev, MT_WFDMA0_TX_RING5_EXT_CTRL, PREFETCH(0x280, 0x4));
120 mt76_wr(dev, MT_WFDMA0_TX_RING6_EXT_CTRL, PREFETCH(0x2c0, 0x4));
121 mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x340, 0x4));
122 mt76_wr(dev, MT_WFDMA0_TX_RING17_EXT_CTRL, PREFETCH(0x380, 0x4));
126 int mt792x_dma_enable(struct mt792x_dev *dev)
128 /* configure perfetch settings */
129 mt792x_dma_prefetch(dev);
132 mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR, ~0);
133 if (is_mt7925(&dev->mt76))
134 mt76_wr(dev, MT_WFDMA0_RST_DRX_PTR, ~0);
136 /* configure delay interrupt */
137 mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0, 0);
139 mt76_set(dev, MT_WFDMA0_GLO_CFG,
140 MT_WFDMA0_GLO_CFG_TX_WB_DDONE |
141 MT_WFDMA0_GLO_CFG_FIFO_LITTLE_ENDIAN |
142 MT_WFDMA0_GLO_CFG_CLK_GAT_DIS |
143 MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
144 FIELD_PREP(MT_WFDMA0_GLO_CFG_DMA_SIZE, 3) |
145 MT_WFDMA0_GLO_CFG_FIFO_DIS_CHECK |
146 MT_WFDMA0_GLO_CFG_RX_WB_DDONE |
147 MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
148 MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
150 mt76_set(dev, MT_WFDMA0_GLO_CFG,
151 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
153 if (is_mt7925(&dev->mt76)) {
154 mt76_rmw(dev, MT_UWFDMA0_GLO_CFG_EXT1, BIT(28), BIT(28));
155 mt76_set(dev, MT_WFDMA0_INT_RX_PRI, 0x0F00);
156 mt76_set(dev, MT_WFDMA0_INT_TX_PRI, 0x7F00);
158 mt76_set(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
160 /* enable interrupts for TX/RX rings */
161 mt76_connac_irq_enable(&dev->mt76,
162 dev->irq_map->tx.all_complete_mask |
163 dev->irq_map->rx.data_complete_mask |
164 dev->irq_map->rx.wm2_complete_mask |
165 dev->irq_map->rx.wm_complete_mask |
167 mt76_set(dev, MT_MCU2HOST_SW_INT_ENA, MT_MCU_CMD_WAKE_RX_PCIE);
171 EXPORT_SYMBOL_GPL(mt792x_dma_enable);
174 mt792x_dma_reset(struct mt792x_dev *dev, bool force)
178 err = mt792x_dma_disable(dev, force);
182 /* reset hw queues */
183 for (i = 0; i < __MT_TXQ_MAX; i++)
184 mt76_queue_reset(dev, dev->mphy.q_tx[i]);
186 for (i = 0; i < __MT_MCUQ_MAX; i++)
187 mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
189 mt76_for_each_q_rx(&dev->mt76, i)
190 mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
192 mt76_tx_status_check(&dev->mt76, true);
194 return mt792x_dma_enable(dev);
197 int mt792x_wpdma_reset(struct mt792x_dev *dev, bool force)
201 /* clean up hw queues */
202 for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++)
203 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
205 for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++)
206 mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);
208 mt76_for_each_q_rx(&dev->mt76, i)
209 mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);
212 err = mt792x_wfsys_reset(dev);
216 err = mt792x_dma_reset(dev, force);
220 mt76_for_each_q_rx(&dev->mt76, i)
221 mt76_queue_rx_reset(dev, i);
225 EXPORT_SYMBOL_GPL(mt792x_wpdma_reset);
227 int mt792x_wpdma_reinit_cond(struct mt792x_dev *dev)
229 struct mt76_connac_pm *pm = &dev->pm;
232 /* check if the wpdma must be reinitialized */
233 if (mt792x_dma_need_reinit(dev)) {
234 /* disable interrutpts */
235 mt76_wr(dev, dev->irq_map->host_irq_enable, 0);
236 mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
238 err = mt792x_wpdma_reset(dev, false);
240 dev_err(dev->mt76.dev, "wpdma reset failed\n");
244 /* enable interrutpts */
245 mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
251 EXPORT_SYMBOL_GPL(mt792x_wpdma_reinit_cond);
253 int mt792x_dma_disable(struct mt792x_dev *dev, bool force)
256 mt76_clear(dev, MT_WFDMA0_GLO_CFG,
257 MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN |
258 MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
259 MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
260 MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
261 MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
263 if (!mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
264 MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
265 MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1))
268 /* disable dmashdl */
269 mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0,
270 MT_WFDMA0_CSR_TX_DMASHDL_ENABLE);
271 mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS);
275 mt76_clear(dev, MT_WFDMA0_RST,
276 MT_WFDMA0_RST_DMASHDL_ALL_RST |
277 MT_WFDMA0_RST_LOGIC_RST);
279 mt76_set(dev, MT_WFDMA0_RST,
280 MT_WFDMA0_RST_DMASHDL_ALL_RST |
281 MT_WFDMA0_RST_LOGIC_RST);
286 EXPORT_SYMBOL_GPL(mt792x_dma_disable);
288 void mt792x_dma_cleanup(struct mt792x_dev *dev)
291 mt76_clear(dev, MT_WFDMA0_GLO_CFG,
292 MT_WFDMA0_GLO_CFG_TX_DMA_EN |
293 MT_WFDMA0_GLO_CFG_RX_DMA_EN |
294 MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
295 MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
296 MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
297 MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
299 mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
300 MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
301 MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1);
304 mt76_clear(dev, MT_WFDMA0_RST,
305 MT_WFDMA0_RST_DMASHDL_ALL_RST |
306 MT_WFDMA0_RST_LOGIC_RST);
308 mt76_set(dev, MT_WFDMA0_RST,
309 MT_WFDMA0_RST_DMASHDL_ALL_RST |
310 MT_WFDMA0_RST_LOGIC_RST);
312 mt76_dma_cleanup(&dev->mt76);
314 EXPORT_SYMBOL_GPL(mt792x_dma_cleanup);
316 int mt792x_poll_tx(struct napi_struct *napi, int budget)
318 struct mt792x_dev *dev;
320 dev = container_of(napi, struct mt792x_dev, mt76.tx_napi);
322 if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
324 queue_work(dev->mt76.wq, &dev->pm.wake_work);
328 mt76_connac_tx_cleanup(&dev->mt76);
329 if (napi_complete(napi))
330 mt76_connac_irq_enable(&dev->mt76,
331 dev->irq_map->tx.all_complete_mask);
332 mt76_connac_pm_unref(&dev->mphy, &dev->pm);
336 EXPORT_SYMBOL_GPL(mt792x_poll_tx);
338 int mt792x_poll_rx(struct napi_struct *napi, int budget)
340 struct mt792x_dev *dev;
343 dev = mt76_priv(napi->dev);
345 if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
347 queue_work(dev->mt76.wq, &dev->pm.wake_work);
350 done = mt76_dma_rx_poll(napi, budget);
351 mt76_connac_pm_unref(&dev->mphy, &dev->pm);
355 EXPORT_SYMBOL_GPL(mt792x_poll_rx);
357 int mt792x_wfsys_reset(struct mt792x_dev *dev)
359 u32 addr = is_mt7921(&dev->mt76) ? 0x18000140 : 0x7c000140;
361 mt76_clear(dev, addr, WFSYS_SW_RST_B);
363 mt76_set(dev, addr, WFSYS_SW_RST_B);
365 if (!__mt76_poll_msec(&dev->mt76, addr, WFSYS_SW_INIT_DONE,
366 WFSYS_SW_INIT_DONE, 500))
371 EXPORT_SYMBOL_GPL(mt792x_wfsys_reset);