wifi: rtw89: coex: modify LNA2 setting to avoid BT destroyed Wi-Fi aggregation
authorChing-Te Ku <ku920601@realtek.com>
Tue, 20 Sep 2022 01:09:36 +0000 (09:09 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 22 Sep 2022 06:11:45 +0000 (09:11 +0300)
To prevent LNA2 change its gain during a Wi-Fi aggregation packet while
GNT_BT pull high. Otherwise, changes of this gain will destroy the whole
aggregation when Wi-Fi RX.

Signed-off-by: Ching-Te Ku <ku920601@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/20220920010939.12173-7-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c

index 42fc90a359b0646393a0d4f9fc790248f5e1cac5..85c8e7ffb56c7ab8f0580daa80f07ceed9f01d7c 100644 (file)
@@ -1735,6 +1735,7 @@ static void _set_wl_tx_power(struct rtw89_dev *rtwdev, u32 level)
 
 static void _set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
 {
+       const struct rtw89_chip_info *chip = rtwdev->chip;
        struct rtw89_btc *btc = &rtwdev->btc;
        struct rtw89_btc_wl_info *wl = &btc->cx.wl;
 
@@ -1747,6 +1748,8 @@ static void _set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
        rtw89_debug(rtwdev, RTW89_DBG_BTC,
                    "[BTC], %s(): level = %d\n",
                    __func__, level);
+
+       chip->ops->btc_set_wl_rx_gain(rtwdev, level);
 }
 
 static void _set_bt_tx_power(struct rtw89_dev *rtwdev, u8 level)
index 1d8e20708d0924adb0283587d085d565a48b10bb..c4eefa54ed864af4c41fa1923a4e4b67ae6985ff 100644 (file)
@@ -2356,6 +2356,7 @@ struct rtw89_chip_ops {
        void (*btc_update_bt_cnt)(struct rtw89_dev *rtwdev);
        void (*btc_wl_s1_standby)(struct rtw89_dev *rtwdev, bool state);
        void (*btc_set_policy)(struct rtw89_dev *rtwdev, u16 policy_type);
+       void (*btc_set_wl_rx_gain)(struct rtw89_dev *rtwdev, u32 level);
 };
 
 enum rtw89_dma_ch {
index c6c92a2a1613457f15c80f777e3e54a533706ab6..f81335aacddfac52b4909b7d8d05f34f7d5c88bf 100644 (file)
@@ -2059,6 +2059,51 @@ void rtw8852a_btc_wl_s1_standby(struct rtw89_dev *rtwdev, bool state)
        rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
 }
 
+static void rtw8852a_set_wl_lna2(struct rtw89_dev *rtwdev, u8 level)
+{
+       /* level=0 Default:    TIA 1/0= (LNA2,TIAN6) = (7,1)/(5,1) = 21dB/12dB
+        * level=1 Fix LNA2=5: TIA 1/0= (LNA2,TIAN6) = (5,0)/(5,1) = 18dB/12dB
+        * To improve BT ACI in co-rx
+        */
+
+       switch (level) {
+       case 0: /* default */
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x1000);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x3);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x17);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x2);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
+               break;
+       case 1: /* Fix LNA2=5  */
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x1000);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x3);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x5);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x2);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
+               break;
+       }
+}
+
+static void rtw8852a_btc_set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
+{
+       switch (level) {
+       case 0: /* original */
+               rtw8852a_bb_ctrl_btc_preagc(rtwdev, false);
+               rtw8852a_set_wl_lna2(rtwdev, 0);
+               break;
+       case 1: /* for FDD free-run */
+               rtw8852a_bb_ctrl_btc_preagc(rtwdev, true);
+               rtw8852a_set_wl_lna2(rtwdev, 0);
+               break;
+       case 2: /* for BTG Co-Rx*/
+               rtw8852a_bb_ctrl_btc_preagc(rtwdev, false);
+               rtw8852a_set_wl_lna2(rtwdev, 1);
+               break;
+       }
+}
+
 static void rtw8852a_fill_freq_with_ppdu(struct rtw89_dev *rtwdev,
                                         struct rtw89_rx_phy_ppdu *phy_ppdu,
                                         struct ieee80211_rx_status *status)
@@ -2135,6 +2180,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .btc_bt_aci_imp         = rtw8852a_btc_bt_aci_imp,
        .btc_update_bt_cnt      = rtw8852a_btc_update_bt_cnt,
        .btc_wl_s1_standby      = rtw8852a_btc_wl_s1_standby,
+       .btc_set_wl_rx_gain     = rtw8852a_btc_set_wl_rx_gain,
        .btc_set_policy         = rtw89_btc_set_policy,
 };
 
index 817bb57698ba867ebacf47123c76a3b81c5c3ed9..5b8292d151f6f2d4c802260fdcf8edeb5ee5ba34 100644 (file)
@@ -2854,6 +2854,59 @@ void rtw8852c_btc_wl_s1_standby(struct rtw89_dev *rtwdev, bool state)
        rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
 }
 
+static void rtw8852c_set_wl_lna2(struct rtw89_dev *rtwdev, u8 level)
+{
+       /* level=0 Default:    TIA 1/0= (LNA2,TIAN6) = (7,1)/(5,1) = 21dB/12dB
+        * level=1 Fix LNA2=5: TIA 1/0= (LNA2,TIAN6) = (5,0)/(5,1) = 18dB/12dB
+        * To improve BT ACI in co-rx
+        */
+
+       switch (level) {
+       case 0: /* default */
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x1000);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x0);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x1);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x17);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x2);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x3);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x17);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
+               break;
+       case 1: /* Fix LNA2=5  */
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x1000);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x0);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x1);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x5);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x2);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x15);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x3);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x5);
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
+               break;
+       }
+}
+
+static void rtw8852c_btc_set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
+{
+       switch (level) {
+       case 0: /* original */
+               rtw8852c_bb_ctrl_btc_preagc(rtwdev, false);
+               rtw8852c_set_wl_lna2(rtwdev, 0);
+               break;
+       case 1: /* for FDD free-run */
+               rtw8852c_bb_ctrl_btc_preagc(rtwdev, true);
+               rtw8852c_set_wl_lna2(rtwdev, 0);
+               break;
+       case 2: /* for BTG Co-Rx*/
+               rtw8852c_bb_ctrl_btc_preagc(rtwdev, false);
+               rtw8852c_set_wl_lna2(rtwdev, 1);
+               break;
+       }
+}
+
 static void rtw8852c_fill_freq_with_ppdu(struct rtw89_dev *rtwdev,
                                         struct rtw89_rx_phy_ppdu *phy_ppdu,
                                         struct ieee80211_rx_status *status)
@@ -2974,6 +3027,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .btc_bt_aci_imp         = rtw8852c_btc_bt_aci_imp,
        .btc_update_bt_cnt      = rtw8852c_btc_update_bt_cnt,
        .btc_wl_s1_standby      = rtw8852c_btc_wl_s1_standby,
+       .btc_set_wl_rx_gain     = rtw8852c_btc_set_wl_rx_gain,
        .btc_set_policy         = rtw89_btc_set_policy_v1,
 };