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 c6c3e0c0bf843438e5dbfab0ff70a1a1ef3e0d44..61a216464b6dd9aaf270b1b94fb6b86f0f868269 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 ccc9f96fc18b6441fad98e9136fdce15a3ec31c1..270403f6c3d52f80331b8de39b55b169dc752921 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 09b23c56aa8e0443217ac9c9916c7ff3d91e29e7..09e38713bca7a833e01864ee04ac84eb67e9f7f3 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 c28f05bbdccf01c1bb603537ec9562fca256001f..01c249dddfb851bd7563951274f84aa8e756b015 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 18ed372ed5cdd2baa0cc2ff8ea5b2952937308d4..fb6ad335a37af8f3c15025eb7f41df0a5591b45e 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 431acfaba89bb6a482f49245fba08f061ec508d9..00861c328ca087335bfc8766b225e23505feadf6 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 69ae8f81181e4618bc896940d0d20178ae8aa966..0cbe4780eb69585541a7c7c6744be0d6af40e649 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,