]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: mac: add an entry to enable MAC function in preinit
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 8 Jan 2026 12:03:19 +0000 (20:03 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 13 Jan 2026 02:33:36 +0000 (10:33 +0800)
The preinit is to initialize partial MAC hardware needed before
downloading firmware, and then does post-init after firmware runs.

For RTL8922D, initialize some DMAC and CMAC at this step.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260108120320.2217402-13-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac_be.c

index f142d3f80e957c274f2f57547bbc17e9b66ce93e..f484e81d65951f78b11b02a2cb080ad4c0a4d159 100644 (file)
@@ -4223,12 +4223,19 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
 
 int rtw89_mac_preinit(struct rtw89_dev *rtwdev)
 {
+       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        int ret;
 
        ret = rtw89_mac_pwr_on(rtwdev);
        if (ret)
                return ret;
 
+       if (mac->mac_func_en) {
+               ret = mac->mac_func_en(rtwdev);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -7292,6 +7299,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
        .trx_init = trx_init_ax,
        .preload_init = preload_init_set_ax,
        .err_imr_ctrl = err_imr_ctrl_ax,
+       .mac_func_en = NULL,
        .hci_func_en = rtw89_mac_hci_func_en_ax,
        .dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_ax,
        .dle_func_en = dle_func_en_ax,
index 815e12de0853115e541350e30eec55c929a3b1eb..894303c7145e0bb86c1db527bfcda709bc659792 100644 (file)
@@ -1040,6 +1040,7 @@ struct rtw89_mac_gen_def {
        int (*preload_init)(struct rtw89_dev *rtwdev, u8 mac_idx,
                            enum rtw89_qta_mode mode);
        void (*err_imr_ctrl)(struct rtw89_dev *rtwdev, bool en);
+       int (*mac_func_en)(struct rtw89_dev *rtwdev);
        void (*hci_func_en)(struct rtw89_dev *rtwdev);
        void (*dmac_func_pre_en)(struct rtw89_dev *rtwdev);
        void (*dle_func_en)(struct rtw89_dev *rtwdev, bool enable);
index ef4de64d8661b7db64c0320c77d7cb362ef01cc0..35c16bcca3b77002a8dfbc07e244fb071b85d3b4 100644 (file)
@@ -751,6 +751,37 @@ static int rtw89_fwdl_check_path_ready_be(struct rtw89_dev *rtwdev,
 
 static int dmac_func_en_be(struct rtw89_dev *rtwdev)
 {
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       if (chip->chip_id == RTL8922A)
+               return 0;
+
+       rtw89_write32_set(rtwdev, R_BE_DMAC_FUNC_EN,
+                         B_BE_MAC_FUNC_EN | B_BE_DMAC_FUNC_EN |
+                         B_BE_MPDU_PROC_EN | B_BE_WD_RLS_EN |
+                         B_BE_DLE_WDE_EN | B_BE_TXPKT_CTRL_EN |
+                         B_BE_STA_SCH_EN | B_BE_DLE_PLE_EN |
+                         B_BE_PKT_BUF_EN | B_BE_DMAC_TBL_EN |
+                         B_BE_PKT_IN_EN | B_BE_DLE_CPUIO_EN |
+                         B_BE_DISPATCHER_EN | B_BE_BBRPT_EN |
+                         B_BE_MAC_SEC_EN | B_BE_H_AXIDMA_EN |
+                         B_BE_DMAC_MLO_EN | B_BE_PLRLS_EN |
+                         B_BE_P_AXIDMA_EN | B_BE_DLE_DATACPUIO_EN);
+
+       return 0;
+}
+
+static int cmac_share_func_en_be(struct rtw89_dev *rtwdev)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       if (chip->chip_id == RTL8922A)
+               return 0;
+
+       rtw89_write32_set(rtwdev, R_BE_CMAC_SHARE_FUNC_EN,
+                         B_BE_CMAC_SHARE_EN | B_BE_RESPBA_EN |
+                         B_BE_ADDRSRCH_EN | B_BE_BTCOEX_EN);
+
        return 0;
 }
 
@@ -865,6 +896,10 @@ static int sys_init_be(struct rtw89_dev *rtwdev)
        if (ret)
                return ret;
 
+       ret = cmac_share_func_en_be(rtwdev);
+       if (ret)
+               return ret;
+
        ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_0, true);
        if (ret)
                return ret;
@@ -880,6 +915,43 @@ static int sys_init_be(struct rtw89_dev *rtwdev)
        return ret;
 }
 
+static int mac_func_en_be(struct rtw89_dev *rtwdev)
+{
+       u32 val;
+       int ret;
+
+       ret = dmac_func_en_be(rtwdev);
+       if (ret)
+               return ret;
+
+       ret = cmac_share_func_en_be(rtwdev);
+       if (ret)
+               return ret;
+
+       val = rtw89_read32(rtwdev, R_BE_FEN_RST_ENABLE);
+       if (val & B_BE_CMAC0_FEN) {
+               ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_0, true);
+               if (ret)
+                       return ret;
+
+               ret = cmac_func_en_be(rtwdev, RTW89_MAC_0, true);
+               if (ret)
+                       return ret;
+       }
+
+       if (val & B_BE_CMAC1_FEN) {
+               ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_1, true);
+               if (ret)
+                       return ret;
+
+               ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, true);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 static int sta_sch_init_be(struct rtw89_dev *rtwdev)
 {
        u32 p_val;
@@ -2911,6 +2983,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
        .trx_init = trx_init_be,
        .preload_init = preload_init_be,
        .err_imr_ctrl = err_imr_ctrl_be,
+       .mac_func_en = mac_func_en_be,
        .hci_func_en = rtw89_mac_hci_func_en_be,
        .dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_be,
        .dle_func_en = dle_func_en_be,