summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt7921/dma.c')
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7921/dma.c156
1 files changed, 2 insertions, 154 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
index 1ac66526eb02..fdc598e099f6 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/dma.c
@@ -5,158 +5,6 @@
#include "../dma.h"
#include "../mt76_connac2_mac.h"
-static int mt7921_poll_tx(struct napi_struct *napi, int budget)
-{
- struct mt792x_dev *dev;
-
- dev = container_of(napi, struct mt792x_dev, mt76.tx_napi);
-
- if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
- napi_complete(napi);
- queue_work(dev->mt76.wq, &dev->pm.wake_work);
- return 0;
- }
-
- mt76_connac_tx_cleanup(&dev->mt76);
- if (napi_complete(napi))
- mt76_connac_irq_enable(&dev->mt76,
- dev->irq_map->tx.all_complete_mask);
- mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-
- return 0;
-}
-
-static void mt7921_dma_prefetch(struct mt792x_dev *dev)
-{
-#define PREFETCH(base, depth) ((base) << 16 | (depth))
-
- mt76_wr(dev, MT_WFDMA0_RX_RING0_EXT_CTRL, PREFETCH(0x0, 0x4));
- mt76_wr(dev, MT_WFDMA0_RX_RING2_EXT_CTRL, PREFETCH(0x40, 0x4));
- mt76_wr(dev, MT_WFDMA0_RX_RING3_EXT_CTRL, PREFETCH(0x80, 0x4));
- mt76_wr(dev, MT_WFDMA0_RX_RING4_EXT_CTRL, PREFETCH(0xc0, 0x4));
- mt76_wr(dev, MT_WFDMA0_RX_RING5_EXT_CTRL, PREFETCH(0x100, 0x4));
-
- mt76_wr(dev, MT_WFDMA0_TX_RING0_EXT_CTRL, PREFETCH(0x140, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING1_EXT_CTRL, PREFETCH(0x180, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING2_EXT_CTRL, PREFETCH(0x1c0, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING3_EXT_CTRL, PREFETCH(0x200, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING4_EXT_CTRL, PREFETCH(0x240, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING5_EXT_CTRL, PREFETCH(0x280, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING6_EXT_CTRL, PREFETCH(0x2c0, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING16_EXT_CTRL, PREFETCH(0x340, 0x4));
- mt76_wr(dev, MT_WFDMA0_TX_RING17_EXT_CTRL, PREFETCH(0x380, 0x4));
-}
-
-static int mt7921_dma_enable(struct mt792x_dev *dev)
-{
- /* configure perfetch settings */
- mt7921_dma_prefetch(dev);
-
- /* reset dma idx */
- mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR, ~0);
-
- /* configure delay interrupt */
- mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0, 0);
-
- mt76_set(dev, MT_WFDMA0_GLO_CFG,
- MT_WFDMA0_GLO_CFG_TX_WB_DDONE |
- MT_WFDMA0_GLO_CFG_FIFO_LITTLE_ENDIAN |
- MT_WFDMA0_GLO_CFG_CLK_GAT_DIS |
- MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
- MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
- MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
-
- mt76_set(dev, MT_WFDMA0_GLO_CFG,
- MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN);
-
- mt76_set(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
-
- /* enable interrupts for TX/RX rings */
- mt76_connac_irq_enable(&dev->mt76,
- dev->irq_map->tx.all_complete_mask |
- MT_INT_RX_DONE_ALL | MT_INT_MCU_CMD);
- mt76_set(dev, MT_MCU2HOST_SW_INT_ENA, MT_MCU_CMD_WAKE_RX_PCIE);
-
- return 0;
-}
-
-static int mt7921_dma_reset(struct mt792x_dev *dev, bool force)
-{
- int i, err;
-
- err = mt792x_dma_disable(dev, force);
- if (err)
- return err;
-
- /* reset hw queues */
- for (i = 0; i < __MT_TXQ_MAX; i++)
- mt76_queue_reset(dev, dev->mphy.q_tx[i]);
-
- for (i = 0; i < __MT_MCUQ_MAX; i++)
- mt76_queue_reset(dev, dev->mt76.q_mcu[i]);
-
- mt76_for_each_q_rx(&dev->mt76, i)
- mt76_queue_reset(dev, &dev->mt76.q_rx[i]);
-
- mt76_tx_status_check(&dev->mt76, true);
-
- return mt7921_dma_enable(dev);
-}
-
-int mt7921_wpdma_reset(struct mt792x_dev *dev, bool force)
-{
- int i, err;
-
- /* clean up hw queues */
- for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++)
- mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);
-
- for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++)
- mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);
-
- mt76_for_each_q_rx(&dev->mt76, i)
- mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);
-
- if (force) {
- err = mt792x_wfsys_reset(dev, MT_WFSYS_SW_RST_B);
- if (err)
- return err;
- }
- err = mt7921_dma_reset(dev, force);
- if (err)
- return err;
-
- mt76_for_each_q_rx(&dev->mt76, i)
- mt76_queue_rx_reset(dev, i);
-
- return 0;
-}
-
-int mt7921_wpdma_reinit_cond(struct mt792x_dev *dev)
-{
- struct mt76_connac_pm *pm = &dev->pm;
- int err;
-
- /* check if the wpdma must be reinitialized */
- if (mt792x_dma_need_reinit(dev)) {
- /* disable interrutpts */
- mt76_wr(dev, dev->irq_map->host_irq_enable, 0);
- mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
-
- err = mt7921_wpdma_reset(dev, false);
- if (err) {
- dev_err(dev->mt76.dev, "wpdma reset failed\n");
- return err;
- }
-
- /* enable interrutpts */
- mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
- pm->stats.lp_wake++;
- }
-
- return 0;
-}
-
int mt7921_dma_init(struct mt792x_dev *dev)
{
int ret;
@@ -216,8 +64,8 @@ int mt7921_dma_init(struct mt792x_dev *dev)
return ret;
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
- mt7921_poll_tx);
+ mt792x_poll_tx);
napi_enable(&dev->mt76.tx_napi);
- return mt7921_dma_enable(dev);
+ return mt792x_dma_enable(dev);
}