Path: blob/main/sys/contrib/dev/mediatek/mt76/mt7915/dma.c
48526 views
// SPDX-License-Identifier: ISC1/* Copyright (C) 2020 MediaTek Inc. */23#include "mt7915.h"4#include "../dma.h"5#include "mac.h"67static int8mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base)9{10struct mt7915_dev *dev = phy->dev;11struct mtk_wed_device *wed = NULL;1213if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {14if (is_mt798x(&dev->mt76))15ring_base += MT_TXQ_ID(0) * MT_RING_SIZE;16else17ring_base = MT_WED_TX_RING_BASE;1819idx -= MT_TXQ_ID(0);20wed = &dev->mt76.mmio.wed;21}2223return mt76_connac_init_tx_queues(phy->mt76, idx, n_desc, ring_base,24wed, MT_WED_Q_TX(idx));25}2627static int mt7915_poll_tx(struct napi_struct *napi, int budget)28{29struct mt7915_dev *dev;3031dev = container_of(napi, struct mt7915_dev, mt76.tx_napi);3233mt76_connac_tx_cleanup(&dev->mt76);34if (napi_complete_done(napi, 0))35mt7915_irq_enable(dev, MT_INT_TX_DONE_MCU);3637return 0;38}3940static void mt7915_dma_config(struct mt7915_dev *dev)41{42#define Q_CONFIG(q, wfdma, int, id) do { \43if (wfdma) \44dev->wfdma_mask |= (1 << (q)); \45dev->q_int_mask[(q)] = int; \46dev->q_id[(q)] = id; \47} while (0)4849#define MCUQ_CONFIG(q, wfdma, int, id) Q_CONFIG(q, (wfdma), (int), (id))50#define RXQ_CONFIG(q, wfdma, int, id) Q_CONFIG(__RXQ(q), (wfdma), (int), (id))51#define TXQ_CONFIG(q, wfdma, int, id) Q_CONFIG(__TXQ(q), (wfdma), (int), (id))5253if (is_mt7915(&dev->mt76)) {54RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0,55MT7915_RXQ_BAND0);56RXQ_CONFIG(MT_RXQ_MCU, WFDMA1, MT_INT_RX_DONE_WM,57MT7915_RXQ_MCU_WM);58RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA1, MT_INT_RX_DONE_WA,59MT7915_RXQ_MCU_WA);60RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1,61MT7915_RXQ_BAND1);62RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA1, MT_INT_RX_DONE_WA_EXT,63MT7915_RXQ_MCU_WA_EXT);64RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA1, MT_INT_RX_DONE_WA_MAIN,65MT7915_RXQ_MCU_WA);66TXQ_CONFIG(0, WFDMA1, MT_INT_TX_DONE_BAND0, MT7915_TXQ_BAND0);67TXQ_CONFIG(1, WFDMA1, MT_INT_TX_DONE_BAND1, MT7915_TXQ_BAND1);68MCUQ_CONFIG(MT_MCUQ_WM, WFDMA1, MT_INT_TX_DONE_MCU_WM,69MT7915_TXQ_MCU_WM);70MCUQ_CONFIG(MT_MCUQ_WA, WFDMA1, MT_INT_TX_DONE_MCU_WA,71MT7915_TXQ_MCU_WA);72MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA1, MT_INT_TX_DONE_FWDL,73MT7915_TXQ_FWDL);74} else {75RXQ_CONFIG(MT_RXQ_MCU, WFDMA0, MT_INT_RX_DONE_WM,76MT7916_RXQ_MCU_WM);77RXQ_CONFIG(MT_RXQ_BAND1_WA, WFDMA0, MT_INT_RX_DONE_WA_EXT_MT7916,78MT7916_RXQ_MCU_WA_EXT);79MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM,80MT7915_TXQ_MCU_WM);81MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA_MT7916,82MT7915_TXQ_MCU_WA);83MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL,84MT7915_TXQ_FWDL);8586if (is_mt7916(&dev->mt76) && mtk_wed_device_active(&dev->mt76.mmio.wed)) {87RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_WED_RX_DONE_BAND0_MT7916,88MT7916_RXQ_BAND0);89RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MT7916,90MT7916_RXQ_MCU_WA);91if (dev->hif2)92RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0,93MT_INT_RX_DONE_BAND1_MT7916,94MT7916_RXQ_BAND1);95else96RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0,97MT_INT_WED_RX_DONE_BAND1_MT7916,98MT7916_RXQ_BAND1);99RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_WED_RX_DONE_WA_MAIN_MT7916,100MT7916_RXQ_MCU_WA_MAIN);101TXQ_CONFIG(0, WFDMA0, MT_INT_WED_TX_DONE_BAND0,102MT7915_TXQ_BAND0);103TXQ_CONFIG(1, WFDMA0, MT_INT_WED_TX_DONE_BAND1,104MT7915_TXQ_BAND1);105} else {106RXQ_CONFIG(MT_RXQ_MAIN, WFDMA0, MT_INT_RX_DONE_BAND0_MT7916,107MT7916_RXQ_BAND0);108RXQ_CONFIG(MT_RXQ_MCU_WA, WFDMA0, MT_INT_RX_DONE_WA,109MT7916_RXQ_MCU_WA);110RXQ_CONFIG(MT_RXQ_BAND1, WFDMA0, MT_INT_RX_DONE_BAND1_MT7916,111MT7916_RXQ_BAND1);112RXQ_CONFIG(MT_RXQ_MAIN_WA, WFDMA0, MT_INT_RX_DONE_WA_MAIN_MT7916,113MT7916_RXQ_MCU_WA_MAIN);114TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,115MT7915_TXQ_BAND0);116TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,117MT7915_TXQ_BAND1);118}119}120}121122static void __mt7915_dma_prefetch(struct mt7915_dev *dev, u32 ofs)123{124#define PREFETCH(_base, _depth) ((_base) << 16 | (_depth))125u32 base = 0;126127/* prefetch SRAM wrapping boundary for tx/rx ring. */128mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_FWDL) + ofs, PREFETCH(0x0, 0x4));129mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WM) + ofs, PREFETCH(0x40, 0x4));130mt76_wr(dev, MT_TXQ_EXT_CTRL(0) + ofs, PREFETCH(0x80, 0x4));131mt76_wr(dev, MT_TXQ_EXT_CTRL(1) + ofs, PREFETCH(0xc0, 0x4));132mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WA) + ofs, PREFETCH(0x100, 0x4));133134mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MCU) + ofs,135PREFETCH(0x140, 0x4));136mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MCU_WA) + ofs,137PREFETCH(0x180, 0x4));138if (!is_mt7915(&dev->mt76)) {139mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MAIN_WA) + ofs,140PREFETCH(0x1c0, 0x4));141base = 0x40;142}143mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1_WA) + ofs,144PREFETCH(0x1c0 + base, 0x4));145mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_MAIN) + ofs,146PREFETCH(0x200 + base, 0x4));147mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1) + ofs,148PREFETCH(0x240 + base, 0x4));149150/* for mt7915, the ring which is next the last151* used ring must be initialized.152*/153if (is_mt7915(&dev->mt76)) {154ofs += 0x4;155mt76_wr(dev, MT_MCUQ_EXT_CTRL(MT_MCUQ_WA) + ofs,156PREFETCH(0x140, 0x0));157mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1_WA) + ofs,158PREFETCH(0x200 + base, 0x0));159mt76_wr(dev, MT_RXQ_BAND1_CTRL(MT_RXQ_BAND1) + ofs,160PREFETCH(0x280 + base, 0x0));161}162}163164void mt7915_dma_prefetch(struct mt7915_dev *dev)165{166__mt7915_dma_prefetch(dev, 0);167if (dev->hif2)168__mt7915_dma_prefetch(dev, MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0));169}170171static void mt7915_dma_disable(struct mt7915_dev *dev, bool rst)172{173struct mt76_dev *mdev = &dev->mt76;174u32 hif1_ofs = 0;175176if (dev->hif2)177hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);178179/* reset */180if (rst) {181mt76_clear(dev, MT_WFDMA0_RST,182MT_WFDMA0_RST_DMASHDL_ALL_RST |183MT_WFDMA0_RST_LOGIC_RST);184185mt76_set(dev, MT_WFDMA0_RST,186MT_WFDMA0_RST_DMASHDL_ALL_RST |187MT_WFDMA0_RST_LOGIC_RST);188189if (is_mt7915(mdev)) {190mt76_clear(dev, MT_WFDMA1_RST,191MT_WFDMA1_RST_DMASHDL_ALL_RST |192MT_WFDMA1_RST_LOGIC_RST);193194mt76_set(dev, MT_WFDMA1_RST,195MT_WFDMA1_RST_DMASHDL_ALL_RST |196MT_WFDMA1_RST_LOGIC_RST);197}198199if (dev->hif2) {200mt76_clear(dev, MT_WFDMA0_RST + hif1_ofs,201MT_WFDMA0_RST_DMASHDL_ALL_RST |202MT_WFDMA0_RST_LOGIC_RST);203204mt76_set(dev, MT_WFDMA0_RST + hif1_ofs,205MT_WFDMA0_RST_DMASHDL_ALL_RST |206MT_WFDMA0_RST_LOGIC_RST);207208if (is_mt7915(mdev)) {209mt76_clear(dev, MT_WFDMA1_RST + hif1_ofs,210MT_WFDMA1_RST_DMASHDL_ALL_RST |211MT_WFDMA1_RST_LOGIC_RST);212213mt76_set(dev, MT_WFDMA1_RST + hif1_ofs,214MT_WFDMA1_RST_DMASHDL_ALL_RST |215MT_WFDMA1_RST_LOGIC_RST);216}217}218}219220/* disable */221mt76_clear(dev, MT_WFDMA0_GLO_CFG,222MT_WFDMA0_GLO_CFG_TX_DMA_EN |223MT_WFDMA0_GLO_CFG_RX_DMA_EN |224MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |225MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |226MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);227228if (is_mt7915(mdev))229mt76_clear(dev, MT_WFDMA1_GLO_CFG,230MT_WFDMA1_GLO_CFG_TX_DMA_EN |231MT_WFDMA1_GLO_CFG_RX_DMA_EN |232MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |233MT_WFDMA1_GLO_CFG_OMIT_RX_INFO |234MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2);235236if (dev->hif2) {237mt76_clear(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,238MT_WFDMA0_GLO_CFG_TX_DMA_EN |239MT_WFDMA0_GLO_CFG_RX_DMA_EN |240MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |241MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |242MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);243244if (is_mt7915(mdev))245mt76_clear(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,246MT_WFDMA1_GLO_CFG_TX_DMA_EN |247MT_WFDMA1_GLO_CFG_RX_DMA_EN |248MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |249MT_WFDMA1_GLO_CFG_OMIT_RX_INFO |250MT_WFDMA1_GLO_CFG_OMIT_RX_INFO_PFET2);251}252}253254int mt7915_dma_start(struct mt7915_dev *dev, bool reset, bool wed_reset)255{256struct mt76_dev *mdev = &dev->mt76;257u32 hif1_ofs = 0;258u32 irq_mask;259260if (dev->hif2)261hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);262263/* enable wpdma tx/rx */264if (!reset) {265mt76_set(dev, MT_WFDMA0_GLO_CFG,266MT_WFDMA0_GLO_CFG_TX_DMA_EN |267MT_WFDMA0_GLO_CFG_RX_DMA_EN |268MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |269MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);270271if (is_mt7915(mdev))272mt76_set(dev, MT_WFDMA1_GLO_CFG,273MT_WFDMA1_GLO_CFG_TX_DMA_EN |274MT_WFDMA1_GLO_CFG_RX_DMA_EN |275MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |276MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);277278if (dev->hif2) {279mt76_set(dev, MT_WFDMA0_GLO_CFG + hif1_ofs,280MT_WFDMA0_GLO_CFG_TX_DMA_EN |281MT_WFDMA0_GLO_CFG_RX_DMA_EN |282MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |283MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);284285if (is_mt7915(mdev))286mt76_set(dev, MT_WFDMA1_GLO_CFG + hif1_ofs,287MT_WFDMA1_GLO_CFG_TX_DMA_EN |288MT_WFDMA1_GLO_CFG_RX_DMA_EN |289MT_WFDMA1_GLO_CFG_OMIT_TX_INFO |290MT_WFDMA1_GLO_CFG_OMIT_RX_INFO);291292mt76_set(dev, MT_WFDMA_HOST_CONFIG,293MT_WFDMA_HOST_CONFIG_PDMA_BAND);294}295}296297/* enable interrupts for TX/RX rings */298irq_mask = MT_INT_RX_DONE_MCU |299MT_INT_TX_DONE_MCU |300MT_INT_MCU_CMD;301302if (!dev->phy.mt76->band_idx)303irq_mask |= MT_INT_BAND0_RX_DONE;304305if (dev->dbdc_support || dev->phy.mt76->band_idx)306irq_mask |= MT_INT_BAND1_RX_DONE;307308if (mtk_wed_device_active(&dev->mt76.mmio.wed) && wed_reset) {309u32 wed_irq_mask = irq_mask;310int ret;311312wed_irq_mask |= MT_INT_TX_DONE_BAND0 | MT_INT_TX_DONE_BAND1;313if (!is_mt798x(&dev->mt76))314mt76_wr(dev, MT_INT_WED_MASK_CSR, wed_irq_mask);315else316mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);317318ret = mt7915_mcu_wed_enable_rx_stats(dev);319if (ret)320return ret;321322mtk_wed_device_start(&dev->mt76.mmio.wed, wed_irq_mask);323}324325irq_mask = reset ? MT_INT_MCU_CMD : irq_mask;326327mt7915_irq_enable(dev, irq_mask);328mt7915_irq_disable(dev, 0);329330return 0;331}332333static int mt7915_dma_enable(struct mt7915_dev *dev, bool reset)334{335struct mt76_dev *mdev = &dev->mt76;336u32 hif1_ofs = 0;337338if (dev->hif2)339hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);340341/* reset dma idx */342mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR, ~0);343if (is_mt7915(mdev))344mt76_wr(dev, MT_WFDMA1_RST_DTX_PTR, ~0);345if (dev->hif2) {346mt76_wr(dev, MT_WFDMA0_RST_DTX_PTR + hif1_ofs, ~0);347if (is_mt7915(mdev))348mt76_wr(dev, MT_WFDMA1_RST_DTX_PTR + hif1_ofs, ~0);349}350351/* configure delay interrupt off */352mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0, 0);353if (is_mt7915(mdev)) {354mt76_wr(dev, MT_WFDMA1_PRI_DLY_INT_CFG0, 0);355} else {356mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG1, 0);357mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG2, 0);358}359360if (dev->hif2) {361mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG0 + hif1_ofs, 0);362if (is_mt7915(mdev)) {363mt76_wr(dev, MT_WFDMA1_PRI_DLY_INT_CFG0 +364hif1_ofs, 0);365} else {366mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG1 +367hif1_ofs, 0);368mt76_wr(dev, MT_WFDMA0_PRI_DLY_INT_CFG2 +369hif1_ofs, 0);370}371}372373/* configure perfetch settings */374mt7915_dma_prefetch(dev);375376/* hif wait WFDMA idle */377mt76_set(dev, MT_WFDMA0_BUSY_ENA,378MT_WFDMA0_BUSY_ENA_TX_FIFO0 |379MT_WFDMA0_BUSY_ENA_TX_FIFO1 |380MT_WFDMA0_BUSY_ENA_RX_FIFO);381382if (is_mt7915(mdev))383mt76_set(dev, MT_WFDMA1_BUSY_ENA,384MT_WFDMA1_BUSY_ENA_TX_FIFO0 |385MT_WFDMA1_BUSY_ENA_TX_FIFO1 |386MT_WFDMA1_BUSY_ENA_RX_FIFO);387388if (dev->hif2) {389mt76_set(dev, MT_WFDMA0_BUSY_ENA + hif1_ofs,390MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO0 |391MT_WFDMA0_PCIE1_BUSY_ENA_TX_FIFO1 |392MT_WFDMA0_PCIE1_BUSY_ENA_RX_FIFO);393394if (is_mt7915(mdev))395mt76_set(dev, MT_WFDMA1_BUSY_ENA + hif1_ofs,396MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO0 |397MT_WFDMA1_PCIE1_BUSY_ENA_TX_FIFO1 |398MT_WFDMA1_PCIE1_BUSY_ENA_RX_FIFO);399}400401mt76_poll(dev, MT_WFDMA_EXT_CSR_HIF_MISC,402MT_WFDMA_EXT_CSR_HIF_MISC_BUSY, 0, 1000);403404return mt7915_dma_start(dev, reset, true);405}406407int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)408{409struct mt76_dev *mdev = &dev->mt76;410u32 wa_rx_base, wa_rx_idx;411u32 hif1_ofs = 0;412int ret;413414mt7915_dma_config(dev);415416mt76_dma_attach(&dev->mt76);417418if (dev->hif2)419hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0);420421mt7915_dma_disable(dev, true);422423if (mtk_wed_device_active(&mdev->mmio.wed)) {424if (!is_mt798x(mdev)) {425u8 wed_control_rx1 = is_mt7915(mdev) ? 1 : 2;426427mt76_set(dev, MT_WFDMA_HOST_CONFIG,428MT_WFDMA_HOST_CONFIG_WED);429mt76_wr(dev, MT_WFDMA_WED_RING_CONTROL,430FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_TX0, 18) |431FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_TX1, 19) |432FIELD_PREP(MT_WFDMA_WED_RING_CONTROL_RX1,433wed_control_rx1));434if (is_mt7915(mdev))435mt76_rmw(dev, MT_WFDMA0_EXT0_CFG, MT_WFDMA0_EXT0_RXWB_KEEP,436MT_WFDMA0_EXT0_RXWB_KEEP);437}438} else {439mt76_clear(dev, MT_WFDMA_HOST_CONFIG, MT_WFDMA_HOST_CONFIG_WED);440}441442/* init tx queue */443ret = mt7915_init_tx_queues(&dev->phy,444MT_TXQ_ID(dev->phy.mt76->band_idx),445MT7915_TX_RING_SIZE,446MT_TXQ_RING_BASE(0));447if (ret)448return ret;449450if (phy2) {451ret = mt7915_init_tx_queues(phy2,452MT_TXQ_ID(phy2->mt76->band_idx),453MT7915_TX_RING_SIZE,454MT_TXQ_RING_BASE(1));455if (ret)456return ret;457}458459/* command to WM */460ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WM,461MT_MCUQ_ID(MT_MCUQ_WM),462MT7915_TX_MCU_RING_SIZE,463MT_MCUQ_RING_BASE(MT_MCUQ_WM));464if (ret)465return ret;466467/* command to WA */468ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_WA,469MT_MCUQ_ID(MT_MCUQ_WA),470MT7915_TX_MCU_RING_SIZE,471MT_MCUQ_RING_BASE(MT_MCUQ_WA));472if (ret)473return ret;474475/* firmware download */476ret = mt76_init_mcu_queue(&dev->mt76, MT_MCUQ_FWDL,477MT_MCUQ_ID(MT_MCUQ_FWDL),478MT7915_TX_FWDL_RING_SIZE,479MT_MCUQ_RING_BASE(MT_MCUQ_FWDL));480if (ret)481return ret;482483/* event from WM */484ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],485MT_RXQ_ID(MT_RXQ_MCU),486MT7915_RX_MCU_RING_SIZE,487MT_RX_BUF_SIZE,488MT_RXQ_RING_BASE(MT_RXQ_MCU));489if (ret)490return ret;491492/* event from WA */493if (mtk_wed_device_active(&mdev->mmio.wed) && is_mt7915(mdev)) {494wa_rx_base = MT_WED_RX_RING_BASE;495wa_rx_idx = MT7915_RXQ_MCU_WA;496mdev->q_rx[MT_RXQ_MCU_WA].flags = MT_WED_Q_TXFREE;497mdev->q_rx[MT_RXQ_MCU_WA].wed = &mdev->mmio.wed;498} else {499wa_rx_base = MT_RXQ_RING_BASE(MT_RXQ_MCU_WA);500wa_rx_idx = MT_RXQ_ID(MT_RXQ_MCU_WA);501}502ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],503wa_rx_idx, MT7915_RX_MCU_RING_SIZE,504MT_RX_BUF_SIZE, wa_rx_base);505if (ret)506return ret;507508/* rx data queue for band0 */509if (!dev->phy.mt76->band_idx) {510if (mtk_wed_device_active(&mdev->mmio.wed) &&511mtk_wed_get_rx_capa(&mdev->mmio.wed)) {512mdev->q_rx[MT_RXQ_MAIN].flags =513MT_WED_Q_RX(MT7915_RXQ_BAND0);514dev->mt76.rx_token_size += MT7915_RX_RING_SIZE;515mdev->q_rx[MT_RXQ_MAIN].wed = &mdev->mmio.wed;516}517518ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN],519MT_RXQ_ID(MT_RXQ_MAIN),520MT7915_RX_RING_SIZE,521MT_RX_BUF_SIZE,522MT_RXQ_RING_BASE(MT_RXQ_MAIN));523if (ret)524return ret;525}526527/* tx free notify event from WA for band0 */528if (!is_mt7915(mdev)) {529wa_rx_base = MT_RXQ_RING_BASE(MT_RXQ_MAIN_WA);530wa_rx_idx = MT_RXQ_ID(MT_RXQ_MAIN_WA);531532if (mtk_wed_device_active(&mdev->mmio.wed)) {533mdev->q_rx[MT_RXQ_MAIN_WA].flags = MT_WED_Q_TXFREE;534mdev->q_rx[MT_RXQ_MAIN_WA].wed = &mdev->mmio.wed;535if (is_mt7916(mdev)) {536wa_rx_base = MT_WED_RX_RING_BASE;537wa_rx_idx = MT7915_RXQ_MCU_WA;538}539}540541ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MAIN_WA],542wa_rx_idx, MT7915_RX_MCU_RING_SIZE,543MT_RX_BUF_SIZE, wa_rx_base);544if (ret)545return ret;546}547548if (dev->dbdc_support || dev->phy.mt76->band_idx) {549if (mtk_wed_device_active(&mdev->mmio.wed) &&550mtk_wed_get_rx_capa(&mdev->mmio.wed)) {551mdev->q_rx[MT_RXQ_BAND1].flags =552MT_WED_Q_RX(MT7915_RXQ_BAND1);553dev->mt76.rx_token_size += MT7915_RX_RING_SIZE;554mdev->q_rx[MT_RXQ_BAND1].wed = &mdev->mmio.wed;555}556557/* rx data queue for band1 */558ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1],559MT_RXQ_ID(MT_RXQ_BAND1),560MT7915_RX_RING_SIZE,561MT_RX_BUF_SIZE,562MT_RXQ_RING_BASE(MT_RXQ_BAND1) + hif1_ofs);563if (ret)564return ret;565566/* tx free notify event from WA for band1 */567ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_BAND1_WA],568MT_RXQ_ID(MT_RXQ_BAND1_WA),569MT7915_RX_MCU_RING_SIZE,570MT_RX_BUF_SIZE,571MT_RXQ_RING_BASE(MT_RXQ_BAND1_WA) + hif1_ofs);572if (ret)573return ret;574}575576ret = mt76_init_queues(dev, mt76_dma_rx_poll);577if (ret < 0)578return ret;579580netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,581mt7915_poll_tx);582napi_enable(&dev->mt76.tx_napi);583584mt7915_dma_enable(dev, false);585586return 0;587}588589int mt7915_dma_reset(struct mt7915_dev *dev, bool force)590{591struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1];592struct mtk_wed_device *wed = &dev->mt76.mmio.wed;593int i;594595/* clean up hw queues */596for (i = 0; i < ARRAY_SIZE(dev->mt76.phy.q_tx); i++) {597mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[i], true);598if (mphy_ext)599mt76_queue_tx_cleanup(dev, mphy_ext->q_tx[i], true);600}601602for (i = 0; i < ARRAY_SIZE(dev->mt76.q_mcu); i++)603mt76_queue_tx_cleanup(dev, dev->mt76.q_mcu[i], true);604605mt76_for_each_q_rx(&dev->mt76, i)606mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);607608/* reset wfsys */609if (force)610mt7915_wfsys_reset(dev);611612if (mtk_wed_device_active(wed))613mtk_wed_device_dma_reset(wed);614615mt7915_dma_disable(dev, force);616mt76_wed_dma_reset(&dev->mt76);617618/* reset hw queues */619for (i = 0; i < __MT_TXQ_MAX; i++) {620mt76_dma_reset_tx_queue(&dev->mt76, dev->mphy.q_tx[i]);621if (mphy_ext)622mt76_dma_reset_tx_queue(&dev->mt76, mphy_ext->q_tx[i]);623}624625for (i = 0; i < __MT_MCUQ_MAX; i++)626mt76_queue_reset(dev, dev->mt76.q_mcu[i]);627628mt76_for_each_q_rx(&dev->mt76, i) {629if (mt76_queue_is_wed_tx_free(&dev->mt76.q_rx[i]))630continue;631632mt76_queue_reset(dev, &dev->mt76.q_rx[i]);633}634635mt76_tx_status_check(&dev->mt76, true);636637mt76_for_each_q_rx(&dev->mt76, i)638mt76_queue_rx_reset(dev, i);639640if (mtk_wed_device_active(wed) && is_mt7915(&dev->mt76))641mt76_rmw(dev, MT_WFDMA0_EXT0_CFG, MT_WFDMA0_EXT0_RXWB_KEEP,642MT_WFDMA0_EXT0_RXWB_KEEP);643644mt7915_dma_enable(dev, !force);645646return 0;647}648649void mt7915_dma_cleanup(struct mt7915_dev *dev)650{651mt7915_dma_disable(dev, true);652653mt76_dma_cleanup(&dev->mt76);654}655656657