From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <owen.hsiao@realtek.com>, <echuang@realtek.com>,
<henchy.chen@realtek.com>, <phhuang@realtek.com>,
<kevin_yang@realtek.com>
Subject: [PATCH rtw-next 09/14] wifi: rtw89: 8922d: bypass RX IQK when scan
Date: Wed, 26 Aug 2026 14:40:56 +0800 [thread overview]
Message-ID: <20260826064101.58892-10-pkshih@realtek.com> (raw)
In-Reply-To: <20260826064101.58892-1-pkshih@realtek.com>
Similar to TX IQK, when connected to an AP and a scan is triggered,
the FW may fail to receive frames because switching channels may load an
uninitialized RX IQK table. Therefore, bypass RXIQK during scanning
to avoid using invalid calibration values.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/phy.c | 5 ++
drivers/net/wireless/realtek/rtw89/reg.h | 4 ++
drivers/net/wireless/realtek/rtw89/rtw8922d.c | 60 +++++++++++++++++++
3 files changed, 69 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
index ebf6ecf08c35..cd56f9164cf4 100644
--- a/drivers/net/wireless/realtek/rtw89/phy.c
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
@@ -3575,6 +3575,8 @@ static void rtw89_phy_c2h_rfk_rpt_log(struct rtw89_dev *rtwdev,
"[IQK] iqk->fwk_status = %x\n", iqk->fwk_status);
for (i = 0; i < 2; i++) {
+ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+
rtw89_debug(rtwdev, RTW89_DBG_RFK,
"[IQK] ======== Path %x ========\n", i);
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_band[%d] = %x\n",
@@ -3593,6 +3595,9 @@ static void rtw89_phy_c2h_rfk_rpt_log(struct rtw89_dev *rtwdev,
i, iqk->iqk_tx_fail[i]);
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_rx_fail[%d] = %x\n",
i, iqk->iqk_rx_fail[i]);
+
+ iqk_info->iqk_rx_fail[0][i] = iqk->iqk_rx_fail[i];
+
for (j = 0; j < 6; j++)
rtw89_debug(rtwdev, RTW89_DBG_RFK,
"[IQK] iqk->rftxgain[%d][%d] = %x\n",
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 7a3ca9c82548..4291e8115f10 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -11072,13 +11072,17 @@
#define B_KTBL0_RST BIT(31)
#define R_CFIR_CTRL_A_BE4 0x38124
#define R_CFIR_CTRL_B_BE4 0x38224
+#define B_CFIR_CTRL_RXKIDX0_EN BIT(0)
#define B_CFIR_CTRL_KIDX0_EN BIT(8)
+#define B_CFIR_CTRL_RXKIDX1_EN BIT(16)
#define B_CFIR_CTRL_KIDX1_EN BIT(24)
#define R_TX_IQC_A_BE4 0x38138
#define R_TX_IQC_B_BE4 0x38238
#define B_TX_IQC_X GENMASK(31, 20)
#define B_TX_IQC_Y GENMASK(19, 8)
#define B_TX_IQC_DPK BIT(3)
+#define R_RX_IQC_A_BE4 0x3813c
+#define R_RX_IQC_B_BE4 0x3823c
#define R_KTBL1A_BE4 0x38154
#define R_KTBL1B_BE4 0x38254
#define B_KTBL1_TBL0 BIT(3)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922d.c b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
index 4d003b303ae7..287a9476bb77 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922d.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922d.c
@@ -2864,6 +2864,64 @@ static void __rtw8922d_txiqk_enable(struct rtw89_dev *rtwdev)
}
}
+static void __rtw8922d_rxiqk_disable(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
+ u8 path, kidx;
+
+ for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
+ kidx = rfk_mcc[path].table_idx;
+
+ if (kidx == 0) {
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX0_EN);
+ } else if (kidx == 1) {
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX1_EN);
+ } else {
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x1);
+ rtw89_phy_write32_clr(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX0_EN);
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x0);
+ }
+
+ rtw89_phy_write32(rtwdev, R_RX_IQC_A_BE4 + (path << 8), 0x40000002);
+ }
+}
+
+static void __rtw8922d_rxiqk_enable(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
+ struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+ u8 path, kidx;
+
+ for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
+ if (iqk_info->iqk_rx_fail[0][path])
+ continue;
+
+ kidx = rfk_mcc[path].table_idx;
+
+ if (kidx == 0) {
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX0_EN);
+ } else if (kidx == 1) {
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX1_EN);
+ } else {
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x1);
+ rtw89_phy_write32_set(rtwdev, R_CFIR_CTRL_A_BE4 + (path << 8),
+ B_CFIR_CTRL_RXKIDX0_EN);
+ rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG_BE4,
+ B_NCTL_CFG_BE4_SPAGE, 0x0);
+ }
+
+ rtw89_phy_write32(rtwdev, R_RX_IQC_A_BE4 + (path << 8), 0x40000000);
+ }
+}
+
static void rtw8922d_rfk_scan(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
bool start)
@@ -2871,9 +2929,11 @@ static void rtw8922d_rfk_scan(struct rtw89_dev *rtwdev,
if (start) {
__rtw8922d_tssi_disable(rtwdev, rtwvif_link->phy_idx);
__rtw8922d_txiqk_disable(rtwdev);
+ __rtw8922d_rxiqk_disable(rtwdev);
} else {
__rtw8922d_tssi_enable(rtwdev, rtwvif_link->phy_idx);
__rtw8922d_txiqk_enable(rtwdev);
+ __rtw8922d_rxiqk_enable(rtwdev);
}
}
--
2.25.1
next prev parent reply other threads:[~2026-08-26 6:42 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 6:40 [PATCH rtw-next 00/14] wifi: rtw89: update RTL8922D capabilities and settings, and enable P2P device Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 01/14] wifi: rtw89: 8922de: add low latency quirk for Valve device Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 02/14] wifi: rtw89: 8922d: disable VCORE for thermal protection by default Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 03/14] wifi: rtw89: allow two station interfaces in SCC Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 04/14] wifi: rtw89: 8922d: update BB wrapper RFSI ctrl to v4 Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 05/14] wifi: rtw89: 8922d: set BB wrapper settings according to operating channel Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 06/14] wifi: rtw89: 8922d: move conditionally disabled TX shape to common flow Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 07/14] wifi: rtw89: 8922d: update BB wrapper RFSI ctrl to v5 Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 08/14] wifi: rtw89: 8922d: send RFE type to firmware Ping-Ke Shih
2026-08-26 6:40 ` Ping-Ke Shih [this message]
2026-08-26 6:40 ` [PATCH rtw-next 10/14] wifi: rtw89: 8922d: correct selection of CCK rate circuit Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 11/14] wifi: rtw89: chan: introduce helper and refine active list iteration Ping-Ke Shih
2026-08-26 6:40 ` [PATCH rtw-next 12/14] wifi: rtw89: regd: check only active vifs when recalculating 6 GHz power type Ping-Ke Shih
2026-08-26 6:41 ` [PATCH rtw-next 13/14] wifi: rtw89: skip tracking things when entity is paused Ping-Ke Shih
2026-08-26 6:41 ` [PATCH rtw-next 14/14] wifi: rtw89: add p2p device declaration Ping-Ke Shih
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260826064101.58892-10-pkshih@realtek.com \
--to=pkshih@realtek.com \
--cc=echuang@realtek.com \
--cc=henchy.chen@realtek.com \
--cc=kevin_yang@realtek.com \
--cc=linux-wireless@vger.kernel.org \
--cc=owen.hsiao@realtek.com \
--cc=phhuang@realtek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox