162306a36Sopenharmony_ci// SPDX-License-Identifier: ISC 262306a36Sopenharmony_ci/* Copyright (C) 2023 MediaTek Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/module.h> 562306a36Sopenharmony_ci#include <linux/firmware.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "mt792x.h" 862306a36Sopenharmony_ci#include "dma.h" 962306a36Sopenharmony_ci#include "trace.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciirqreturn_t mt792x_irq_handler(int irq, void *dev_instance) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci struct mt792x_dev *dev = dev_instance; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci if (test_bit(MT76_REMOVED, &dev->mt76.phy.state)) 1662306a36Sopenharmony_ci return IRQ_NONE; 1762306a36Sopenharmony_ci mt76_wr(dev, dev->irq_map->host_irq_enable, 0); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state)) 2062306a36Sopenharmony_ci return IRQ_NONE; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci tasklet_schedule(&dev->mt76.irq_tasklet); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci return IRQ_HANDLED; 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_irq_handler); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_civoid mt792x_irq_tasklet(unsigned long data) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct mt792x_dev *dev = (struct mt792x_dev *)data; 3162306a36Sopenharmony_ci const struct mt792x_irq_map *irq_map = dev->irq_map; 3262306a36Sopenharmony_ci u32 intr, mask = 0; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci mt76_wr(dev, irq_map->host_irq_enable, 0); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci intr = mt76_rr(dev, MT_WFDMA0_HOST_INT_STA); 3762306a36Sopenharmony_ci intr &= dev->mt76.mmio.irqmask; 3862306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_HOST_INT_STA, intr); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci trace_dev_irq(&dev->mt76, intr, dev->mt76.mmio.irqmask); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci mask |= intr & (irq_map->rx.data_complete_mask | 4362306a36Sopenharmony_ci irq_map->rx.wm_complete_mask | 4462306a36Sopenharmony_ci irq_map->rx.wm2_complete_mask); 4562306a36Sopenharmony_ci if (intr & dev->irq_map->tx.mcu_complete_mask) 4662306a36Sopenharmony_ci mask |= dev->irq_map->tx.mcu_complete_mask; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci if (intr & MT_INT_MCU_CMD) { 4962306a36Sopenharmony_ci u32 intr_sw; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci intr_sw = mt76_rr(dev, MT_MCU_CMD); 5262306a36Sopenharmony_ci /* ack MCU2HOST_SW_INT_STA */ 5362306a36Sopenharmony_ci mt76_wr(dev, MT_MCU_CMD, intr_sw); 5462306a36Sopenharmony_ci if (intr_sw & MT_MCU_CMD_WAKE_RX_PCIE) { 5562306a36Sopenharmony_ci mask |= irq_map->rx.data_complete_mask; 5662306a36Sopenharmony_ci intr |= irq_map->rx.data_complete_mask; 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci } 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci mt76_set_irq_mask(&dev->mt76, irq_map->host_irq_enable, mask, 0); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci if (intr & dev->irq_map->tx.all_complete_mask) 6362306a36Sopenharmony_ci napi_schedule(&dev->mt76.tx_napi); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci if (intr & irq_map->rx.wm_complete_mask) 6662306a36Sopenharmony_ci napi_schedule(&dev->mt76.napi[MT_RXQ_MCU]); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (intr & irq_map->rx.wm2_complete_mask) 6962306a36Sopenharmony_ci napi_schedule(&dev->mt76.napi[MT_RXQ_MCU_WA]); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci if (intr & irq_map->rx.data_complete_mask) 7262306a36Sopenharmony_ci napi_schedule(&dev->mt76.napi[MT_RXQ_MAIN]); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_irq_tasklet); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_civoid mt792x_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76); 7962306a36Sopenharmony_ci const struct mt792x_irq_map *irq_map = dev->irq_map; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci if (q == MT_RXQ_MAIN) 8262306a36Sopenharmony_ci mt76_connac_irq_enable(mdev, irq_map->rx.data_complete_mask); 8362306a36Sopenharmony_ci else if (q == MT_RXQ_MCU_WA) 8462306a36Sopenharmony_ci mt76_connac_irq_enable(mdev, irq_map->rx.wm2_complete_mask); 8562306a36Sopenharmony_ci else 8662306a36Sopenharmony_ci mt76_connac_irq_enable(mdev, irq_map->rx.wm_complete_mask); 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_rx_poll_complete); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci#define PREFETCH(base, depth) ((base) << 16 | (depth)) 9162306a36Sopenharmony_cistatic void mt792x_dma_prefetch(struct mt792x_dev *dev) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0, 0x4)); 9462306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RX_RING2_EXT_CTRL, PREFETCH(0x40, 0x4)); 9562306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RX_RING3_EXT_CTRL, PREFETCH(0x80, 0x4)); 9662306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RX_RING4_EXT_CTRL, PREFETCH(0xc0, 0x4)); 9762306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RX_RING5_EXT_CTRL, PREFETCH(0x100, 0x4)); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, PREFETCH(0x140, 0x4)); 10062306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING1_EXT_CTRL, PREFETCH(0x180, 0x4)); 10162306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING2_EXT_CTRL, PREFETCH(0x1c0, 0x4)); 10262306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x200, 0x4)); 10362306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING4_EXT_CTRL, PREFETCH(0x240, 0x4)); 10462306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING5_EXT_CTRL, PREFETCH(0x280, 0x4)); 10562306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING6_EXT_CTRL, PREFETCH(0x2c0, 0x4)); 10662306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x340, 0x4)); 10762306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_TX_RING17_EXT_CTRL, PREFETCH(0x380, 0x4)); 10862306a36Sopenharmony_ci} 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciint mt792x_dma_enable(struct mt792x_dev *dev) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci /* configure perfetch settings */ 11362306a36Sopenharmony_ci mt792x_dma_prefetch(dev); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci /* reset dma idx */ 11662306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR, ~0); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* configure delay interrupt */ 11962306a36Sopenharmony_ci mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0, 0); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci mt76_set(dev, MT_WFDMA0_GLO_CFG, 12262306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_WB_DDONE | 12362306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_FIFO_LITTLE_ENDIAN | 12462306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_CLK_GAT_DIS | 12562306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | 12662306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN | 12762306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci mt76_set(dev, MT_WFDMA0_GLO_CFG, 13062306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci mt76_set(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* enable interrupts for TX/RX rings */ 13562306a36Sopenharmony_ci mt76_connac_irq_enable(&dev->mt76, 13662306a36Sopenharmony_ci dev->irq_map->tx.all_complete_mask | 13762306a36Sopenharmony_ci dev->irq_map->rx.data_complete_mask | 13862306a36Sopenharmony_ci dev->irq_map->rx.wm2_complete_mask | 13962306a36Sopenharmony_ci dev->irq_map->rx.wm_complete_mask | 14062306a36Sopenharmony_ci MT_INT_MCU_CMD); 14162306a36Sopenharmony_ci mt76_set(dev, MT_MCU2HOST_SW_INT_ENA, MT_MCU_CMD_WAKE_RX_PCIE); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci return 0; 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_dma_enable); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic int 14862306a36Sopenharmony_cimt792x_dma_reset(struct mt792x_dev *dev, bool force) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci int i, err; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci err = mt792x_dma_disable(dev, force); 15362306a36Sopenharmony_ci if (err) 15462306a36Sopenharmony_ci return err; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* reset hw queues */ 15762306a36Sopenharmony_ci for (i = 0; i < __MT_TXQ_MAX; i++) 15862306a36Sopenharmony_ci mt76_queue_reset(dev, dev->mphy.q_tx[i]); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci for (i = 0; i < __MT_MCUQ_MAX; i++) 16162306a36Sopenharmony_ci mt76_queue_reset(dev, dev->mt76.q_mcu[i]); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci mt76_for_each_q_rx(&dev->mt76, i) 16462306a36Sopenharmony_ci mt76_queue_reset(dev, &dev->mt76.q_rx[i]); 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci mt76_tx_status_check(&dev->mt76, true); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci return mt792x_dma_enable(dev); 16962306a36Sopenharmony_ci} 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ciint mt792x_wpdma_reset(struct mt792x_dev *dev, bool force) 17262306a36Sopenharmony_ci{ 17362306a36Sopenharmony_ci int i, err; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci /* clean up hw queues */ 17662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++) 17762306a36Sopenharmony_ci mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++) 18062306a36Sopenharmony_ci mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci mt76_for_each_q_rx(&dev->mt76, i) 18362306a36Sopenharmony_ci mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci if (force) { 18662306a36Sopenharmony_ci err = mt792x_wfsys_reset(dev); 18762306a36Sopenharmony_ci if (err) 18862306a36Sopenharmony_ci return err; 18962306a36Sopenharmony_ci } 19062306a36Sopenharmony_ci err = mt792x_dma_reset(dev, force); 19162306a36Sopenharmony_ci if (err) 19262306a36Sopenharmony_ci return err; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci mt76_for_each_q_rx(&dev->mt76, i) 19562306a36Sopenharmony_ci mt76_queue_rx_reset(dev, i); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci return 0; 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_wpdma_reset); 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ciint mt792x_wpdma_reinit_cond(struct mt792x_dev *dev) 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci struct mt76_connac_pm *pm = &dev->pm; 20462306a36Sopenharmony_ci int err; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci /* check if the wpdma must be reinitialized */ 20762306a36Sopenharmony_ci if (mt792x_dma_need_reinit(dev)) { 20862306a36Sopenharmony_ci /* disable interrutpts */ 20962306a36Sopenharmony_ci mt76_wr(dev, dev->irq_map->host_irq_enable, 0); 21062306a36Sopenharmony_ci mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0); 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci err = mt792x_wpdma_reset(dev, false); 21362306a36Sopenharmony_ci if (err) { 21462306a36Sopenharmony_ci dev_err(dev->mt76.dev, "wpdma reset failed\n"); 21562306a36Sopenharmony_ci return err; 21662306a36Sopenharmony_ci } 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* enable interrutpts */ 21962306a36Sopenharmony_ci mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff); 22062306a36Sopenharmony_ci pm->stats.lp_wake++; 22162306a36Sopenharmony_ci } 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci return 0; 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_wpdma_reinit_cond); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ciint mt792x_dma_disable(struct mt792x_dev *dev, bool force) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci /* disable WFDMA0 */ 23062306a36Sopenharmony_ci mt76_clear(dev, MT_WFDMA0_GLO_CFG, 23162306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN | 23262306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN | 23362306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | 23462306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_RX_INFO | 23562306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2); 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci if (!mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG, 23862306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_DMA_BUSY | 23962306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1)) 24062306a36Sopenharmony_ci return -ETIMEDOUT; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* disable dmashdl */ 24362306a36Sopenharmony_ci mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0, 24462306a36Sopenharmony_ci MT_WFDMA0_CSR_TX_DMASHDL_ENABLE); 24562306a36Sopenharmony_ci mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS); 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci if (force) { 24862306a36Sopenharmony_ci /* reset */ 24962306a36Sopenharmony_ci mt76_clear(dev, MT_WFDMA0_RST, 25062306a36Sopenharmony_ci MT_WFDMA0_RST_DMASHDL_ALL_RST | 25162306a36Sopenharmony_ci MT_WFDMA0_RST_LOGIC_RST); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci mt76_set(dev, MT_WFDMA0_RST, 25462306a36Sopenharmony_ci MT_WFDMA0_RST_DMASHDL_ALL_RST | 25562306a36Sopenharmony_ci MT_WFDMA0_RST_LOGIC_RST); 25662306a36Sopenharmony_ci } 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci return 0; 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_dma_disable); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_civoid mt792x_dma_cleanup(struct mt792x_dev *dev) 26362306a36Sopenharmony_ci{ 26462306a36Sopenharmony_ci /* disable */ 26562306a36Sopenharmony_ci mt76_clear(dev, MT_WFDMA0_GLO_CFG, 26662306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_DMA_EN | 26762306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_RX_DMA_EN | 26862306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN | 26962306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_TX_INFO | 27062306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_RX_INFO | 27162306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2); 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG, 27462306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_TX_DMA_BUSY | 27562306a36Sopenharmony_ci MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1); 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci /* reset */ 27862306a36Sopenharmony_ci mt76_clear(dev, MT_WFDMA0_RST, 27962306a36Sopenharmony_ci MT_WFDMA0_RST_DMASHDL_ALL_RST | 28062306a36Sopenharmony_ci MT_WFDMA0_RST_LOGIC_RST); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci mt76_set(dev, MT_WFDMA0_RST, 28362306a36Sopenharmony_ci MT_WFDMA0_RST_DMASHDL_ALL_RST | 28462306a36Sopenharmony_ci MT_WFDMA0_RST_LOGIC_RST); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci mt76_dma_cleanup(&dev->mt76); 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_dma_cleanup); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ciint mt792x_poll_tx(struct napi_struct *napi, int budget) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci struct mt792x_dev *dev; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci dev = container_of(napi, struct mt792x_dev, mt76.tx_napi); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 29762306a36Sopenharmony_ci napi_complete(napi); 29862306a36Sopenharmony_ci queue_work(dev->mt76.wq, &dev->pm.wake_work); 29962306a36Sopenharmony_ci return 0; 30062306a36Sopenharmony_ci } 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci mt76_connac_tx_cleanup(&dev->mt76); 30362306a36Sopenharmony_ci if (napi_complete(napi)) 30462306a36Sopenharmony_ci mt76_connac_irq_enable(&dev->mt76, 30562306a36Sopenharmony_ci dev->irq_map->tx.all_complete_mask); 30662306a36Sopenharmony_ci mt76_connac_pm_unref(&dev->mphy, &dev->pm); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci return 0; 30962306a36Sopenharmony_ci} 31062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_poll_tx); 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ciint mt792x_poll_rx(struct napi_struct *napi, int budget) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci struct mt792x_dev *dev; 31562306a36Sopenharmony_ci int done; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 32062306a36Sopenharmony_ci napi_complete(napi); 32162306a36Sopenharmony_ci queue_work(dev->mt76.wq, &dev->pm.wake_work); 32262306a36Sopenharmony_ci return 0; 32362306a36Sopenharmony_ci } 32462306a36Sopenharmony_ci done = mt76_dma_rx_poll(napi, budget); 32562306a36Sopenharmony_ci mt76_connac_pm_unref(&dev->mphy, &dev->pm); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci return done; 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_poll_rx); 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ciint mt792x_wfsys_reset(struct mt792x_dev *dev) 33262306a36Sopenharmony_ci{ 33362306a36Sopenharmony_ci u32 addr = is_mt7921(&dev->mt76) ? 0x18000140 : 0x7c000140; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci mt76_clear(dev, addr, WFSYS_SW_RST_B); 33662306a36Sopenharmony_ci msleep(50); 33762306a36Sopenharmony_ci mt76_set(dev, addr, WFSYS_SW_RST_B); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci if (!__mt76_poll_msec(&dev->mt76, addr, WFSYS_SW_INIT_DONE, 34062306a36Sopenharmony_ci WFSYS_SW_INIT_DONE, 500)) 34162306a36Sopenharmony_ci return -ETIMEDOUT; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci return 0; 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt792x_wfsys_reset); 34662306a36Sopenharmony_ci 347