rtw89: add config_rf_reg_v1 to configure RF parameter tables
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 17 Mar 2022 05:55:36 +0000 (13:55 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 17 Mar 2022 14:20:38 +0000 (16:20 +0200)
The format of RF parameter is changed; it doesn't encode delay parameters
into table, but the delay coding becomes regular pair of register address
and value.

To help firmware to recover RF register settings, we need to download
these parameters to firmware. For v1 format, only download partial
parameters (ignore them with addr < 0x100).

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220317055543.40514-6-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h

index af73347c40b166e94fce94590eb33ec37a1af8e5..95f105232e807b885da60e94bdb89e30a9584a3b 100644 (file)
@@ -2229,6 +2229,8 @@ struct rtw89_phy_table {
        const struct rtw89_reg2_def *regs;
        u32 n_regs;
        enum rtw89_rf_path rf_path;
+       void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg,
+                      enum rtw89_rf_path rf_path, void *data);
 };
 
 struct rtw89_txpwr_table {
index 43d73ec3f7594b79c8d14b536fb7c2e13b92b0de..ac211d897311853e5fc42b0597b53c93392f8592 100644 (file)
@@ -862,6 +862,21 @@ static void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev,
        }
 }
 
+void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
+                               const struct rtw89_reg2_def *reg,
+                               enum rtw89_rf_path rf_path,
+                               void *extra_data)
+{
+       rtw89_write_rf(rtwdev, rf_path, reg->addr, RFREG_MASK, reg->data);
+
+       if (reg->addr < 0x100)
+               return;
+
+       rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path,
+                                    (struct rtw89_fw_h2c_rf_reg_info *)extra_data);
+}
+EXPORT_SYMBOL(rtw89_phy_config_rf_reg_v1);
+
 static int rtw89_phy_sel_headline(struct rtw89_dev *rtwdev,
                                  const struct rtw89_phy_table *table,
                                  u32 *headline_size, u32 *headline_idx,
@@ -1033,6 +1048,8 @@ static u32 rtw89_phy_nctl_poll(struct rtw89_dev *rtwdev)
 
 void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
 {
+       void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg,
+                      enum rtw89_rf_path rf_path, void *data);
        const struct rtw89_chip_info *chip = rtwdev->chip;
        const struct rtw89_phy_table *rf_table;
        struct rtw89_fw_h2c_rf_reg_info *rf_reg_info;
@@ -1043,13 +1060,13 @@ void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev)
                return;
 
        for (path = RF_PATH_A; path < chip->rf_path_num; path++) {
-               rf_reg_info->rf_path = path;
                rf_table = chip->rf_table[path];
-               rtw89_phy_init_reg(rtwdev, rf_table, rtw89_phy_config_rf_reg,
-                                  (void *)rf_reg_info);
+               rf_reg_info->rf_path = rf_table->rf_path;
+               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",
-                                  path);
+                                  rf_reg_info->rf_path);
        }
        kfree(rf_reg_info);
 }
index e600e01cbdd173891253f25326cc58144e6027fd..adcfcb4c242961ba449115e41562eb814e1dfc6b 100644 (file)
@@ -404,6 +404,10 @@ 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_config_rf_reg_v1(struct rtw89_dev *rtwdev,
+                               const struct rtw89_reg2_def *reg,
+                               enum rtw89_rf_path rf_path,
+                               void *extra_data);
 void rtw89_phy_dm_init(struct rtw89_dev *rtwdev);
 void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
                           u32 data, enum rtw89_phy_idx phy_idx);