wifi: rtw89: 52c: rfk: disable DPK during MCC
authorZong-Zhe Yang <kevin_yang@realtek.com>
Fri, 8 Sep 2023 03:11:40 +0000 (11:11 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 18 Sep 2023 14:28:44 +0000 (17:28 +0300)
DPK is one kind of RF calibration. When MCC (multi-channel concurrency)
start/stop, DPK needs to do extra things to be off/on. We add a chanctx
callback type, RTW89_CHANCTX_CALLBACK_RFK, and register it for RTL8852C
to deal with DPK according to MCC states.

Signed-off-by: Zong-Zhe Yang <kevin_yang@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/20230908031145.20931-4-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h

index 2eaf1df205ecf2ad88976e3cb63215d4e0217d4b..43a81acdaacfee899888f93db334bfe8d76128d0 100644 (file)
@@ -3429,6 +3429,7 @@ enum rtw89_chanctx_state {
 
 enum rtw89_chanctx_callbacks {
        RTW89_CHANCTX_CALLBACK_PLACEHOLDER,
+       RTW89_CHANCTX_CALLBACK_RFK,
 
        NUM_OF_RTW89_CHANCTX_CALLBACKS,
 };
index 7f80e0bf40a4f5f486dd4784446755610483867c..e344b76c602539c7bd5c32c61f6a9c8114236778 100644 (file)
@@ -2,6 +2,7 @@
 /* Copyright(c) 2019-2022  Realtek Corporation
  */
 
+#include "chan.h"
 #include "coex.h"
 #include "debug.h"
 #include "fw.h"
@@ -1776,6 +1777,7 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev)
        rtwdev->is_tssi_mode[RF_PATH_B] = false;
        memset(rfk_mcc, 0, sizeof(*rfk_mcc));
        rtw8852c_lck_init(rtwdev);
+       rtw8852c_dpk_init(rtwdev);
 
        rtw8852c_rck(rtwdev);
        rtw8852c_dack(rtwdev);
@@ -2748,6 +2750,10 @@ static int rtw8852c_mac_disable_bb_rf(struct rtw89_dev *rtwdev)
        return 0;
 }
 
+static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {
+       .callbacks[RTW89_CHANCTX_CALLBACK_RFK] = rtw8852c_rfk_chanctx_cb,
+};
+
 #ifdef CONFIG_PM
 static const struct wiphy_wowlan_support rtw_wowlan_stub_8852c = {
        .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
@@ -2841,6 +2847,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .byr_table              = &rtw89_8852c_byr_table,
        .dflt_parms             = &rtw89_8852c_dflt_parms,
        .rfe_parms_conf         = NULL,
+       .chanctx_listener       = &rtw8852c_chanctx_listener,
        .txpwr_factor_rf        = 2,
        .txpwr_factor_mac       = 1,
        .dig_table              = NULL,
index badd829ecfaa9e3a74794103a90fb2734ea6ab47..654e3e5507cb09dd4f1ae4ca392d1d671264fda3 100644 (file)
@@ -4265,6 +4265,14 @@ trigger_rx_dck:
        rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
 }
 
+void rtw8852c_dpk_init(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       dpk->is_dpk_enable = true;
+       dpk->is_dpk_reload_en = false;
+}
+
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
 {
        u32 tx_en;
@@ -4274,8 +4282,6 @@ void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
        rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
        _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
 
-       rtwdev->dpk.is_dpk_enable = true;
-       rtwdev->dpk.is_dpk_reload_en = false;
        _dpk(rtwdev, phy_idx, false);
 
        rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
@@ -4413,3 +4419,26 @@ void rtw8852c_wifi_scan_notify(struct rtw89_dev *rtwdev,
        else
                rtw8852c_tssi_default_txagc(rtwdev, phy_idx, false);
 }
+
+void rtw8852c_rfk_chanctx_cb(struct rtw89_dev *rtwdev,
+                            enum rtw89_chanctx_state state)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u8 path;
+
+       switch (state) {
+       case RTW89_CHANCTX_STATE_MCC_START:
+               dpk->is_dpk_enable = false;
+               for (path = 0; path < RTW8852C_DPK_RF_PATH; path++)
+                       _dpk_onoff(rtwdev, path, false);
+               break;
+       case RTW89_CHANCTX_STATE_MCC_STOP:
+               dpk->is_dpk_enable = true;
+               for (path = 0; path < RTW8852C_DPK_RF_PATH; path++)
+                       _dpk_onoff(rtwdev, path, false);
+               rtw8852c_dpk(rtwdev, RTW89_PHY_0);
+               break;
+       default:
+               break;
+       }
+}
index 928a587cdd0564fd4789bc732a24200750e21d58..6605137e61aa43f88a44fa4ab18315ac0ed9cbf5 100644 (file)
@@ -13,6 +13,7 @@ void rtw8852c_dack(struct rtw89_dev *rtwdev);
 void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
 void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool is_afe);
 void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev);
+void rtw8852c_dpk_init(struct rtw89_dev *rtwdev);
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
 void rtw8852c_dpk_track(struct rtw89_dev *rtwdev);
 void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
@@ -25,5 +26,7 @@ void rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev,
                             enum rtw89_phy_idx phy_idx);
 void rtw8852c_lck_init(struct rtw89_dev *rtwdev);
 void rtw8852c_lck_track(struct rtw89_dev *rtwdev);
+void rtw8852c_rfk_chanctx_cb(struct rtw89_dev *rtwdev,
+                            enum rtw89_chanctx_state state);
 
 #endif