wifi: mt76: mt7921: move dma shared code in mt792x-lib module
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 28 Jun 2023 07:05:59 +0000 (15:05 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 26 Jul 2023 09:36:12 +0000 (11:36 +0200)
Reduce duplicated code moving dma shared code in mt792x-lib module.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/dma.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7921/regs.h
drivers/net/wireless/mediatek/mt76/mt7921/usb.c
drivers/net/wireless/mediatek/mt76/mt792x.h
drivers/net/wireless/mediatek/mt76/mt792x_core.c
drivers/net/wireless/mediatek/mt76/mt792x_regs.h

index 3c62896..9dcda35 100644 (file)
@@ -25,24 +25,6 @@ static int mt7921_poll_tx(struct napi_struct *napi, int budget)
        return 0;
 }
 
-static int mt7921_poll_rx(struct napi_struct *napi, int budget)
-{
-       struct mt792x_dev *dev;
-       int done;
-
-       dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev);
-
-       if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
-               napi_complete(napi);
-               queue_work(dev->mt76.wq, &dev->pm.wake_work);
-               return 0;
-       }
-       done = mt76_dma_rx_poll(napi, budget);
-       mt76_connac_pm_unref(&dev->mphy, &dev->pm);
-
-       return done;
-}
-
 static void mt7921_dma_prefetch(struct mt792x_dev *dev)
 {
 #define PREFETCH(base, depth)  ((base) << 16 | (depth))
@@ -64,40 +46,6 @@ static void mt7921_dma_prefetch(struct mt792x_dev *dev)
        mt76_wr(dev, MT_WFDMA0_TX_RING17_EXT_CTRL, PREFETCH(0x380, 0x4));
 }
 
-static int mt7921_dma_disable(struct mt792x_dev *dev, bool force)
-{
-       /* disable WFDMA0 */
-       mt76_clear(dev, MT_WFDMA0_GLO_CFG,
-                  MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN |
-                  MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
-                  MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
-                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
-                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
-
-       if (!mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
-                                MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
-                                MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1))
-               return -ETIMEDOUT;
-
-       /* disable dmashdl */
-       mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0,
-                  MT_WFDMA0_CSR_TX_DMASHDL_ENABLE);
-       mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS);
-
-       if (force) {
-               /* reset */
-               mt76_clear(dev, MT_WFDMA0_RST,
-                          MT_WFDMA0_RST_DMASHDL_ALL_RST |
-                          MT_WFDMA0_RST_LOGIC_RST);
-
-               mt76_set(dev, MT_WFDMA0_RST,
-                        MT_WFDMA0_RST_DMASHDL_ALL_RST |
-                        MT_WFDMA0_RST_LOGIC_RST);
-       }
-
-       return 0;
-}
-
 static int mt7921_dma_enable(struct mt792x_dev *dev)
 {
        /* configure perfetch settings */
@@ -135,7 +83,7 @@ static int mt7921_dma_reset(struct mt792x_dev *dev, bool force)
 {
        int i, err;
 
-       err = mt7921_dma_disable(dev, force);
+       err = mt792x_dma_disable(dev, force);
        if (err)
                return err;
 
@@ -154,19 +102,6 @@ static int mt7921_dma_reset(struct mt792x_dev *dev, bool force)
        return mt7921_dma_enable(dev);
 }
 
-int mt7921_wfsys_reset(struct mt792x_dev *dev)
-{
-       mt76_clear(dev, MT_WFSYS_SW_RST_B, WFSYS_SW_RST_B);
-       msleep(50);
-       mt76_set(dev, MT_WFSYS_SW_RST_B, WFSYS_SW_RST_B);
-
-       if (!__mt76_poll_msec(&dev->mt76, MT_WFSYS_SW_RST_B,
-                             WFSYS_SW_INIT_DONE, WFSYS_SW_INIT_DONE, 500))
-               return -ETIMEDOUT;
-
-       return 0;
-}
-
 int mt7921_wpdma_reset(struct mt792x_dev *dev, bool force)
 {
        int i, err;
@@ -182,7 +117,7 @@ int mt7921_wpdma_reset(struct mt792x_dev *dev, bool force)
                mt76_queue_rx_cleanup(dev, &dev->mt76.q_rx[i]);
 
        if (force) {
-               err = mt7921_wfsys_reset(dev);
+               err = mt792x_wfsys_reset(dev, MT_WFSYS_SW_RST_B);
                if (err)
                        return err;
        }
@@ -202,7 +137,7 @@ int mt7921_wpdma_reinit_cond(struct mt792x_dev *dev)
        int err;
 
        /* check if the wpdma must be reinitialized */
-       if (mt7921_dma_need_reinit(dev)) {
+       if (mt792x_dma_need_reinit(dev)) {
                /* disable interrutpts */
                mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 0);
                mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
@@ -227,7 +162,7 @@ int mt7921_dma_init(struct mt792x_dev *dev)
 
        mt76_dma_attach(&dev->mt76);
 
-       ret = mt7921_dma_disable(dev, true);
+       ret = mt792x_dma_disable(dev, true);
        if (ret)
                return ret;
 
@@ -275,7 +210,7 @@ int mt7921_dma_init(struct mt792x_dev *dev)
        if (ret)
                return ret;
 
-       ret = mt76_init_queues(dev, mt7921_poll_rx);
+       ret = mt76_init_queues(dev, mt792x_poll_rx);
        if (ret < 0)
                return ret;
 
@@ -285,30 +220,3 @@ int mt7921_dma_init(struct mt792x_dev *dev)
 
        return mt7921_dma_enable(dev);
 }
-
-void mt7921_dma_cleanup(struct mt792x_dev *dev)
-{
-       /* disable */
-       mt76_clear(dev, MT_WFDMA0_GLO_CFG,
-                  MT_WFDMA0_GLO_CFG_TX_DMA_EN |
-                  MT_WFDMA0_GLO_CFG_RX_DMA_EN |
-                  MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
-                  MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
-                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
-                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
-
-       mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
-                           MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
-                           MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1);
-
-       /* reset */
-       mt76_clear(dev, MT_WFDMA0_RST,
-                  MT_WFDMA0_RST_DMASHDL_ALL_RST |
-                  MT_WFDMA0_RST_LOGIC_RST);
-
-       mt76_set(dev, MT_WFDMA0_RST,
-                MT_WFDMA0_RST_DMASHDL_ALL_RST |
-                MT_WFDMA0_RST_LOGIC_RST);
-
-       mt76_dma_cleanup(&dev->mt76);
-}
index 31fa51b..b8699c9 100644 (file)
@@ -208,7 +208,6 @@ void mt7921_unregister_device(struct mt792x_dev *dev);
 int mt7921_dma_init(struct mt792x_dev *dev);
 int mt7921_wpdma_reset(struct mt792x_dev *dev, bool force);
 int mt7921_wpdma_reinit_cond(struct mt792x_dev *dev);
-void mt7921_dma_cleanup(struct mt792x_dev *dev);
 int mt7921_run_firmware(struct mt792x_dev *dev);
 int mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
                          bool enable);
@@ -262,11 +261,6 @@ mt7921_l1_rmw(struct mt792x_dev *dev, u32 addr, u32 mask, u32 val)
 #define mt7921_l1_set(dev, addr, val)  mt7921_l1_rmw(dev, addr, 0, val)
 #define mt7921_l1_clear(dev, addr, val)        mt7921_l1_rmw(dev, addr, val, 0)
 
-static inline bool mt7921_dma_need_reinit(struct mt792x_dev *dev)
-{
-       return !mt76_get_field(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
-}
-
 static inline void
 mt7921_skb_add_usb_sdio_hdr(struct mt792x_dev *dev, struct sk_buff *skb,
                            int type)
@@ -319,7 +313,6 @@ int mt7921_mcu_fw_pmctrl(struct mt792x_dev *dev);
 void mt7921_pm_wake_work(struct work_struct *work);
 void mt7921_pm_power_save_work(struct work_struct *work);
 void mt7921_coredump_work(struct work_struct *work);
-int mt7921_wfsys_reset(struct mt792x_dev *dev);
 int mt7921_get_txpwr_info(struct mt792x_dev *dev, struct mt7921_txpwr *txpwr);
 int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        void *data, int len);
index 67eaa62..4d929cf 100644 (file)
@@ -117,8 +117,8 @@ static void mt7921e_unregister_device(struct mt792x_dev *dev)
 
        mt76_connac2_tx_token_put(&dev->mt76);
        __mt7921_mcu_drv_pmctrl(dev);
-       mt7921_dma_cleanup(dev);
-       mt7921_wfsys_reset(dev);
+       mt792x_dma_cleanup(dev);
+       mt792x_wfsys_reset(dev, MT_WFSYS_SW_RST_B);
        skb_queue_purge(&dev->mt76.mcu.res_q);
 
        tasklet_disable(&dev->mt76.irq_tasklet);
@@ -337,7 +337,7 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
                    (mt7921_l1_rr(dev, MT_HW_REV) & 0xff);
        dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
 
-       ret = mt7921_wfsys_reset(dev);
+       ret = mt792x_wfsys_reset(dev, MT_WFSYS_SW_RST_B);
        if (ret)
                goto err_free_dev;
 
index c5ca1b9..083d655 100644 (file)
@@ -87,8 +87,6 @@
 #define MT_HIF_REMAP_BASE_L1           0x40000
 
 #define MT_WFSYS_SW_RST_B              0x18000140
-#define WFSYS_SW_RST_B                 BIT(0)
-#define WFSYS_SW_INIT_DONE             BIT(4)
 
 #define MT_WTBLON_TOP_WDUCR            MT_WTBLON_TOP(0x200)
 #define MT_WTBLON_TOP_WDUCR_GROUP      GENMASK(2, 0)
index 3bf902c..c7368cf 100644 (file)
@@ -349,7 +349,7 @@ static int mt7921u_resume(struct usb_interface *intf)
                msleep(20);
        }
 
-       if (reinit || mt7921_dma_need_reinit(dev)) {
+       if (reinit || mt792x_dma_need_reinit(dev)) {
                err = mt7921u_dma_init(dev, true);
                if (err)
                        goto failed;
index f0f9fb3..fa199cc 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/ktime.h>
 
 #include "mt76_connac_mcu.h"
+#include "mt792x_regs.h"
 
 #define MT792x_MAX_INTERFACES  4
 #define MT792x_WTBL_SIZE       20
@@ -169,6 +170,11 @@ mt792x_get_status_freq_info(struct mt76_rx_status *status, u8 chfreq)
        status->freq = ieee80211_channel_to_frequency(chfreq, status->band);
 }
 
+static inline bool mt792x_dma_need_reinit(struct mt792x_dev *dev)
+{
+       return !mt76_get_field(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
+}
+
 #define mt792x_mutex_acquire(dev)      \
        mt76_connac_mutex_acquire(&(dev)->mt76, &(dev)->pm)
 #define mt792x_mutex_release(dev)      \
@@ -219,5 +225,9 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw,
                           struct ieee80211_sta *sta,
                           struct station_info *sinfo);
 void mt792x_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class);
+void mt792x_dma_cleanup(struct mt792x_dev *dev);
+int mt792x_dma_disable(struct mt792x_dev *dev, bool force);
+int mt792x_poll_rx(struct napi_struct *napi, int budget);
+int mt792x_wfsys_reset(struct mt792x_dev *dev, u32 addr);
 
 #endif /* __MT7925_H */
index fa648b1..b176ce5 100644 (file)
@@ -4,7 +4,7 @@
 #include <linux/module.h>
 
 #include "mt792x.h"
-#include "mt792x_regs.h"
+#include "dma.h"
 
 void mt792x_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
               struct sk_buff *skb)
@@ -465,5 +465,101 @@ void mt792x_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class)
 }
 EXPORT_SYMBOL_GPL(mt792x_set_coverage_class);
 
+int mt792x_dma_disable(struct mt792x_dev *dev, bool force)
+{
+       /* disable WFDMA0 */
+       mt76_clear(dev, MT_WFDMA0_GLO_CFG,
+                  MT_WFDMA0_GLO_CFG_TX_DMA_EN | MT_WFDMA0_GLO_CFG_RX_DMA_EN |
+                  MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
+                  MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
+                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
+                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
+
+       if (!mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
+                                MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
+                                MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1))
+               return -ETIMEDOUT;
+
+       /* disable dmashdl */
+       mt76_clear(dev, MT_WFDMA0_GLO_CFG_EXT0,
+                  MT_WFDMA0_CSR_TX_DMASHDL_ENABLE);
+       mt76_set(dev, MT_DMASHDL_SW_CONTROL, MT_DMASHDL_DMASHDL_BYPASS);
+
+       if (force) {
+               /* reset */
+               mt76_clear(dev, MT_WFDMA0_RST,
+                          MT_WFDMA0_RST_DMASHDL_ALL_RST |
+                          MT_WFDMA0_RST_LOGIC_RST);
+
+               mt76_set(dev, MT_WFDMA0_RST,
+                        MT_WFDMA0_RST_DMASHDL_ALL_RST |
+                        MT_WFDMA0_RST_LOGIC_RST);
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(mt792x_dma_disable);
+
+void mt792x_dma_cleanup(struct mt792x_dev *dev)
+{
+       /* disable */
+       mt76_clear(dev, MT_WFDMA0_GLO_CFG,
+                  MT_WFDMA0_GLO_CFG_TX_DMA_EN |
+                  MT_WFDMA0_GLO_CFG_RX_DMA_EN |
+                  MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN |
+                  MT_WFDMA0_GLO_CFG_OMIT_TX_INFO |
+                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO |
+                  MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2);
+
+       mt76_poll_msec_tick(dev, MT_WFDMA0_GLO_CFG,
+                           MT_WFDMA0_GLO_CFG_TX_DMA_BUSY |
+                           MT_WFDMA0_GLO_CFG_RX_DMA_BUSY, 0, 100, 1);
+
+       /* reset */
+       mt76_clear(dev, MT_WFDMA0_RST,
+                  MT_WFDMA0_RST_DMASHDL_ALL_RST |
+                  MT_WFDMA0_RST_LOGIC_RST);
+
+       mt76_set(dev, MT_WFDMA0_RST,
+                MT_WFDMA0_RST_DMASHDL_ALL_RST |
+                MT_WFDMA0_RST_LOGIC_RST);
+
+       mt76_dma_cleanup(&dev->mt76);
+}
+EXPORT_SYMBOL_GPL(mt792x_dma_cleanup);
+
+int mt792x_poll_rx(struct napi_struct *napi, int budget)
+{
+       struct mt792x_dev *dev;
+       int done;
+
+       dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev);
+
+       if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
+               napi_complete(napi);
+               queue_work(dev->mt76.wq, &dev->pm.wake_work);
+               return 0;
+       }
+       done = mt76_dma_rx_poll(napi, budget);
+       mt76_connac_pm_unref(&dev->mphy, &dev->pm);
+
+       return done;
+}
+EXPORT_SYMBOL_GPL(mt792x_poll_rx);
+
+int mt792x_wfsys_reset(struct mt792x_dev *dev, u32 addr)
+{
+       mt76_clear(dev, addr, WFSYS_SW_RST_B);
+       msleep(50);
+       mt76_set(dev, addr, WFSYS_SW_RST_B);
+
+       if (!__mt76_poll_msec(&dev->mt76, addr, WFSYS_SW_INIT_DONE,
+                             WFSYS_SW_INIT_DONE, 500))
+               return -ETIMEDOUT;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(mt792x_wfsys_reset);
+
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
index 5f2407f..9c6308e 100644 (file)
 #define MT_WF_SW_SER_TRIGGER_SUSPEND   BIT(6)
 #define MT_WF_SW_SER_DONE_SUSPEND      BIT(7)
 
+#define WFSYS_SW_RST_B                 BIT(0)
+#define WFSYS_SW_INIT_DONE             BIT(4)
+
 #endif /* __MT792X_REGS_H */