]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: rtw89: mac: add flags to check if CMAC and DMAC are enabled
authorPing-Ke Shih <pkshih@realtek.com>
Mon, 11 Dec 2023 08:33:38 +0000 (16:33 +0800)
committerKalle Valo <kvalo@kernel.org>
Fri, 15 Dec 2023 13:39:13 +0000 (15:39 +0200)
Before accessing CMAC and DMAC registers, we should ensure they have been
powered on, so add flag to determine the state. For old chips, we read
registers and check corresponding bit, but it takes extra cost to read.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20231211083341.118047-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/mac_be.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index 5c266f349d373e1d5b1926344bdd667b5702b2b0..21421980fd067424b312a7691d39bc43babd0e41 100644 (file)
@@ -4117,6 +4117,9 @@ struct rtw89_hal {
 
 enum rtw89_flags {
        RTW89_FLAG_POWERON,
+       RTW89_FLAG_DMAC_FUNC,
+       RTW89_FLAG_CMAC0_FUNC,
+       RTW89_FLAG_CMAC1_FUNC,
        RTW89_FLAG_FW_RDY,
        RTW89_FLAG_RUNNING,
        RTW89_FLAG_BFEE_MON,
index 2da9c7a9629c95b9a360c825b43c586260572889..62c4f407f76dca1994e7b1f078b531de51c56bec 100644 (file)
@@ -57,8 +57,8 @@ static u32 rtw89_mac_mem_read(struct rtw89_dev *rtwdev, u32 offset,
        return rtw89_read32(rtwdev, mac->indir_access_addr);
 }
 
-int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 mac_idx,
-                          enum rtw89_mac_hwmod_sel sel)
+static int rtw89_mac_check_mac_en_ax(struct rtw89_dev *rtwdev, u8 mac_idx,
+                                    enum rtw89_mac_hwmod_sel sel)
 {
        u32 val, r_val;
 
@@ -1473,9 +1473,14 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
 
        if (on) {
                set_bit(RTW89_FLAG_POWERON, rtwdev->flags);
+               set_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags);
+               set_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags);
                rtw89_write8(rtwdev, R_AX_SCOREBOARD + 3, MAC_AX_NOTIFY_TP_MAJOR);
        } else {
                clear_bit(RTW89_FLAG_POWERON, rtwdev->flags);
+               clear_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags);
+               clear_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags);
+               clear_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags);
                clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
                rtw89_write8(rtwdev, R_AX_SCOREBOARD + 3, MAC_AX_NOTIFY_PWR_MAJOR);
                rtw89_set_entity_state(rtwdev, false);
@@ -6100,6 +6105,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
                        B_AX_BFMEE_HE_NDPA_EN,
        },
 
+       .check_mac_en = rtw89_mac_check_mac_en_ax,
        .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 44248900f4261b2b3bf853e1e9ef2d18f43830ad..2b5deb6ce9de91dbe2776e59e592ad2c9ee78b32 100644 (file)
@@ -898,6 +898,8 @@ struct rtw89_mac_gen_def {
        struct rtw89_reg_def muedca_ctrl;
        struct rtw89_reg_def bfee_ctrl;
 
+       int (*check_mac_en)(struct rtw89_dev *rtwdev, u8 band,
+                           enum rtw89_mac_hwmod_sel sel);
        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);
@@ -1044,8 +1046,15 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
 void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev);
 int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb);
 int rtw89_mac_init(struct rtw89_dev *rtwdev);
+static inline
 int rtw89_mac_check_mac_en(struct rtw89_dev *rtwdev, u8 band,
-                          enum rtw89_mac_hwmod_sel sel);
+                          enum rtw89_mac_hwmod_sel sel)
+{
+       const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+
+       return mac->check_mac_en(rtwdev, band, sel);
+}
+
 int rtw89_mac_write_lte(struct rtw89_dev *rtwdev, const u32 offset, u32 val);
 int rtw89_mac_read_lte(struct rtw89_dev *rtwdev, const u32 offset, u32 *val);
 int rtw89_mac_dle_dfi_cfg(struct rtw89_dev *rtwdev, struct rtw89_mac_dle_dfi_ctrl *ctrl);
index 23180d2226236a99dc1afc9af2d33b7fc5618624..fa3f5ef289cb5a6be5d2be25f4fd49b566168d7f 100644 (file)
@@ -57,6 +57,22 @@ static const struct rtw89_port_reg rtw89_port_base_be = {
                    R_BE_PORT_HGQ_WINDOW_CFG + 3},
 };
 
+static int rtw89_mac_check_mac_en_be(struct rtw89_dev *rtwdev, u8 mac_idx,
+                                    enum rtw89_mac_hwmod_sel sel)
+{
+       if (sel == RTW89_DMAC_SEL &&
+           test_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags))
+               return 0;
+       if (sel == RTW89_CMAC_SEL && mac_idx == RTW89_MAC_0 &&
+           test_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags))
+               return 0;
+       if (sel == RTW89_CMAC_SEL && mac_idx == RTW89_MAC_1 &&
+           test_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags))
+               return 0;
+
+       return -EFAULT;
+}
+
 static void hfc_get_mix_info_be(struct rtw89_dev *rtwdev)
 {
        struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param;
@@ -1145,6 +1161,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
                        B_BE_BFMEE_HE_NDPA_EN | B_BE_BFMEE_EHT_NDPA_EN,
        },
 
+       .check_mac_en = rtw89_mac_check_mac_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,
index 92677d7ce2494f66d83fed13be4c8ce6da94be3f..0e7300cc6d9e54bdc609f5809493bcf944b878d8 100644 (file)
@@ -257,6 +257,8 @@ static int rtw8922a_pwr_on_func(struct rtw89_dev *rtwdev)
                          B_BE_H_AXIDMA_EN | B_BE_DMAC_MLO_EN | B_BE_PLRLS_EN |
                          B_BE_P_AXIDMA_EN | B_BE_DLE_DATACPUIO_EN | B_BE_LTR_CTL_EN);
 
+       set_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags);
+
        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);
@@ -266,6 +268,8 @@ static int rtw8922a_pwr_on_func(struct rtw89_dev *rtwdev)
                          B_BE_PTCLTOP_EN | B_BE_SCHEDULER_EN | B_BE_TMAC_EN |
                          B_BE_RMAC_EN | B_BE_TXTIME_EN | B_BE_RESP_PKTCTL_EN);
 
+       set_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags);
+
        rtw89_write32_set(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_FEN_BB_IP_RSTN |
                                                       B_BE_FEN_BBPLAT_RSTB);