wifi: rtw89: collect and send RF parameters to firmware for WoWLAN
authorChih-Kang Chang <gary.chang@realtek.com>
Thu, 27 Oct 2022 05:27:01 +0000 (13:27 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 1 Nov 2022 09:26:12 +0000 (11:26 +0200)
For WoWLAN mode, we only collect and send RF parameters to Firmware
without writing RF registers. So we add one function to practice it.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221027052707.14605-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h

index a27ca62..0e4153b 100644 (file)
@@ -2962,7 +2962,7 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
                return ret;
 
        rtw89_phy_init_bb_reg(rtwdev);
-       rtw89_phy_init_rf_reg(rtwdev);
+       rtw89_phy_init_rf_reg(rtwdev, false);
 
        rtw89_btc_ntfy_init(rtwdev, BTC_MODE_NORMAL);
 
index 35a0d19..dd46856 100644 (file)
@@ -801,6 +801,11 @@ bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
 }
 EXPORT_SYMBOL(rtw89_phy_write_rf_v1);
 
+static bool rtw89_chip_rf_v1(struct rtw89_dev *rtwdev)
+{
+       return rtwdev->chip->ops->write_rf == rtw89_phy_write_rf_v1;
+}
+
 static void rtw89_phy_bb_reset(struct rtw89_dev *rtwdev,
                               enum rtw89_phy_idx phy_idx)
 {
@@ -1123,6 +1128,24 @@ out:
        return ret;
 }
 
+static void rtw89_phy_config_rf_reg_noio(struct rtw89_dev *rtwdev,
+                                        const struct rtw89_reg2_def *reg,
+                                        enum rtw89_rf_path rf_path,
+                                        void *extra_data)
+{
+       u32 addr = reg->addr;
+
+       if (addr == 0xfe || addr == 0xfd || addr == 0xfc || addr == 0xfb ||
+           addr == 0xfa || addr == 0xf9)
+               return;
+
+       if (rtw89_chip_rf_v1(rtwdev) && addr < 0x100)
+               return;
+
+       rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path,
+                                    (struct rtw89_fw_h2c_rf_reg_info *)extra_data);
+}
+
 static void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev,
                                    const struct rtw89_reg2_def *reg,
                                    enum rtw89_rf_path rf_path,
@@ -1335,7 +1358,7 @@ static u32 rtw89_phy_nctl_poll(struct rtw89_dev *rtwdev)
        return rtw89_phy_read32(rtwdev, 0x8080);
 }
 
-void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
+void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev, bool noio)
 {
        void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg,
                       enum rtw89_rf_path rf_path, void *data);
@@ -1351,7 +1374,11 @@ void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
        for (path = RF_PATH_A; path < chip->rf_path_num; path++) {
                rf_table = chip->rf_table[path];
                rf_reg_info->rf_path = rf_table->rf_path;
-               config = rf_table->config ? rf_table->config : rtw89_phy_config_rf_reg;
+               if (noio)
+                       config = rtw89_phy_config_rf_reg_noio;
+               else
+                       config = rf_table->config ? rf_table->config :
+                                rtw89_phy_config_rf_reg;
                rtw89_phy_init_reg(rtwdev, rf_table, config, (void *)rf_reg_info);
                if (rtw89_phy_config_rf_reg_fw(rtwdev, rf_reg_info))
                        rtw89_warn(rtwdev, "rf path %d reg h2c config failed\n",
index 995c13f..dac69a0 100644 (file)
@@ -500,7 +500,7 @@ bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
 bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path,
                           u32 addr, u32 mask, u32 data);
 void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev);
-void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev);
+void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev, bool noio);
 void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
                                const struct rtw89_reg2_def *reg,
                                enum rtw89_rf_path rf_path,