wifi: rtw89: update DMA function with different generation
authorChin-Yen Lee <timlee@realtek.com>
Sat, 2 Mar 2024 00:58:24 +0000 (08:58 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 5 Mar 2024 18:56:42 +0000 (20:56 +0200)
The register of control and polling function for TX/RX DMA is different
from different generation, so update them. Also rename polling_dma
function to polling_dma_idle to avoid misunderstanding.

Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240302005828.13666-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/pci.c
drivers/net/wireless/realtek/rtw89/pci.h
drivers/net/wireless/realtek/rtw89/pci_be.c
drivers/net/wireless/realtek/rtw89/wow.c

index fb590f51f4f1d4705124af500b482e6080414fb4..2e854c9af70998e1e5ced0bb8c526bf86e867a41 100644 (file)
@@ -3202,7 +3202,7 @@ struct rtw89_hci_ops {
        void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable);
        void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable);
        void (*ctrl_trxhci)(struct rtw89_dev *rtwdev, bool enable);
-       int (*poll_txdma_ch)(struct rtw89_dev *rtwdev);
+       int (*poll_txdma_ch_idle)(struct rtw89_dev *rtwdev);
        void (*clr_idx_all)(struct rtw89_dev *rtwdev);
        void (*clear)(struct rtw89_dev *rtwdev, struct pci_dev *pdev);
        void (*disable_intr)(struct rtw89_dev *rtwdev);
@@ -5253,12 +5253,12 @@ static inline void rtw89_hci_ctrl_trxhci(struct rtw89_dev *rtwdev, bool enable)
                rtwdev->hci.ops->ctrl_trxhci(rtwdev, enable);
 }
 
-static inline int rtw89_hci_poll_txdma_ch(struct rtw89_dev *rtwdev)
+static inline int rtw89_hci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
 {
        int ret = 0;
 
-       if (rtwdev->hci.ops->poll_txdma_ch)
-               ret = rtwdev->hci.ops->poll_txdma_ch(rtwdev);
+       if (rtwdev->hci.ops->poll_txdma_ch_idle)
+               ret = rtwdev->hci.ops->poll_txdma_ch_idle(rtwdev);
        return ret;
 }
 
index d4c8799d6f2ebda0e423be4aace5575d16ba2013..19001130ad9436723adf1ecccd6f7ff02cfa5aff 100644 (file)
@@ -218,7 +218,7 @@ int rtw89_pci_sync_skb_for_device_and_validate_rx_info(struct rtw89_dev *rtwdev,
        return ret;
 }
 
-static void rtw89_pci_ctrl_txdma_ch_pcie(struct rtw89_dev *rtwdev, bool enable)
+static void rtw89_pci_ctrl_txdma_ch_ax(struct rtw89_dev *rtwdev, bool enable)
 {
        const struct rtw89_pci_info *info = rtwdev->pci_info;
        const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1;
@@ -235,7 +235,7 @@ static void rtw89_pci_ctrl_txdma_ch_pcie(struct rtw89_dev *rtwdev, bool enable)
        }
 }
 
-static void rtw89_pci_ctrl_txdma_fw_ch_pcie(struct rtw89_dev *rtwdev, bool enable)
+static void rtw89_pci_ctrl_txdma_fw_ch_ax(struct rtw89_dev *rtwdev, bool enable)
 {
        const struct rtw89_pci_info *info = rtwdev->pci_info;
        const struct rtw89_reg_def *dma_stop1 = &info->dma_stop1;
@@ -2524,7 +2524,7 @@ static void rtw89_pci_clr_idx_all_ax(struct rtw89_dev *rtwdev)
                          B_AX_CLR_RXQ_IDX | B_AX_CLR_RPQ_IDX);
 }
 
-static int rtw89_poll_txdma_ch_idle_pcie(struct rtw89_dev *rtwdev)
+static int rtw89_pci_poll_txdma_ch_idle_ax(struct rtw89_dev *rtwdev)
 {
        const struct rtw89_pci_info *info = rtwdev->pci_info;
        u32 ret, check, dma_busy;
@@ -2551,7 +2551,7 @@ static int rtw89_poll_txdma_ch_idle_pcie(struct rtw89_dev *rtwdev)
        return 0;
 }
 
-static int rtw89_poll_rxdma_ch_idle_pcie(struct rtw89_dev *rtwdev)
+static int rtw89_pci_poll_rxdma_ch_idle_ax(struct rtw89_dev *rtwdev)
 {
        const struct rtw89_pci_info *info = rtwdev->pci_info;
        u32 ret, check, dma_busy;
@@ -2571,13 +2571,13 @@ static int rtw89_pci_poll_dma_all_idle(struct rtw89_dev *rtwdev)
 {
        u32 ret;
 
-       ret = rtw89_poll_txdma_ch_idle_pcie(rtwdev);
+       ret = rtw89_pci_poll_txdma_ch_idle_ax(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "txdma ch busy\n");
                return ret;
        }
 
-       ret = rtw89_poll_rxdma_ch_idle_pcie(rtwdev);
+       ret = rtw89_pci_poll_rxdma_ch_idle_ax(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "rxdma ch busy\n");
                return ret;
@@ -2756,8 +2756,8 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)
        }
 
        /* disable all channels except to FW CMD channel to download firmware */
-       rtw89_pci_ctrl_txdma_ch_pcie(rtwdev, false);
-       rtw89_pci_ctrl_txdma_fw_ch_pcie(rtwdev, true);
+       rtw89_pci_ctrl_txdma_ch_ax(rtwdev, false);
+       rtw89_pci_ctrl_txdma_fw_ch_ax(rtwdev, true);
 
        /* start DMA activities */
        rtw89_pci_ctrl_dma_all(rtwdev, true);
@@ -2870,7 +2870,7 @@ static int rtw89_pci_ops_mac_post_init_ax(struct rtw89_dev *rtwdev)
        }
 
        /* enable DMA for all queues */
-       rtw89_pci_ctrl_txdma_ch_pcie(rtwdev, true);
+       rtw89_pci_ctrl_txdma_ch_ax(rtwdev, true);
 
        /* Release PCI IO */
        rtw89_write32_clr(rtwdev, info->dma_stop1.addr,
@@ -4093,6 +4093,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
        .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_ax,
        .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_ax,
 
+       .ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_ax,
+       .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_ax,
+       .poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle_ax,
+
        .aspm_set = rtw89_pci_aspm_set_ax,
        .clkreq_set = rtw89_pci_clkreq_set_ax,
        .l1ss_set = rtw89_pci_l1ss_set_ax,
@@ -4130,10 +4134,11 @@ static const struct rtw89_hci_ops rtw89_pci_ops = {
        .recovery_start = rtw89_pci_ops_recovery_start,
        .recovery_complete = rtw89_pci_ops_recovery_complete,
 
-       .ctrl_txdma_ch  = rtw89_pci_ctrl_txdma_ch_pcie,
-       .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_pcie,
+       .ctrl_txdma_ch  = rtw89_pci_ctrl_txdma_ch,
+       .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch,
        .ctrl_trxhci    = rtw89_pci_ctrl_dma_trx,
-       .poll_txdma_ch  = rtw89_poll_txdma_ch_idle_pcie,
+       .poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle,
+
        .clr_idx_all    = rtw89_pci_clr_idx_all,
        .clear          = rtw89_pci_clear_resource,
        .disable_intr   = rtw89_pci_disable_intr_lock,
index c1954cb120300e46d5aaa8f3bc0c41ab05097f06..4a817dd9822e952f6372ab7620dd6e227cb65e5b 100644 (file)
@@ -1243,6 +1243,10 @@ struct rtw89_pci_gen_def {
        int (*lv1rst_stop_dma)(struct rtw89_dev *rtwdev);
        int (*lv1rst_start_dma)(struct rtw89_dev *rtwdev);
 
+       void (*ctrl_txdma_ch)(struct rtw89_dev *rtwdev, bool enable);
+       void (*ctrl_txdma_fw_ch)(struct rtw89_dev *rtwdev, bool enable);
+       int (*poll_txdma_ch_idle)(struct rtw89_dev *rtwdev);
+
        void (*aspm_set)(struct rtw89_dev *rtwdev, bool enable);
        void (*clkreq_set)(struct rtw89_dev *rtwdev, bool enable);
        void (*l1ss_set)(struct rtw89_dev *rtwdev, bool enable);
@@ -1709,4 +1713,27 @@ static inline int rtw89_pci_reset_bdram(struct rtw89_dev *rtwdev)
        return gen_def->rst_bdram(rtwdev);
 }
 
+static inline void rtw89_pci_ctrl_txdma_ch(struct rtw89_dev *rtwdev, bool enable)
+{
+       const struct rtw89_pci_info *info = rtwdev->pci_info;
+       const struct rtw89_pci_gen_def *gen_def = info->gen_def;
+
+       return gen_def->ctrl_txdma_ch(rtwdev, enable);
+}
+
+static inline void rtw89_pci_ctrl_txdma_fw_ch(struct rtw89_dev *rtwdev, bool enable)
+{
+       const struct rtw89_pci_info *info = rtwdev->pci_info;
+       const struct rtw89_pci_gen_def *gen_def = info->gen_def;
+
+       return gen_def->ctrl_txdma_fw_ch(rtwdev, enable);
+}
+
+static inline int rtw89_pci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
+{
+       const struct rtw89_pci_info *info = rtwdev->pci_info;
+       const struct rtw89_pci_gen_def *gen_def = info->gen_def;
+
+       return gen_def->poll_txdma_ch_idle(rtwdev);
+}
 #endif
index 0276d5d05925e12fd6827c9e8ebcc3946cf43f37..1a3f02c687f72a360624d7ea7054295fbd6440d8 100644 (file)
@@ -317,8 +317,7 @@ static void rtw89_pci_ser_setting_be(struct rtw89_dev *rtwdev)
        rtw89_write32(rtwdev, R_BE_REG_PL1_MASK, val32);
 }
 
-static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool all_en,
-                                      bool h2c_en)
+static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool enable)
 {
        u32 mask_all;
        u32 val;
@@ -331,12 +330,19 @@ static void rtw89_pci_ctrl_txdma_ch_be(struct rtw89_dev *rtwdev, bool all_en,
        val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1);
        val |= B_BE_STOP_CH13 | B_BE_STOP_CH14;
 
-       if (all_en)
+       if (enable)
                val &= ~mask_all;
        else
                val |= mask_all;
 
-       if (h2c_en)
+       rtw89_write32(rtwdev, R_BE_HAXI_DMA_STOP1, val);
+}
+
+static void rtw89_pci_ctrl_txdma_fw_ch_be(struct rtw89_dev *rtwdev, bool enable)
+{
+       u32 val = rtw89_read32(rtwdev, R_BE_HAXI_DMA_STOP1);
+
+       if (enable)
                val &= ~B_BE_STOP_CH12;
        else
                val |= B_BE_STOP_CH12;
@@ -375,7 +381,8 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev)
        rtw89_pci_pcie_setting_be(rtwdev);
        rtw89_pci_ser_setting_be(rtwdev);
 
-       rtw89_pci_ctrl_txdma_ch_be(rtwdev, false, true);
+       rtw89_pci_ctrl_txdma_ch_be(rtwdev, false);
+       rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true);
        rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_ENABLE,
                                      MAC_AX_PCIE_ENABLE, MAC_AX_PCIE_ENABLE);
 
@@ -485,7 +492,8 @@ static int rtw89_pci_ops_mac_post_init_be(struct rtw89_dev *rtwdev)
        rtw89_pci_ctrl_trxdma_pcie_be(rtwdev, MAC_AX_PCIE_IGNORE,
                                      MAC_AX_PCIE_IGNORE, MAC_AX_PCIE_ENABLE);
        rtw89_pci_ctrl_wpdma_pcie_be(rtwdev, true);
-       rtw89_pci_ctrl_txdma_ch_be(rtwdev, true, true);
+       rtw89_pci_ctrl_txdma_ch_be(rtwdev, true);
+       rtw89_pci_ctrl_txdma_fw_ch_be(rtwdev, true);
        rtw89_pci_configure_mit_be(rtwdev);
 
        return 0;
@@ -559,6 +567,10 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
        .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_be,
        .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_be,
 
+       .ctrl_txdma_ch = rtw89_pci_ctrl_txdma_ch_be,
+       .ctrl_txdma_fw_ch = rtw89_pci_ctrl_txdma_fw_ch_be,
+       .poll_txdma_ch_idle = rtw89_pci_poll_txdma_ch_idle_be,
+
        .aspm_set = rtw89_pci_aspm_set_be,
        .clkreq_set = rtw89_pci_clkreq_set_be,
        .l1ss_set = rtw89_pci_l1ss_set_be,
index 852f8a7794be5637cc5d669bfbfd04740f7827ae..286c59931fca44e9ed23cc687e448666236ca9e6 100644 (file)
@@ -560,7 +560,7 @@ static int rtw89_wow_enable_trx_pre(struct rtw89_dev *rtwdev)
 
        rtw89_mac_ptk_drop_by_band_and_wait(rtwdev, RTW89_MAC_0);
 
-       ret = rtw89_hci_poll_txdma_ch(rtwdev);
+       ret = rtw89_hci_poll_txdma_ch_idle(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "txdma ch busy\n");
                return ret;
@@ -583,7 +583,7 @@ static int rtw89_wow_enable_trx_post(struct rtw89_dev *rtwdev)
        rtw89_hci_disable_intr(rtwdev);
        rtw89_hci_ctrl_trxhci(rtwdev, false);
 
-       ret = rtw89_hci_poll_txdma_ch(rtwdev);
+       ret = rtw89_hci_poll_txdma_ch_idle(rtwdev);
        if (ret) {
                rtw89_err(rtwdev, "failed to poll txdma ch idle pcie\n");
                return ret;