wifi: rtw89: 8922a: add chip_ops::rfk_init_late to do initial RF calibrations later
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 2 Feb 2024 03:06:41 +0000 (11:06 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 6 Feb 2024 18:05:23 +0000 (20:05 +0200)
The RF calibrations are moved into firmware, so we trigger calibrations by
H2C commands and wait for C2H completion events. However, these events
can be received only after HCI (i.e. PCI for now) starts, so we should
do initial RF calibrations after that.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240202030642.108385-11-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index c6c3e0c..61a2164 100644 (file)
@@ -4101,6 +4101,7 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
 
        set_bit(RTW89_FLAG_RUNNING, rtwdev->flags);
 
+       rtw89_chip_rfk_init_late(rtwdev);
        rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON);
        rtw89_fw_h2c_fw_log(rtwdev, rtwdev->fw.log.enable);
        rtw89_fw_h2c_init_ba_cam(rtwdev);
index ccc9f96..270403f 100644 (file)
@@ -3157,6 +3157,7 @@ struct rtw89_chip_ops {
        void (*fem_setup)(struct rtw89_dev *rtwdev);
        void (*rfe_gpio)(struct rtw89_dev *rtwdev);
        void (*rfk_init)(struct rtw89_dev *rtwdev);
+       void (*rfk_init_late)(struct rtw89_dev *rtwdev);
        void (*rfk_channel)(struct rtw89_dev *rtwdev);
        void (*rfk_band_changed)(struct rtw89_dev *rtwdev,
                                 enum rtw89_phy_idx phy_idx);
@@ -5642,6 +5643,14 @@ static inline void rtw89_chip_rfk_init(struct rtw89_dev *rtwdev)
                chip->ops->rfk_init(rtwdev);
 }
 
+static inline void rtw89_chip_rfk_init_late(struct rtw89_dev *rtwdev)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+
+       if (chip->ops->rfk_init_late)
+               chip->ops->rfk_init_late(rtwdev);
+}
+
 static inline void rtw89_chip_rfk_channel(struct rtw89_dev *rtwdev)
 {
        const struct rtw89_chip_info *chip = rtwdev->chip;
index 09b23c5..09e3871 100644 (file)
@@ -2311,6 +2311,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
        .fem_setup              = NULL,
        .rfe_gpio               = rtw8851b_rfe_gpio,
        .rfk_init               = rtw8851b_rfk_init,
+       .rfk_init_late          = NULL,
        .rfk_channel            = rtw8851b_rfk_channel,
        .rfk_band_changed       = rtw8851b_rfk_band_changed,
        .rfk_scan               = rtw8851b_rfk_scan,
index c28f05b..01c249d 100644 (file)
@@ -2055,6 +2055,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .fem_setup              = rtw8852a_fem_setup,
        .rfe_gpio               = NULL,
        .rfk_init               = rtw8852a_rfk_init,
+       .rfk_init_late          = NULL,
        .rfk_channel            = rtw8852a_rfk_channel,
        .rfk_band_changed       = rtw8852a_rfk_band_changed,
        .rfk_scan               = rtw8852a_rfk_scan,
index 18ed372..fb6ad33 100644 (file)
@@ -2480,6 +2480,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .fem_setup              = NULL,
        .rfe_gpio               = NULL,
        .rfk_init               = rtw8852b_rfk_init,
+       .rfk_init_late          = NULL,
        .rfk_channel            = rtw8852b_rfk_channel,
        .rfk_band_changed       = rtw8852b_rfk_band_changed,
        .rfk_scan               = rtw8852b_rfk_scan,
index 431acfa..00861c3 100644 (file)
@@ -2825,6 +2825,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .fem_setup              = NULL,
        .rfe_gpio               = NULL,
        .rfk_init               = rtw8852c_rfk_init,
+       .rfk_init_late          = NULL,
        .rfk_channel            = rtw8852c_rfk_channel,
        .rfk_band_changed       = rtw8852c_rfk_band_changed,
        .rfk_scan               = rtw8852c_rfk_scan,
index 69ae8f8..0cbe478 100644 (file)
@@ -1379,6 +1379,14 @@ static void rtw8922a_rfk_init(struct rtw89_dev *rtwdev)
        memset(rfk_mcc, 0, sizeof(*rfk_mcc));
 }
 
+static void rtw8922a_rfk_init_late(struct rtw89_dev *rtwdev)
+{
+       rtw89_phy_rfk_pre_ntfy_and_wait(rtwdev, RTW89_PHY_0, 5);
+
+       rtw89_phy_rfk_dack_and_wait(rtwdev, RTW89_PHY_0, 58);
+       rtw89_phy_rfk_rxdck_and_wait(rtwdev, RTW89_PHY_0, 32);
+}
+
 static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
 {
        u32 rf_mode;
@@ -1687,6 +1695,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
        .fem_setup              = NULL,
        .rfe_gpio               = NULL,
        .rfk_init               = rtw8922a_rfk_init,
+       .rfk_init_late          = rtw8922a_rfk_init_late,
        .rfk_channel            = rtw8922a_rfk_channel,
        .rfk_band_changed       = rtw8922a_rfk_band_changed,
        .rfk_scan               = rtw8922a_rfk_scan,