* [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions
@ 2025-12-12 3:12 Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 01/12] wifi: rtw89: 8852b: increase beacon loss to 6 seconds Ping-Ke Shih
` (11 more replies)
0 siblings, 12 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
Refine MLO (by patch 2-3) found by test, MCC (by patch 9, 11, 12) getting
better connection stability and SER (by patch 5-8) supporting newer flow.
Others are random features and refinements found in field.
Chih-Kang Chang (3):
wifi: rtw89: refine C2H reg event polling timeout for LPS
wifi: rtw89: setting TBTT AGG number when mac port initialization
wifi: rtw89: mcc: reset probe counter when receiving beacon
Kuan-Chung Chen (3):
wifi: rtw89: 8852b: increase beacon loss to 6 seconds
wifi: rtw89: mlo: fix missing TX null-data 1 during link switch
wifi: rtw89: mlo: fix incorrect link address in management frames
Ping-Ke Shih (2):
wifi: rtw89: mac: reset power state before switching to power on
wifi: rtw89: warn unexpected polling value of XTAL SI
Zong-Zhe Yang (4):
wifi: rtw89: ser: enable error IMR after recovering from L1
wifi: rtw89: ser: L1 skip polling status if FW runs event mode
wifi: rtw89: debug: add ser_counters dbgfs
wifi: rtw89: debug: support SER L0/L1 simulation via halt H2C
drivers/net/wireless/realtek/rtw89/chan.c | 5 +-
drivers/net/wireless/realtek/rtw89/core.c | 13 +-
drivers/net/wireless/realtek/rtw89/core.h | 2 +
drivers/net/wireless/realtek/rtw89/debug.c | 79 ++++++++++
drivers/net/wireless/realtek/rtw89/fw.c | 12 ++
drivers/net/wireless/realtek/rtw89/fw.h | 1 +
drivers/net/wireless/realtek/rtw89/mac.c | 124 +++++++++++++--
drivers/net/wireless/realtek/rtw89/mac.h | 5 +
drivers/net/wireless/realtek/rtw89/mac80211.c | 37 ++---
drivers/net/wireless/realtek/rtw89/mac_be.c | 142 +++++++++++++++++-
drivers/net/wireless/realtek/rtw89/ps.c | 2 +-
drivers/net/wireless/realtek/rtw89/reg.h | 32 +++-
drivers/net/wireless/realtek/rtw89/ser.c | 10 ++
13 files changed, 425 insertions(+), 39 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH rtw-next 01/12] wifi: rtw89: 8852b: increase beacon loss to 6 seconds
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 02/12] wifi: rtw89: mlo: fix missing TX null-data 1 during link switch Ping-Ke Shih
` (10 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Kuan-Chung Chen <damon.chen@realtek.com>
Intermittent beacon loss from a specific AP can lead to
disconnections. Increasing the beacon loss threshold
helps stabilize the connection.
Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/fw.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 7b9d9989e517..0f278476d55b 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -837,6 +837,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 0, CRASH_TRIGGER_TYPE_0),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 0, SCAN_OFFLOAD),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 7, BEACON_FILTER),
+ __CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 15, BEACON_LOSS_COUNT_V1),
__CFG_FW_FEAT(RTL8852B, lt, 0, 29, 30, 0, NO_WOW_CPU_IO_RX),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 127, 0, LPS_DACK_BY_C2H_REG),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, CRASH_TRIGGER_TYPE_1),
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 02/12] wifi: rtw89: mlo: fix missing TX null-data 1 during link switch
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 01/12] wifi: rtw89: 8852b: increase beacon loss to 6 seconds Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 03/12] wifi: rtw89: mlo: fix incorrect link address in management frames Ping-Ke Shih
` (9 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Kuan-Chung Chen <damon.chen@realtek.com>
Fix missing null-data 1 when switching links. The FW should send a
null-data 1 to notify AP before disabling the old link. Adjust the
position of the H2C rtw89_fw_h2c_mlo_link_cfg to ensure proper FW
behavior during link transition.
Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/mac80211.c | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c
index f39ca1c2ed10..e4fc513aa158 100644
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
@@ -1612,12 +1612,23 @@ static int __rtw89_ops_set_vif_links(struct rtw89_dev *rtwdev,
return 0;
}
-static void rtw89_vif_cfg_fw_links(struct rtw89_dev *rtwdev,
- struct rtw89_vif *rtwvif,
- unsigned long links, bool en)
+static void rtw89_vif_update_fw_links(struct rtw89_dev *rtwdev,
+ struct rtw89_vif *rtwvif,
+ u16 current_links, bool en)
{
+ struct rtw89_vif_ml_trans *trans = &rtwvif->ml_trans;
struct rtw89_vif_link *rtwvif_link;
unsigned int link_id;
+ unsigned long links;
+
+ /* Do follow-up when all updating links exist. */
+ if (current_links != trans->mediate_links)
+ return;
+
+ if (en)
+ links = trans->links_to_add;
+ else
+ links = trans->links_to_del;
for_each_set_bit(link_id, &links, IEEE80211_MLD_MAX_NUM_LINKS) {
rtwvif_link = rtwvif->links[link_id];
@@ -1628,20 +1639,6 @@ static void rtw89_vif_cfg_fw_links(struct rtw89_dev *rtwdev,
}
}
-static void rtw89_vif_update_fw_links(struct rtw89_dev *rtwdev,
- struct rtw89_vif *rtwvif,
- u16 current_links)
-{
- struct rtw89_vif_ml_trans *trans = &rtwvif->ml_trans;
-
- /* Do follow-up when all updating links exist. */
- if (current_links != trans->mediate_links)
- return;
-
- rtw89_vif_cfg_fw_links(rtwdev, rtwvif, trans->links_to_del, false);
- rtw89_vif_cfg_fw_links(rtwdev, rtwvif, trans->links_to_add, true);
-}
-
static
int rtw89_ops_change_vif_links(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
@@ -1683,7 +1680,7 @@ int rtw89_ops_change_vif_links(struct ieee80211_hw *hw,
if (rtwdev->scanning)
rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif);
- rtw89_vif_update_fw_links(rtwdev, rtwvif, old_links);
+ rtw89_vif_update_fw_links(rtwdev, rtwvif, old_links, true);
if (!old_links)
__rtw89_ops_clr_vif_links(rtwdev, rtwvif,
@@ -1716,6 +1713,9 @@ int rtw89_ops_change_vif_links(struct ieee80211_hw *hw,
BIT(RTW89_VIF_IDLE_LINK_ID));
}
+ if (!ret)
+ rtw89_vif_update_fw_links(rtwdev, rtwvif, new_links, false);
+
rtw89_enter_ips_by_hwflags(rtwdev);
return ret;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 03/12] wifi: rtw89: mlo: fix incorrect link address in management frames
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 01/12] wifi: rtw89: 8852b: increase beacon loss to 6 seconds Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 02/12] wifi: rtw89: mlo: fix missing TX null-data 1 during link switch Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on Ping-Ke Shih
` (8 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Kuan-Chung Chen <damon.chen@realtek.com>
Deauth frames used wrong link address after switching from default link
to another, causing AP to reject subsequent auth frames. This affected
not only deauth but all management frames. Fixed by setting correct
mac_id to let header conversion references correct address CAM.
Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 0824940c91ae..c2f940381db6 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -548,7 +548,7 @@ rtw89_core_get_tx_type(struct rtw89_dev *rtwdev,
struct ieee80211_hdr *hdr = (void *)skb->data;
__le16 fc = hdr->frame_control;
- if (ieee80211_is_mgmt(fc) || ieee80211_is_nullfunc(fc))
+ if (ieee80211_is_mgmt(fc) || ieee80211_is_any_nullfunc(fc))
return RTW89_CORE_TX_TYPE_MGMT;
return RTW89_CORE_TX_TYPE_DATA;
@@ -833,6 +833,7 @@ rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
desc_info->qsel = qsel;
desc_info->ch_dma = ch_dma;
+ desc_info->sw_mld = true;
desc_info->port = desc_info->hiq ? rtwvif_link->port : 0;
desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
desc_info->hw_ssn_sel = RTW89_MGMT_HW_SSN_SEL;
@@ -1051,6 +1052,7 @@ rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev,
desc_info->ch_dma = ch_dma;
desc_info->tid_indicate = tid_indicate;
desc_info->qsel = qsel;
+ desc_info->sw_mld = false;
desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req);
desc_info->port = desc_info->hiq ? rtwvif_link->port : 0;
desc_info->er_cap = rtwsta_link ? rtwsta_link->er_cap : false;
@@ -1326,7 +1328,7 @@ int rtw89_h2c_tx(struct rtw89_dev *rtwdev,
static int rtw89_core_tx_write_link(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link,
- struct sk_buff *skb, int *qsel, bool sw_mld,
+ struct sk_buff *skb, int *qsel,
struct rtw89_tx_wait_info *wait)
{
struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
@@ -1341,7 +1343,6 @@ static int rtw89_core_tx_write_link(struct rtw89_dev *rtwdev,
tx_req.sta = sta;
tx_req.rtwvif_link = rtwvif_link;
tx_req.rtwsta_link = rtwsta_link;
- tx_req.desc_info.sw_mld = sw_mld;
rcu_assign_pointer(skb_data->wait, wait);
rtw89_traffic_stats_accu(rtwdev, rtwvif, skb, true, true);
@@ -1385,8 +1386,7 @@ int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
}
}
- return rtw89_core_tx_write_link(rtwdev, rtwvif_link, rtwsta_link, skb, qsel, false,
- NULL);
+ return rtw89_core_tx_write_link(rtwdev, rtwvif_link, rtwsta_link, skb, qsel, NULL);
}
static __le32 rtw89_build_txwd_body0(struct rtw89_tx_desc_info *desc_info)
@@ -4091,8 +4091,7 @@ int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rt
goto out;
}
- ret = rtw89_core_tx_write_link(rtwdev, rtwvif_link, rtwsta_link, skb, &qsel, true,
- wait);
+ ret = rtw89_core_tx_write_link(rtwdev, rtwvif_link, rtwsta_link, skb, &qsel, wait);
if (ret) {
rtw89_warn(rtwdev, "nullfunc transmit failed: %d\n", ret);
dev_kfree_skb_any(skb);
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (2 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 03/12] wifi: rtw89: mlo: fix incorrect link address in management frames Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-14 22:30 ` Bitterblue Smith
2025-12-12 3:12 ` [PATCH rtw-next 05/12] wifi: rtw89: ser: enable error IMR after recovering from L1 Ping-Ke Shih
` (7 subsequent siblings)
11 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
To run power on function properly, reset power states (off/on/PS) to
initial state. Otherwise, it might be unusable due to fail to power on.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
drivers/net/wireless/realtek/rtw89/mac.h | 1 +
drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
4 files changed, 240 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index d78fbe73e365..ba4344a640f5 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
{
-#define PWR_ACT 1
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
const struct rtw89_chip_info *chip = rtwdev->chip;
const struct rtw89_pwr_cfg * const *cfg_seq;
int (*cfg_func)(struct rtw89_dev *rtwdev);
int ret;
- u8 val;
rtw89_mac_power_switch_boot_mode(rtwdev);
@@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
__rtw89_leave_ps_mode(rtwdev);
- val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
- if (on && val == PWR_ACT) {
- rtw89_err(rtwdev, "MAC has already powered on\n");
- return -EBUSY;
+ if (on) {
+ ret = mac->reset_pwr_state(rtwdev);
+ if (ret)
+ return ret;
}
ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
@@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
}
return 0;
-#undef PWR_ACT
}
int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
@@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
return 0;
}
+static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
+{
+ enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
+ u32 val32;
+ int ret;
+
+ val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
+ val32 &= WLAN_FSM_MASK;
+ val32 |= WLAN_FSM_SET;
+ rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
+ 1000, 2000000, false,
+ rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
+ return ret;
+ }
+
+ val32 = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
+ if (val32 == MAC_AX_MAC_OFF) {
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ } else if (val32 == MAC_AX_MAC_ON) {
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
+ 1000, 2000000, false,
+ rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ } else if (val32 == MAC_AX_MAC_LPS) {
+ rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_FORCE_LEAVE_LPS);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_ON,
+ 1000, 2000000, false,
+ rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC STS timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
+ 1000, 2000000, false,
+ rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_AX_WLLPS_CTRL, B_AX_FORCE_LEAVE_LPS);
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ }
+
+ switch (chip_id) {
+ case RTL8852A:
+ case RTL8852B:
+ case RTL8851B:
+ rtw89_write32_clr(rtwdev, R_AX_AFE_CTRL1, B_AX_CMAC_CLK_SEL);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
static void rtw89_disable_fw_watchdog(struct rtw89_dev *rtwdev)
{
u32 val32;
@@ -7206,6 +7280,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
.set_cpuio = set_cpuio_ax,
.dle_quota_change = dle_quota_change_ax,
+ .reset_pwr_state = rtw89_mac_reset_pwr_state_ax,
.disable_cpu = rtw89_mac_disable_cpu_ax,
.fwdl_enable_wcpu = rtw89_mac_enable_cpu_ax,
.fwdl_get_status = rtw89_fw_get_rdy_ax,
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
index 0007229d6753..9ec70729e9e1 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.h
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
@@ -1052,6 +1052,7 @@ struct rtw89_mac_gen_def {
struct rtw89_cpuio_ctrl *ctrl_para, bool wd);
int (*dle_quota_change)(struct rtw89_dev *rtwdev, bool band1_en);
+ int (*reset_pwr_state)(struct rtw89_dev *rtwdev);
void (*disable_cpu)(struct rtw89_dev *rtwdev);
int (*fwdl_enable_wcpu)(struct rtw89_dev *rtwdev, u8 boot_reason,
bool dlfw, bool include_bb);
diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
index 556e5f98e8d4..65c0c0de3a30 100644
--- a/drivers/net/wireless/realtek/rtw89/mac_be.c
+++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
@@ -425,6 +425,135 @@ int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
return 0;
}
+static int rtw89_mac_reset_pwr_state_be(struct rtw89_dev *rtwdev)
+{
+ u32 val32;
+ int ret;
+
+ val32 = rtw89_read32(rtwdev, R_BE_SYSON_FSM_MON);
+ val32 &= WLAN_FSM_MASK;
+ val32 |= WLAN_FSM_SET;
+ rtw89_write32(rtwdev, R_BE_SYSON_FSM_MON, val32);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
+ 1000, 2000000, false,
+ rtwdev, R_BE_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
+ return ret;
+ }
+
+ val32 = rtw89_read32_mask(rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK);
+ if (val32 == MAC_AX_MAC_OFF) {
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL,
+ B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
+ } else if (val32 == MAC_AX_MAC_ON) {
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL,
+ B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
+ rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
+ 1000, 2000000, false,
+ rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
+ } else if (val32 == MAC_AX_MAC_LPS) {
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL,
+ B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
+ 1000, 2000000, false,
+ rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_set(rtwdev, R_BE_WLLPS_CTRL, B_BE_FORCE_LEAVE_LPS);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_ON,
+ 1000, 2000000, false,
+ rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC STS timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
+ rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
+
+ ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
+ 1000, 2000000, false,
+ rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
+ if (ret) {
+ rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
+ return ret;
+ }
+
+ rtw89_write32_clr(rtwdev, R_BE_WLLPS_CTRL, B_BE_FORCE_LEAVE_LPS);
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
+ rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
+ }
+
+ return 0;
+}
+
static void rtw89_mac_disable_cpu_be(struct rtw89_dev *rtwdev)
{
u32 val32;
@@ -2623,6 +2752,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
.set_cpuio = set_cpuio_be,
.dle_quota_change = dle_quota_change_be,
+ .reset_pwr_state = rtw89_mac_reset_pwr_state_be,
.disable_cpu = rtw89_mac_disable_cpu_be,
.fwdl_enable_wcpu = rtw89_mac_fwdl_enable_wcpu_be,
.fwdl_get_status = fwdl_get_status_be,
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 5b4a459cf29c..fb641cefa4c9 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -149,6 +149,7 @@
#define R_AX_WLLPS_CTRL 0x0090
#define B_AX_LPSOP_ASWRM BIT(17)
#define B_AX_LPSOP_DSWRM BIT(9)
+#define B_AX_FORCE_LEAVE_LPS BIT(3)
#define B_AX_DIS_WLBT_LPSEN_LOPC BIT(1)
#define SW_LPS_OPTION 0x0001A0B2
@@ -313,6 +314,9 @@
#define R_AX_IC_PWR_STATE 0x03F0
#define B_AX_WHOLE_SYS_PWR_STE_MASK GENMASK(25, 16)
#define B_AX_WLMAC_PWR_STE_MASK GENMASK(9, 8)
+#define MAC_AX_MAC_OFF 0
+#define MAC_AX_MAC_ON 1
+#define MAC_AX_MAC_LPS 2
#define B_AX_UART_HCISYS_PWR_STE_MASK GENMASK(7, 6)
#define B_AX_SDIO_HCISYS_PWR_STE_MASK GENMASK(5, 4)
#define B_AX_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2)
@@ -2094,6 +2098,7 @@
#define B_AX_B1_ISR_ERR_USRCTL_REINIT BIT(0)
#define R_AX_AFE_CTRL1 0x0024
+#define B_AX_CMAC_CLK_SEL BIT(21)
#define B_AX_R_SYM_WLCMAC1_P4_PC_EN BIT(4)
#define B_AX_R_SYM_WLCMAC1_P3_PC_EN BIT(3)
@@ -2107,6 +2112,12 @@
#define B_AX_R_SYM_FEN_WLBBFUN_1 BIT(16)
#define B_AX_R_SYM_ISO_CMAC12PP BIT(5)
+#define R_AX_SYSON_FSM_MON 0x00A0
+#define B_AX_FSM_MON_SEL_MASK GENMASK(26, 24)
+#define B_AX_DOP_ELDO BIT(23)
+#define B_AX_FSM_MON_UPD BIT(15)
+#define B_AX_FSM_PAR_MASK GENMASK(14, 0)
+
#define R_AX_CMAC_REG_START 0xC000
#define R_AX_CMAC_FUNC_EN 0xC000
@@ -4172,6 +4183,22 @@
#define B_BE_LPSROP_LOWPWRPLL BIT(7)
#define B_BE_LPSROP_DSWRSD_SEL_MASK GENMASK(5, 4)
+#define R_BE_SYSON_FSM_MON 0x00A0
+#define B_BE_FSM_MON_SEL_MASK GENMASK(26, 24)
+#define B_BE_DOP_ELDO BIT(23)
+#define B_BE_AFE_PLL_BYPASS BIT(22)
+#define B_BE_PON_SWR_BYPASS BIT(21)
+#define B_BE_PON_ADIE_BYPASS BIT(20)
+#define B_BE_AFE_LS_BYPASS BIT(19)
+#define B_BE_BTPMC_XTAL_SI_BYPASS BIT(17)
+#define B_BE_WLPMC_XTAL_SI_BYPASS BIT(16)
+#define B_BE_FSM_MON_UPD BIT(15)
+#define B_BE_FSM_PAR_MASK GENMASK(14, 0)
+#define WLAN_FSM_MASK 0xFFFFFF
+#define WLAN_FSM_SET 0x4000000
+#define WLAN_FSM_STATE_MASK 0x1FF
+#define WLAN_FSM_IDLE 0
+
#define R_BE_EFUSE_CTRL_2_V1 0x00A4
#define B_BE_EF_ENT BIT(31)
#define B_BE_EF_TCOLUMN_EN BIT(29)
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 05/12] wifi: rtw89: ser: enable error IMR after recovering from L1
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (3 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 06/12] wifi: rtw89: ser: L1 skip polling status if FW runs event mode Ping-Ke Shih
` (6 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Zong-Zhe Yang <kevin_yang@realtek.com>
After recovering from L1, explicitly enable error IMR to ensure next
L1 SER (system error recovery) can work normally.
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/mac.c | 1 +
drivers/net/wireless/realtek/rtw89/mac.h | 1 +
drivers/net/wireless/realtek/rtw89/mac_be.c | 1 +
drivers/net/wireless/realtek/rtw89/ser.c | 10 ++++++++++
4 files changed, 13 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index ba4344a640f5..10d4919d43d3 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -7258,6 +7258,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
.check_mac_en = rtw89_mac_check_mac_en_ax,
.sys_init = sys_init_ax,
.trx_init = trx_init_ax,
+ .err_imr_ctrl = err_imr_ctrl_ax,
.hci_func_en = rtw89_mac_hci_func_en_ax,
.dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_ax,
.dle_func_en = dle_func_en_ax,
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
index 9ec70729e9e1..9941d500bc68 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.h
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
@@ -1019,6 +1019,7 @@ struct rtw89_mac_gen_def {
enum rtw89_mac_hwmod_sel sel);
int (*sys_init)(struct rtw89_dev *rtwdev);
int (*trx_init)(struct rtw89_dev *rtwdev);
+ void (*err_imr_ctrl)(struct rtw89_dev *rtwdev, bool en);
void (*hci_func_en)(struct rtw89_dev *rtwdev);
void (*dmac_func_pre_en)(struct rtw89_dev *rtwdev);
void (*dle_func_en)(struct rtw89_dev *rtwdev, bool enable);
diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
index 65c0c0de3a30..2bc329c13443 100644
--- a/drivers/net/wireless/realtek/rtw89/mac_be.c
+++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
@@ -2730,6 +2730,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
.check_mac_en = rtw89_mac_check_mac_en_be,
.sys_init = sys_init_be,
.trx_init = trx_init_be,
+ .err_imr_ctrl = err_imr_ctrl_be,
.hci_func_en = rtw89_mac_hci_func_en_be,
.dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_be,
.dle_func_en = dle_func_en_be,
diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c
index f99e179f7ff9..7fdc69578da3 100644
--- a/drivers/net/wireless/realtek/rtw89/ser.c
+++ b/drivers/net/wireless/realtek/rtw89/ser.c
@@ -431,6 +431,14 @@ static void hal_send_m4_event(struct rtw89_ser *ser)
rtw89_mac_set_err_status(rtwdev, MAC_AX_ERR_L1_RCVY_EN);
}
+static void hal_enable_err_imr(struct rtw89_ser *ser)
+{
+ struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser);
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+
+ mac->err_imr_ctrl(rtwdev, true);
+}
+
/* state handler */
static void ser_idle_st_hdl(struct rtw89_ser *ser, u8 evt)
{
@@ -552,6 +560,8 @@ static void ser_do_hci_st_hdl(struct rtw89_ser *ser, u8 evt)
break;
case SER_EV_MAC_RESET_DONE:
+ hal_enable_err_imr(ser);
+
ser_state_goto(ser, SER_IDLE_ST);
break;
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 06/12] wifi: rtw89: ser: L1 skip polling status if FW runs event mode
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (4 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 05/12] wifi: rtw89: ser: enable error IMR after recovering from L1 Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 07/12] wifi: rtw89: debug: add ser_counters dbgfs Ping-Ke Shih
` (5 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Zong-Zhe Yang <kevin_yang@realtek.com>
Originally, polling FW status was required during recovering from L1.
Now, because newer FW support event mode, the polling can be skipped.
Add a FW feature flag and configure the supported chips.
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/fw.c | 4 ++++
drivers/net/wireless/realtek/rtw89/mac.c | 11 +++++++++--
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index a9cb47ea0b93..12dc81efa6be 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -4680,6 +4680,7 @@ enum rtw89_fw_feature {
RTW89_FW_FEATURE_LPS_DACK_BY_C2H_REG,
RTW89_FW_FEATURE_BEACON_TRACKING,
RTW89_FW_FEATURE_ADDR_CAM_V0,
+ RTW89_FW_FEATURE_SER_L1_BY_EVENT,
};
struct rtw89_fw_suit {
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 0f278476d55b..7150892a6274 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -826,6 +826,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 37, 1, TX_WAKE),
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 37, 1, SCAN_OFFLOAD),
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 41, 0, CRASH_TRIGGER_TYPE_0),
+ __CFG_FW_FEAT(RTL8851B, ge, 0, 29, 127, 0, SER_L1_BY_EVENT),
__CFG_FW_FEAT(RTL8852A, le, 0, 13, 29, 0, OLD_HT_RA_FORMAT),
__CFG_FW_FEAT(RTL8852A, ge, 0, 13, 35, 0, SCAN_OFFLOAD),
__CFG_FW_FEAT(RTL8852A, ge, 0, 13, 35, 0, TX_WAKE),
@@ -840,6 +841,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 29, 15, BEACON_LOSS_COUNT_V1),
__CFG_FW_FEAT(RTL8852B, lt, 0, 29, 30, 0, NO_WOW_CPU_IO_RX),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 127, 0, LPS_DACK_BY_C2H_REG),
+ __CFG_FW_FEAT(RTL8852B, ge, 0, 29, 127, 0, SER_L1_BY_EVENT),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, CRASH_TRIGGER_TYPE_1),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, SCAN_OFFLOAD_EXTRA_OP),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, BEACON_TRACKING),
@@ -852,6 +854,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, SCAN_OFFLOAD_EXTRA_OP),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, LPS_DACK_BY_C2H_REG),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, CRASH_TRIGGER_TYPE_1),
+ __CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, SER_L1_BY_EVENT),
__CFG_FW_FEAT(RTL8852C, le, 0, 27, 33, 0, NO_DEEP_PS),
__CFG_FW_FEAT(RTL8852C, ge, 0, 0, 0, 0, RFK_NTFY_MCC_V0),
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
@@ -863,6 +866,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 128, 0, LPS_DACK_BY_C2H_REG),
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 128, 0, CRASH_TRIGGER_TYPE_1),
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 129, 1, BEACON_TRACKING),
+ __CFG_FW_FEAT(RTL8852C, ge, 0, 29, 94, 0, SER_L1_BY_EVENT),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 30, 0, CRASH_TRIGGER_TYPE_0),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 11, 0, MACID_PAUSE_SLEEP),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 35, 0, SCAN_OFFLOAD),
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 10d4919d43d3..cf36be167162 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -848,6 +848,7 @@ EXPORT_SYMBOL(rtw89_mac_get_err_status);
int rtw89_mac_set_err_status(struct rtw89_dev *rtwdev, u32 err)
{
struct rtw89_ser *ser = &rtwdev->ser;
+ bool ser_l1_hdl = false;
u32 halt;
int ret = 0;
@@ -856,6 +857,12 @@ int rtw89_mac_set_err_status(struct rtw89_dev *rtwdev, u32 err)
return -EINVAL;
}
+ if (err == MAC_AX_ERR_L1_DISABLE_EN || err == MAC_AX_ERR_L1_RCVY_EN)
+ ser_l1_hdl = true;
+
+ if (RTW89_CHK_FW_FEATURE(SER_L1_BY_EVENT, &rtwdev->fw) && ser_l1_hdl)
+ goto set;
+
ret = read_poll_timeout(rtw89_read32, halt, (halt == 0x0), 1000,
100000, false, rtwdev, R_AX_HALT_H2C_CTRL);
if (ret) {
@@ -863,10 +870,10 @@ int rtw89_mac_set_err_status(struct rtw89_dev *rtwdev, u32 err)
return -EFAULT;
}
+set:
rtw89_write32(rtwdev, R_AX_HALT_H2C, err);
- if (ser->prehandle_l1 &&
- (err == MAC_AX_ERR_L1_DISABLE_EN || err == MAC_AX_ERR_L1_RCVY_EN))
+ if (ser->prehandle_l1 && ser_l1_hdl)
return 0;
rtw89_write32(rtwdev, R_AX_HALT_H2C_CTRL, B_AX_HALT_H2C_TRIGGER);
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 07/12] wifi: rtw89: debug: add ser_counters dbgfs
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (5 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 06/12] wifi: rtw89: ser: L1 skip polling status if FW runs event mode Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 08/12] wifi: rtw89: debug: support SER L0/L1 simulation via halt H2C Ping-Ke Shih
` (4 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Zong-Zhe Yang <kevin_yang@realtek.com>
Dump counters of SER (system error recoery) L0/L1 related cases.
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/debug.c | 57 ++++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/reg.h | 5 +-
2 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
index 1264c2f82600..0d9a158f6df1 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.c
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
@@ -79,6 +79,7 @@ struct rtw89_debugfs {
struct rtw89_debugfs_priv send_h2c;
struct rtw89_debugfs_priv early_h2c;
struct rtw89_debugfs_priv fw_crash;
+ struct rtw89_debugfs_priv ser_counters;
struct rtw89_debugfs_priv btc_info;
struct rtw89_debugfs_priv btc_manual;
struct rtw89_debugfs_priv fw_log_manual;
@@ -3680,6 +3681,60 @@ rtw89_debug_priv_fw_crash_set(struct rtw89_dev *rtwdev,
return count;
}
+struct rtw89_dbg_ser_counters {
+ unsigned int l0;
+ unsigned int l1;
+ unsigned int l0_to_l1;
+};
+
+static void rtw89_dbg_get_ser_counters_ax(struct rtw89_dev *rtwdev,
+ struct rtw89_dbg_ser_counters *cnt)
+{
+ const u32 val = rtw89_read32(rtwdev, R_AX_SER_DBG_INFO);
+
+ cnt->l0 = u32_get_bits(val, B_AX_SER_L0_COUNTER_MASK);
+ cnt->l1 = u32_get_bits(val, B_AX_SER_L1_COUNTER_MASK);
+ cnt->l0_to_l1 = u32_get_bits(val, B_AX_L0_TO_L1_EVENT_MASK);
+}
+
+static void rtw89_dbg_get_ser_counters_be(struct rtw89_dev *rtwdev,
+ struct rtw89_dbg_ser_counters *cnt)
+{
+ const u32 val = rtw89_read32(rtwdev, R_BE_SER_DBG_INFO);
+
+ cnt->l0 = u32_get_bits(val, B_BE_SER_L0_COUNTER_MASK);
+ cnt->l1 = u32_get_bits(val, B_BE_SER_L1_COUNTER_MASK);
+ cnt->l0_to_l1 = u32_get_bits(val, B_BE_SER_L0_PROMOTE_L1_EVENT_MASK);
+}
+
+static ssize_t rtw89_debug_priv_ser_counters_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
+{
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_dbg_ser_counters cnt = {};
+ char *p = buf, *end = buf + bufsz;
+
+ rtw89_leave_ps_mode(rtwdev);
+
+ switch (chip->chip_gen) {
+ case RTW89_CHIP_AX:
+ rtw89_dbg_get_ser_counters_ax(rtwdev, &cnt);
+ break;
+ case RTW89_CHIP_BE:
+ rtw89_dbg_get_ser_counters_be(rtwdev, &cnt);
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ p += scnprintf(p, end - p, "SER L0 Count: %d\n", cnt.l0);
+ p += scnprintf(p, end - p, "SER L1 Count: %d\n", cnt.l1);
+ p += scnprintf(p, end - p, "SER L0 promote event: %d\n", cnt.l0_to_l1);
+
+ return p - buf;
+}
+
static ssize_t rtw89_debug_priv_btc_info_get(struct rtw89_dev *rtwdev,
struct rtw89_debugfs_priv *debugfs_priv,
char *buf, size_t bufsz)
@@ -4767,6 +4822,7 @@ static const struct rtw89_debugfs rtw89_debugfs_templ = {
.send_h2c = rtw89_debug_priv_set(send_h2c),
.early_h2c = rtw89_debug_priv_set_and_get(early_h2c, RWLOCK),
.fw_crash = rtw89_debug_priv_set_and_get(fw_crash, WLOCK),
+ .ser_counters = rtw89_debug_priv_get(ser_counters, RLOCK),
.btc_info = rtw89_debug_priv_get(btc_info, RSIZE_12K),
.btc_manual = rtw89_debug_priv_set(btc_manual),
.fw_log_manual = rtw89_debug_priv_set(fw_log_manual, WLOCK),
@@ -4814,6 +4870,7 @@ void rtw89_debugfs_add_sec1(struct rtw89_dev *rtwdev, struct dentry *debugfs_top
rtw89_debugfs_add_w(send_h2c);
rtw89_debugfs_add_rw(early_h2c);
rtw89_debugfs_add_rw(fw_crash);
+ rtw89_debugfs_add_r(ser_counters);
rtw89_debugfs_add_r(btc_info);
rtw89_debugfs_add_w(btc_manual);
rtw89_debugfs_add_w(fw_log_manual);
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index fb641cefa4c9..28ceab7726c6 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -607,6 +607,9 @@
#define R_AX_SER_DBG_INFO 0x8424
#define B_AX_L0_TO_L1_EVENT_MASK GENMASK(31, 28)
+#define B_AX_SER_L1_COUNTER_MASK GENMASK(27, 24)
+#define B_AX_RMAC_PPDU_HANG_CNT_MASK GENMASK(23, 16)
+#define B_AX_SER_L0_COUNTER_MASK GENMASK(7, 0)
#define R_AX_DLE_EMPTY0 0x8430
#define B_AX_PLE_EMPTY_QTA_DMAC_CPUIO BIT(26)
@@ -4731,7 +4734,7 @@
#define B_BE_SER_L0_PROMOTE_L1_EVENT_MASK GENMASK(31, 28)
#define B_BE_SER_L1_COUNTER_MASK GENMASK(27, 24)
#define B_BE_RMAC_PPDU_HANG_CNT_MASK GENMASK(23, 16)
-#define B_BE_SER_L0_COUNTER_MASK GENMASK(8, 0)
+#define B_BE_SER_L0_COUNTER_MASK GENMASK(7, 0)
#define R_BE_DMAC_SYS_CR32B 0x842C
#define B_BE_DMAC_BB_PHY1_MASK GENMASK(31, 16)
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 08/12] wifi: rtw89: debug: support SER L0/L1 simulation via halt H2C
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (6 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 07/12] wifi: rtw89: debug: add ser_counters dbgfs Ping-Ke Shih
@ 2025-12-12 3:12 ` Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 09/12] wifi: rtw89: refine C2H reg event polling timeout for LPS Ping-Ke Shih
` (3 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:12 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Zong-Zhe Yang <kevin_yang@realtek.com>
Original methods of SER (system error recovery) L0/L1 simulations need
to leave PS mode before working. Introduce new methods to simulate SER
L0/L1 and they can work under PS. Since new methods require FW support,
so add a FW feature flag and configure the supported chips.
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/debug.c | 22 ++++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/fw.c | 4 ++++
drivers/net/wireless/realtek/rtw89/mac.h | 3 +++
4 files changed, 30 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 12dc81efa6be..d3f50952a334 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -4681,6 +4681,7 @@ enum rtw89_fw_feature {
RTW89_FW_FEATURE_BEACON_TRACKING,
RTW89_FW_FEATURE_ADDR_CAM_V0,
RTW89_FW_FEATURE_SER_L1_BY_EVENT,
+ RTW89_FW_FEATURE_SIM_SER_L0L1_BY_HALT_H2C,
};
struct rtw89_fw_suit {
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
index 0d9a158f6df1..2b48ccea27fb 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.c
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
@@ -3538,6 +3538,14 @@ rtw89_debug_priv_early_h2c_set(struct rtw89_dev *rtwdev,
return count;
}
+static int rtw89_dbg_trigger_ctrl_error_by_halt_h2c(struct rtw89_dev *rtwdev)
+{
+ if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
+ return -EBUSY;
+
+ return rtw89_mac_set_err_status(rtwdev, MAC_AX_ERR_L1_RESET_FORCE);
+}
+
static int rtw89_dbg_trigger_ctrl_error(struct rtw89_dev *rtwdev)
{
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
@@ -3545,6 +3553,9 @@ static int rtw89_dbg_trigger_ctrl_error(struct rtw89_dev *rtwdev)
u16 pkt_id;
int ret;
+ if (RTW89_CHK_FW_FEATURE(SIM_SER_L0L1_BY_HALT_H2C, &rtwdev->fw))
+ return rtw89_dbg_trigger_ctrl_error_by_halt_h2c(rtwdev);
+
rtw89_leave_ps_mode(rtwdev);
ret = mac->dle_buf_req(rtwdev, 0x20, true, &pkt_id);
@@ -3601,10 +3612,21 @@ static int rtw89_dbg_trigger_mac_error_be(struct rtw89_dev *rtwdev)
return 0;
}
+static int rtw89_dbg_trigger_mac_error_by_halt_h2c(struct rtw89_dev *rtwdev)
+{
+ if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
+ return -EBUSY;
+
+ return rtw89_mac_set_err_status(rtwdev, MAC_AX_ERR_L0_RESET_FORCE);
+}
+
static int rtw89_dbg_trigger_mac_error(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ if (RTW89_CHK_FW_FEATURE(SIM_SER_L0L1_BY_HALT_H2C, &rtwdev->fw))
+ return rtw89_dbg_trigger_mac_error_by_halt_h2c(rtwdev);
+
rtw89_leave_ps_mode(rtwdev);
switch (chip->chip_gen) {
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 7150892a6274..4e51ffb5be21 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -827,6 +827,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 37, 1, SCAN_OFFLOAD),
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 41, 0, CRASH_TRIGGER_TYPE_0),
__CFG_FW_FEAT(RTL8851B, ge, 0, 29, 127, 0, SER_L1_BY_EVENT),
+ __CFG_FW_FEAT(RTL8851B, ge, 0, 29, 130, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8852A, le, 0, 13, 29, 0, OLD_HT_RA_FORMAT),
__CFG_FW_FEAT(RTL8852A, ge, 0, 13, 35, 0, SCAN_OFFLOAD),
__CFG_FW_FEAT(RTL8852A, ge, 0, 13, 35, 0, TX_WAKE),
@@ -845,6 +846,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, CRASH_TRIGGER_TYPE_1),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, SCAN_OFFLOAD_EXTRA_OP),
__CFG_FW_FEAT(RTL8852B, ge, 0, 29, 128, 0, BEACON_TRACKING),
+ __CFG_FW_FEAT(RTL8852B, ge, 0, 29, 130, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 74, 0, NO_LPS_PG),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 74, 0, TX_WAKE),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 90, 0, CRASH_TRIGGER_TYPE_0),
@@ -855,6 +857,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, LPS_DACK_BY_C2H_REG),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, CRASH_TRIGGER_TYPE_1),
__CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 127, 0, SER_L1_BY_EVENT),
+ __CFG_FW_FEAT(RTL8852BT, ge, 0, 29, 130, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8852C, le, 0, 27, 33, 0, NO_DEEP_PS),
__CFG_FW_FEAT(RTL8852C, ge, 0, 0, 0, 0, RFK_NTFY_MCC_V0),
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 34, 0, TX_WAKE),
@@ -867,6 +870,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 128, 0, CRASH_TRIGGER_TYPE_1),
__CFG_FW_FEAT(RTL8852C, ge, 0, 27, 129, 1, BEACON_TRACKING),
__CFG_FW_FEAT(RTL8852C, ge, 0, 29, 94, 0, SER_L1_BY_EVENT),
+ __CFG_FW_FEAT(RTL8852C, ge, 0, 29, 130, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 30, 0, CRASH_TRIGGER_TYPE_0),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 11, 0, MACID_PAUSE_SLEEP),
__CFG_FW_FEAT(RTL8922A, ge, 0, 34, 35, 0, SCAN_OFFLOAD),
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
index 9941d500bc68..9d0c491f053f 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.h
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
@@ -914,6 +914,9 @@ enum mac_ax_err_info {
MAC_AX_ERR_L0_CFG_DIS_NOTIFY = 0x0011,
MAC_AX_ERR_L0_CFG_HANDSHAKE = 0x0012,
MAC_AX_ERR_L0_RCVY_EN = 0x0013,
+ MAC_AX_ERR_L0_RESET_FORCE = 0x0020,
+ MAC_AX_ERR_L0_RESET_FORCE_C1 = 0x0021,
+ MAC_AX_ERR_L1_RESET_FORCE = 0x0022,
MAC_AX_SET_ERR_MAX,
};
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 09/12] wifi: rtw89: refine C2H reg event polling timeout for LPS
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (7 preceding siblings ...)
2025-12-12 3:12 ` [PATCH rtw-next 08/12] wifi: rtw89: debug: support SER L0/L1 simulation via halt H2C Ping-Ke Shih
@ 2025-12-12 3:13 ` Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI Ping-Ke Shih
` (2 subsequent siblings)
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:13 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Chih-Kang Chang <gary.chang@realtek.com>
The each of C2H reg event have different polling timeout. Refine the
LPS C2H reg event polling timeout. Otherwise, during SER, the FW has
already crashed, the leave LPS check will wait until timeout expires,
causing the SER recovery to take too long.
Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/fw.c | 3 +++
drivers/net/wireless/realtek/rtw89/fw.h | 1 +
drivers/net/wireless/realtek/rtw89/ps.c | 2 +-
3 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 4e51ffb5be21..fd49e651aeed 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -7053,6 +7053,9 @@ static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,
else
timeout = RTW89_C2H_TIMEOUT;
+ if (info->timeout)
+ timeout = info->timeout;
+
ret = read_poll_timeout_atomic(rtw89_read8, val, val, 1,
timeout, false, rtwdev,
chip->c2h_ctrl_reg);
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index cedb4a47a769..dfae652686cd 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -120,6 +120,7 @@ struct rtw89_h2creg_sch_tx_en {
struct rtw89_mac_c2h_info {
u8 id;
u8 content_len;
+ u32 timeout;
union {
u32 c2hreg[RTW89_C2HREG_MAX];
struct rtw89_c2hreg_hdr hdr;
diff --git a/drivers/net/wireless/realtek/rtw89/ps.c b/drivers/net/wireless/realtek/rtw89/ps.c
index 3f69dd4361c3..abd8aee02b47 100644
--- a/drivers/net/wireless/realtek/rtw89/ps.c
+++ b/drivers/net/wireless/realtek/rtw89/ps.c
@@ -16,7 +16,7 @@
static int rtw89_fw_receive_lps_h2c_check(struct rtw89_dev *rtwdev, u8 macid)
{
- struct rtw89_mac_c2h_info c2h_info = {};
+ struct rtw89_mac_c2h_info c2h_info = {.timeout = 5000};
u16 c2hreg_macid;
u32 c2hreg_ret;
int ret;
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (8 preceding siblings ...)
2025-12-12 3:13 ` [PATCH rtw-next 09/12] wifi: rtw89: refine C2H reg event polling timeout for LPS Ping-Ke Shih
@ 2025-12-12 3:13 ` Ping-Ke Shih
2025-12-14 22:32 ` Bitterblue Smith
2025-12-12 3:13 ` [PATCH rtw-next 11/12] wifi: rtw89: setting TBTT AGG number when mac port initialization Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 12/12] wifi: rtw89: mcc: reset probe counter when receiving beacon Ping-Ke Shih
11 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:13 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
XTAL SI is an indirect serial interface to access registers in another
hardware domain. When BT driver initializes UART interface, firmware might
rarely control XTAL SI at the same time causing access racing.
Current is to adjust initialization flow to avoid the racing. To make
the racing visible if it still presents, add a message to address this.
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/mac.c | 11 ++++++++++-
drivers/net/wireless/realtek/rtw89/mac_be.c | 11 ++++++++++-
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index cf36be167162..066c99f3e53a 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -7023,6 +7023,11 @@ int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 m
return ret;
}
+ if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset ||
+ u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK) != val)
+ rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
+ offset, val, val32);
+
return 0;
}
@@ -7046,7 +7051,11 @@ int rtw89_mac_read_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
return ret;
}
- *val = rtw89_read8(rtwdev, R_AX_WLAN_XTAL_SI_CTRL + 1);
+ if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset)
+ rtw89_warn(rtwdev, "xtal si read: offset=%x poll=%x\n",
+ offset, val32);
+
+ *val = u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK);
return 0;
}
diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
index 2bc329c13443..d75c55cc34b8 100644
--- a/drivers/net/wireless/realtek/rtw89/mac_be.c
+++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
@@ -396,6 +396,11 @@ int rtw89_mac_write_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 m
return ret;
}
+ if (u32_get_bits(val32, B_BE_WL_XTAL_SI_ADDR_MASK) != offset ||
+ u32_get_bits(val32, B_BE_WL_XTAL_SI_DATA_MASK) != val)
+ rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
+ offset, val, val32);
+
return 0;
}
@@ -420,7 +425,11 @@ int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
return ret;
}
- *val = rtw89_read8(rtwdev, R_BE_WLAN_XTAL_SI_CTRL + 1);
+ if (u32_get_bits(val32, B_BE_WL_XTAL_SI_ADDR_MASK) != offset)
+ rtw89_warn(rtwdev, "xtal si read: offset=%x poll=%x\n",
+ offset, val32);
+
+ *val = u32_get_bits(val32, B_BE_WL_XTAL_SI_DATA_MASK);
return 0;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 11/12] wifi: rtw89: setting TBTT AGG number when mac port initialization
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (9 preceding siblings ...)
2025-12-12 3:13 ` [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI Ping-Ke Shih
@ 2025-12-12 3:13 ` Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 12/12] wifi: rtw89: mcc: reset probe counter when receiving beacon Ping-Ke Shih
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:13 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Chih-Kang Chang <gary.chang@realtek.com>
When initializing mac port, needs to set TBTT AGG number to trigger TBTT
related interrupts. Otherwise, after sending join info H2C command with
disconnection mode, firmware will clear TBTT AGG number. Without the
setting from mac port initialization after that, this port will not be
able to transmit beacons.
Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/mac.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 066c99f3e53a..7ffb039e7d1b 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -4422,6 +4422,7 @@ static void rtw89_mac_bcn_drop(struct rtw89_dev *rtwdev,
#define BCN_HOLD_DEF 200
#define BCN_MASK_DEF 0
#define TBTT_ERLY_DEF 5
+#define TBTT_AGG_DEF 1
#define BCN_SET_UNIT 32
#define BCN_ERLY_SET_DLY (10 * 2)
@@ -4725,6 +4726,16 @@ static void rtw89_mac_port_cfg_tbtt_early(struct rtw89_dev *rtwdev,
B_AX_TBTTERLY_MASK, TBTT_ERLY_DEF);
}
+static void rtw89_mac_port_cfg_tbtt_agg(struct rtw89_dev *rtwdev,
+ struct rtw89_vif_link *rtwvif_link)
+{
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+ const struct rtw89_port_reg *p = mac->port_base;
+
+ rtw89_write16_port_mask(rtwdev, rtwvif_link, p->tbtt_agg,
+ B_AX_TBTT_AGG_NUM_MASK, TBTT_AGG_DEF);
+}
+
static void rtw89_mac_port_cfg_bss_color(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link)
{
@@ -4985,6 +4996,7 @@ int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvi
rtw89_mac_port_cfg_bcn_hold_time(rtwdev, rtwvif_link);
rtw89_mac_port_cfg_bcn_mask_area(rtwdev, rtwvif_link);
rtw89_mac_port_cfg_tbtt_early(rtwdev, rtwvif_link);
+ rtw89_mac_port_cfg_tbtt_agg(rtwdev, rtwvif_link);
rtw89_mac_port_cfg_bss_color(rtwdev, rtwvif_link);
rtw89_mac_port_cfg_mbssid(rtwdev, rtwvif_link);
rtw89_mac_port_cfg_func_en(rtwdev, rtwvif_link, true);
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH rtw-next 12/12] wifi: rtw89: mcc: reset probe counter when receiving beacon
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
` (10 preceding siblings ...)
2025-12-12 3:13 ` [PATCH rtw-next 11/12] wifi: rtw89: setting TBTT AGG number when mac port initialization Ping-Ke Shih
@ 2025-12-12 3:13 ` Ping-Ke Shih
11 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-12 3:13 UTC (permalink / raw)
To: linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
From: Chih-Kang Chang <gary.chang@realtek.com>
For BE chips, needs to transmit QoS null data periodically to ensure
the connection with AP in GC+STA mode. However, in environments
with interference, the Qos null data might fail to transmit
successfully. Therefore, when receive the beacon from AP will
reset the QoS null data failure counter to avoid unnecessary
disconnection.
Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtw89/chan.c | 5 ++++-
drivers/net/wireless/realtek/rtw89/mac80211.c | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/chan.c b/drivers/net/wireless/realtek/rtw89/chan.c
index 86f1b39a967f..8fe6a7ef738f 100644
--- a/drivers/net/wireless/realtek/rtw89/chan.c
+++ b/drivers/net/wireless/realtek/rtw89/chan.c
@@ -2608,17 +2608,20 @@ bool rtw89_mcc_detect_go_bcn(struct rtw89_dev *rtwdev,
static void rtw89_mcc_detect_connection(struct rtw89_dev *rtwdev,
struct rtw89_mcc_role *role)
{
+ struct rtw89_vif_link *rtwvif_link = role->rtwvif_link;
struct ieee80211_vif *vif;
bool start_detect;
int ret;
ret = rtw89_core_send_nullfunc(rtwdev, role->rtwvif_link, true, false,
RTW89_MCC_PROBE_TIMEOUT);
- if (ret)
+ if (ret &&
+ READ_ONCE(rtwvif_link->sync_bcn_tsf) == rtwvif_link->last_sync_bcn_tsf)
role->probe_count++;
else
role->probe_count = 0;
+ rtwvif_link->last_sync_bcn_tsf = READ_ONCE(rtwvif_link->sync_bcn_tsf);
if (role->probe_count < RTW89_MCC_PROBE_MAX_TRIES)
return;
diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c
index e4fc513aa158..f80c847d1741 100644
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
@@ -127,6 +127,7 @@ static int __rtw89_ops_add_iface_link(struct rtw89_dev *rtwdev,
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
rtwvif_link->rand_tsf_done = false;
rtwvif_link->detect_bcn_count = 0;
+ rtwvif_link->last_sync_bcn_tsf = 0;
rcu_read_lock();
--
2.25.1
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-12 3:12 ` [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on Ping-Ke Shih
@ 2025-12-14 22:30 ` Bitterblue Smith
2025-12-15 2:05 ` Ping-Ke Shih
0 siblings, 1 reply; 23+ messages in thread
From: Bitterblue Smith @ 2025-12-14 22:30 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
On 12/12/2025 05:12, Ping-Ke Shih wrote:
> To run power on function properly, reset power states (off/on/PS) to
> initial state. Otherwise, it might be unusable due to fail to power on.
>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
> drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
> drivers/net/wireless/realtek/rtw89/mac.h | 1 +
> drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
> drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
> 4 files changed, 240 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index d78fbe73e365..ba4344a640f5 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
>
> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> {
> -#define PWR_ACT 1
> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> const struct rtw89_chip_info *chip = rtwdev->chip;
> const struct rtw89_pwr_cfg * const *cfg_seq;
> int (*cfg_func)(struct rtw89_dev *rtwdev);
> int ret;
> - u8 val;
>
> rtw89_mac_power_switch_boot_mode(rtwdev);
>
> @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
> __rtw89_leave_ps_mode(rtwdev);
>
> - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> - if (on && val == PWR_ACT) {
> - rtw89_err(rtwdev, "MAC has already powered on\n");
> - return -EBUSY;
> + if (on) {
> + ret = mac->reset_pwr_state(rtwdev);
> + if (ret)
> + return ret;
> }
>
> ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
> @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> }
>
> return 0;
> -#undef PWR_ACT
> }
>
> int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
> @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
> return 0;
> }
>
> +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
> +{
> + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
> + u32 val32;
> + int ret;
> +
> + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
> + val32 &= WLAN_FSM_MASK;
> + val32 |= WLAN_FSM_SET;
> + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
> + 1000, 2000000, false,
> + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> + return ret;
> + }
I get this error message with every AX chip the first time
rtw89_mac_pwr_on() is called:
[ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
They still work, because the second attempt in rtw89_mac_pwr_on()
succeeds.
Before this patch, the message was "MAC has already powered on".
The new message says it's an error, so it will confuse people.
Is it possible this code related to R_AX_SYSON_FSM_MON is not
applicable to USB? My adapters still work if I delete it.
(I don't get the error with RTL8912AU.)
> +
> + val32 = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> + if (val32 == MAC_AX_MAC_OFF) {
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
> + } else if (val32 == MAC_AX_MAC_ON) {
> + rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
> + rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
> + 1000, 2000000, false,
> + rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
> + } else if (val32 == MAC_AX_MAC_LPS) {
> + rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_FORCE_LEAVE_LPS);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_ON,
> + 1000, 2000000, false,
> + rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC STS timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
> + rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
> + 1000, 2000000, false,
> + rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_AX_WLLPS_CTRL, B_AX_FORCE_LEAVE_LPS);
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
> + }
> +
> + switch (chip_id) {
> + case RTL8852A:
> + case RTL8852B:
> + case RTL8851B:
> + rtw89_write32_clr(rtwdev, R_AX_AFE_CTRL1, B_AX_CMAC_CLK_SEL);
> + break;
> + default:
> + break;
> + }
> +
> + return 0;
> +}
> +
> static void rtw89_disable_fw_watchdog(struct rtw89_dev *rtwdev)
> {
> u32 val32;
> @@ -7206,6 +7280,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
> .set_cpuio = set_cpuio_ax,
> .dle_quota_change = dle_quota_change_ax,
>
> + .reset_pwr_state = rtw89_mac_reset_pwr_state_ax,
> .disable_cpu = rtw89_mac_disable_cpu_ax,
> .fwdl_enable_wcpu = rtw89_mac_enable_cpu_ax,
> .fwdl_get_status = rtw89_fw_get_rdy_ax,
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
> index 0007229d6753..9ec70729e9e1 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.h
> +++ b/drivers/net/wireless/realtek/rtw89/mac.h
> @@ -1052,6 +1052,7 @@ struct rtw89_mac_gen_def {
> struct rtw89_cpuio_ctrl *ctrl_para, bool wd);
> int (*dle_quota_change)(struct rtw89_dev *rtwdev, bool band1_en);
>
> + int (*reset_pwr_state)(struct rtw89_dev *rtwdev);
> void (*disable_cpu)(struct rtw89_dev *rtwdev);
> int (*fwdl_enable_wcpu)(struct rtw89_dev *rtwdev, u8 boot_reason,
> bool dlfw, bool include_bb);
> diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
> index 556e5f98e8d4..65c0c0de3a30 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac_be.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
> @@ -425,6 +425,135 @@ int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
> return 0;
> }
>
> +static int rtw89_mac_reset_pwr_state_be(struct rtw89_dev *rtwdev)
> +{
> + u32 val32;
> + int ret;
> +
> + val32 = rtw89_read32(rtwdev, R_BE_SYSON_FSM_MON);
> + val32 &= WLAN_FSM_MASK;
> + val32 |= WLAN_FSM_SET;
> + rtw89_write32(rtwdev, R_BE_SYSON_FSM_MON, val32);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
> + 1000, 2000000, false,
> + rtwdev, R_BE_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> + return ret;
> + }
> +
> + val32 = rtw89_read32_mask(rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK);
> + if (val32 == MAC_AX_MAC_OFF) {
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL,
> + B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
> + } else if (val32 == MAC_AX_MAC_ON) {
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL,
> + B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
> + rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
> + 1000, 2000000, false,
> + rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
> + } else if (val32 == MAC_AX_MAC_LPS) {
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HAXIDMA_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL,
> + B_BE_HAXIDMA_IO_ST | B_BE_HAXIDMA_BACKUP_RESTORE_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling HAXI IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_EN);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, !val32,
> + 1000, 2000000, false,
> + rtwdev, R_BE_HCI_OPT_CTRL, B_BE_HCI_WLAN_IO_ST);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling WLAN IO timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_set(rtwdev, R_BE_WLLPS_CTRL, B_BE_FORCE_LEAVE_LPS);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_ON,
> + 1000, 2000000, false,
> + rtwdev, R_BE_IC_PWR_STATE, B_BE_WLMAC_PWR_STE_MASK);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC STS timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
> + rtw89_write32_set(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
> +
> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == MAC_AX_MAC_OFF,
> + 1000, 2000000, false,
> + rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_OFFMAC);
> + if (ret) {
> + rtw89_err(rtwdev, "[ERR]Polling MAC state timeout= %X\n", val32);
> + return ret;
> + }
> +
> + rtw89_write32_clr(rtwdev, R_BE_WLLPS_CTRL, B_BE_FORCE_LEAVE_LPS);
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_EN_WLON);
> + rtw89_write32_clr(rtwdev, R_BE_SYS_PW_CTRL, B_BE_APFM_SWLPS);
> + }
> +
> + return 0;
> +}
> +
> static void rtw89_mac_disable_cpu_be(struct rtw89_dev *rtwdev)
> {
> u32 val32;
> @@ -2623,6 +2752,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
> .set_cpuio = set_cpuio_be,
> .dle_quota_change = dle_quota_change_be,
>
> + .reset_pwr_state = rtw89_mac_reset_pwr_state_be,
> .disable_cpu = rtw89_mac_disable_cpu_be,
> .fwdl_enable_wcpu = rtw89_mac_fwdl_enable_wcpu_be,
> .fwdl_get_status = fwdl_get_status_be,
> diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
> index 5b4a459cf29c..fb641cefa4c9 100644
> --- a/drivers/net/wireless/realtek/rtw89/reg.h
> +++ b/drivers/net/wireless/realtek/rtw89/reg.h
> @@ -149,6 +149,7 @@
> #define R_AX_WLLPS_CTRL 0x0090
> #define B_AX_LPSOP_ASWRM BIT(17)
> #define B_AX_LPSOP_DSWRM BIT(9)
> +#define B_AX_FORCE_LEAVE_LPS BIT(3)
> #define B_AX_DIS_WLBT_LPSEN_LOPC BIT(1)
> #define SW_LPS_OPTION 0x0001A0B2
>
> @@ -313,6 +314,9 @@
> #define R_AX_IC_PWR_STATE 0x03F0
> #define B_AX_WHOLE_SYS_PWR_STE_MASK GENMASK(25, 16)
> #define B_AX_WLMAC_PWR_STE_MASK GENMASK(9, 8)
> +#define MAC_AX_MAC_OFF 0
> +#define MAC_AX_MAC_ON 1
> +#define MAC_AX_MAC_LPS 2
> #define B_AX_UART_HCISYS_PWR_STE_MASK GENMASK(7, 6)
> #define B_AX_SDIO_HCISYS_PWR_STE_MASK GENMASK(5, 4)
> #define B_AX_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2)
> @@ -2094,6 +2098,7 @@
> #define B_AX_B1_ISR_ERR_USRCTL_REINIT BIT(0)
>
> #define R_AX_AFE_CTRL1 0x0024
> +#define B_AX_CMAC_CLK_SEL BIT(21)
>
> #define B_AX_R_SYM_WLCMAC1_P4_PC_EN BIT(4)
> #define B_AX_R_SYM_WLCMAC1_P3_PC_EN BIT(3)
> @@ -2107,6 +2112,12 @@
> #define B_AX_R_SYM_FEN_WLBBFUN_1 BIT(16)
> #define B_AX_R_SYM_ISO_CMAC12PP BIT(5)
>
> +#define R_AX_SYSON_FSM_MON 0x00A0
> +#define B_AX_FSM_MON_SEL_MASK GENMASK(26, 24)
> +#define B_AX_DOP_ELDO BIT(23)
> +#define B_AX_FSM_MON_UPD BIT(15)
> +#define B_AX_FSM_PAR_MASK GENMASK(14, 0)
> +
> #define R_AX_CMAC_REG_START 0xC000
>
> #define R_AX_CMAC_FUNC_EN 0xC000
> @@ -4172,6 +4183,22 @@
> #define B_BE_LPSROP_LOWPWRPLL BIT(7)
> #define B_BE_LPSROP_DSWRSD_SEL_MASK GENMASK(5, 4)
>
> +#define R_BE_SYSON_FSM_MON 0x00A0
> +#define B_BE_FSM_MON_SEL_MASK GENMASK(26, 24)
> +#define B_BE_DOP_ELDO BIT(23)
> +#define B_BE_AFE_PLL_BYPASS BIT(22)
> +#define B_BE_PON_SWR_BYPASS BIT(21)
> +#define B_BE_PON_ADIE_BYPASS BIT(20)
> +#define B_BE_AFE_LS_BYPASS BIT(19)
> +#define B_BE_BTPMC_XTAL_SI_BYPASS BIT(17)
> +#define B_BE_WLPMC_XTAL_SI_BYPASS BIT(16)
> +#define B_BE_FSM_MON_UPD BIT(15)
> +#define B_BE_FSM_PAR_MASK GENMASK(14, 0)
> +#define WLAN_FSM_MASK 0xFFFFFF
> +#define WLAN_FSM_SET 0x4000000
> +#define WLAN_FSM_STATE_MASK 0x1FF
> +#define WLAN_FSM_IDLE 0
> +
> #define R_BE_EFUSE_CTRL_2_V1 0x00A4
> #define B_BE_EF_ENT BIT(31)
> #define B_BE_EF_TCOLUMN_EN BIT(29)
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI
2025-12-12 3:13 ` [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI Ping-Ke Shih
@ 2025-12-14 22:32 ` Bitterblue Smith
2025-12-15 1:24 ` Ping-Ke Shih
0 siblings, 1 reply; 23+ messages in thread
From: Bitterblue Smith @ 2025-12-14 22:32 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless; +Cc: gary.chang, damon.chen, kevin_yang
On 12/12/2025 05:13, Ping-Ke Shih wrote:
> XTAL SI is an indirect serial interface to access registers in another
> hardware domain. When BT driver initializes UART interface, firmware might
> rarely control XTAL SI at the same time causing access racing.
>
> Current is to adjust initialization flow to avoid the racing. To make
> the racing visible if it still presents, add a message to address this.
>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
> drivers/net/wireless/realtek/rtw89/mac.c | 11 ++++++++++-
> drivers/net/wireless/realtek/rtw89/mac_be.c | 11 ++++++++++-
> 2 files changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index cf36be167162..066c99f3e53a 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -7023,6 +7023,11 @@ int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 m
> return ret;
> }
>
> + if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset ||
> + u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK) != val)
> + rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
> + offset, val, val32);
> +
This message appears several times after I unplug a USB adapter:
[ +0.834445] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=10 poll=0
[ +0.000015] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
[ +0.000007] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
[ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=80 val=0 poll=0
[ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=80 poll=0
[ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
[ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> return 0;
> }
>
> @@ -7046,7 +7051,11 @@ int rtw89_mac_read_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
> return ret;
> }
>
> - *val = rtw89_read8(rtwdev, R_AX_WLAN_XTAL_SI_CTRL + 1);
> + if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset)
> + rtw89_warn(rtwdev, "xtal si read: offset=%x poll=%x\n",
> + offset, val32);
> +
> + *val = u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK);
>
> return 0;
> }
> diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
> index 2bc329c13443..d75c55cc34b8 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac_be.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
> @@ -396,6 +396,11 @@ int rtw89_mac_write_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 m
> return ret;
> }
>
> + if (u32_get_bits(val32, B_BE_WL_XTAL_SI_ADDR_MASK) != offset ||
> + u32_get_bits(val32, B_BE_WL_XTAL_SI_DATA_MASK) != val)
> + rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
> + offset, val, val32);
> +
Same here:
[Dec14 18:42] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=10 poll=0
[ +0.000009] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
[ +0.000005] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
[ +0.000005] rtw89_8922au 2-4:1.0: xtal si write: offset=80 val=c6 poll=0
[ +0.000004] rtw89_8922au 2-4:1.0: xtal si write: offset=81 val=c6 poll=0
[ +0.000005] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=80 poll=0
[ +0.000005] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
[ +0.000003] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
[ +0.000004] rtw89_8922au 2-4:1.0: xtal si write: offset=e0 val=2 poll=0
[ +0.000003] rtw89_8922au 2-4:1.0: xtal si write: offset=e0 val=0 poll=0
[ +0.000004] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
[ +0.000003] rtw89_8922au 2-4:1.0: xtal si write: offset=90 val=0 poll=0
> return 0;
> }
>
> @@ -420,7 +425,11 @@ int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
> return ret;
> }
>
> - *val = rtw89_read8(rtwdev, R_BE_WLAN_XTAL_SI_CTRL + 1);
> + if (u32_get_bits(val32, B_BE_WL_XTAL_SI_ADDR_MASK) != offset)
> + rtw89_warn(rtwdev, "xtal si read: offset=%x poll=%x\n",
> + offset, val32);
> +
> + *val = u32_get_bits(val32, B_BE_WL_XTAL_SI_DATA_MASK);
>
> return 0;
> }
^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI
2025-12-14 22:32 ` Bitterblue Smith
@ 2025-12-15 1:24 ` Ping-Ke Shih
2025-12-15 22:13 ` Bitterblue Smith
0 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-15 1:24 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> On 12/12/2025 05:13, Ping-Ke Shih wrote:
> > XTAL SI is an indirect serial interface to access registers in another
> > hardware domain. When BT driver initializes UART interface, firmware might
> > rarely control XTAL SI at the same time causing access racing.
> >
> > Current is to adjust initialization flow to avoid the racing. To make
> > the racing visible if it still presents, add a message to address this.
> >
> > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> > ---
> > drivers/net/wireless/realtek/rtw89/mac.c | 11 ++++++++++-
> > drivers/net/wireless/realtek/rtw89/mac_be.c | 11 ++++++++++-
> > 2 files changed, 20 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> > index cf36be167162..066c99f3e53a 100644
> > --- a/drivers/net/wireless/realtek/rtw89/mac.c
> > +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> > @@ -7023,6 +7023,11 @@ int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8
> m
> > return ret;
> > }
> >
> > + if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset ||
> > + u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK) != val)
> > + rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
> > + offset, val, val32);
> > +
>
> This message appears several times after I unplug a USB adapter:
>
> [ +0.834445] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=10 poll=0
> [ +0.000015] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> [ +0.000007] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=80 val=0 poll=0
> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=80 poll=0
> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
>
I think this is because it calls this function during power-off.
With additional changes below, will it avoid warning in your side?
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 7ffb039e7d1b..9113efe00a94 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1483,6 +1483,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
rtw89_write32_clr(rtwdev, R_AX_RSV_CTRL, B_AX_R_DIS_PRST);
}
+static int rtw89_mac_pwr_off_func_for_unplugged(struct rtw89_dev *rtwdev)
+{
+ return 0;
+}
+
static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
{
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
@@ -1497,8 +1502,13 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
cfg_seq = chip->pwr_on_seq;
cfg_func = chip->ops->pwr_on_func;
} else {
- cfg_seq = chip->pwr_off_seq;
- cfg_func = chip->ops->pwr_off_func;
+ if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) {
+ cfg_seq = NULL;
+ cfg_func = rtw89_mac_pwr_off_func_for_unplugged;
+ } else {
+ cfg_seq = chip->pwr_off_seq;
+ cfg_func = chip->ops->pwr_off_func;
+ }
}
if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
^ permalink raw reply related [flat|nested] 23+ messages in thread
* RE: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-14 22:30 ` Bitterblue Smith
@ 2025-12-15 2:05 ` Ping-Ke Shih
2025-12-15 18:06 ` Bitterblue Smith
0 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-15 2:05 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote;
> On 12/12/2025 05:12, Ping-Ke Shih wrote:
> > To run power on function properly, reset power states (off/on/PS) to
> > initial state. Otherwise, it might be unusable due to fail to power on.
> >
> > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> > ---
> > drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
> > drivers/net/wireless/realtek/rtw89/mac.h | 1 +
> > drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
> > drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
> > 4 files changed, 240 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> > index d78fbe73e365..ba4344a640f5 100644
> > --- a/drivers/net/wireless/realtek/rtw89/mac.c
> > +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> > @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> >
> > static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > {
> > -#define PWR_ACT 1
> > const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> > const struct rtw89_chip_info *chip = rtwdev->chip;
> > const struct rtw89_pwr_cfg * const *cfg_seq;
> > int (*cfg_func)(struct rtw89_dev *rtwdev);
> > int ret;
> > - u8 val;
> >
> > rtw89_mac_power_switch_boot_mode(rtwdev);
> >
> > @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
> > __rtw89_leave_ps_mode(rtwdev);
> >
> > - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> > - if (on && val == PWR_ACT) {
> > - rtw89_err(rtwdev, "MAC has already powered on\n");
> > - return -EBUSY;
> > + if (on) {
> > + ret = mac->reset_pwr_state(rtwdev);
> > + if (ret)
> > + return ret;
> > }
> >
> > ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
> > @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > }
> >
> > return 0;
> > -#undef PWR_ACT
> > }
> >
> > int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
> > @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
> > return 0;
> > }
> >
> > +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
> > +{
> > + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
> > + u32 val32;
> > + int ret;
> > +
> > + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
> > + val32 &= WLAN_FSM_MASK;
> > + val32 |= WLAN_FSM_SET;
> > + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
> > +
> > + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
> > + 1000, 2000000, false,
> > + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> > + if (ret) {
> > + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> > + return ret;
> > + }
>
> I get this error message with every AX chip the first time
> rtw89_mac_pwr_on() is called:
>
> [ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> [ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
>
> They still work, because the second attempt in rtw89_mac_pwr_on()
> succeeds.
>
> Before this patch, the message was "MAC has already powered on".
> The new message says it's an error, so it will confuse people.
I borrow a 8852AU and a 8852CU that both don't have error messages.
The "first time" you meant is just to plug the USB adapter?
If so, I have not idea about the difference between yours and mine.
>
> Is it possible this code related to R_AX_SYSON_FSM_MON is not
> applicable to USB? My adapters still work if I delete it.
I'm checking internal experts. Quickly checking vendor driver, I don't see
it avoids calling this because of USB devices.
If you delete code related to R_AX_SYSON_FSM_MON, will it show below messages
under the case 'val32 == MAC_AX_MAC_ON'?
"[ERR]Polling MAC state timeout= %X\n"
>
> (I don't get the error with RTL8912AU.)
>
I'm adding this patch for WiFi 7 chips mainly, and this seems to be expected.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-15 2:05 ` Ping-Ke Shih
@ 2025-12-15 18:06 ` Bitterblue Smith
2025-12-16 0:34 ` Ping-Ke Shih
0 siblings, 1 reply; 23+ messages in thread
From: Bitterblue Smith @ 2025-12-15 18:06 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
On 15/12/2025 04:05, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote;
>> On 12/12/2025 05:12, Ping-Ke Shih wrote:
>>> To run power on function properly, reset power states (off/on/PS) to
>>> initial state. Otherwise, it might be unusable due to fail to power on.
>>>
>>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
>>> ---
>>> drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
>>> drivers/net/wireless/realtek/rtw89/mac.h | 1 +
>>> drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
>>> drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
>>> 4 files changed, 240 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
>>> index d78fbe73e365..ba4344a640f5 100644
>>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
>>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
>>> @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
>>>
>>> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>> {
>>> -#define PWR_ACT 1
>>> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
>>> const struct rtw89_chip_info *chip = rtwdev->chip;
>>> const struct rtw89_pwr_cfg * const *cfg_seq;
>>> int (*cfg_func)(struct rtw89_dev *rtwdev);
>>> int ret;
>>> - u8 val;
>>>
>>> rtw89_mac_power_switch_boot_mode(rtwdev);
>>>
>>> @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
>>> __rtw89_leave_ps_mode(rtwdev);
>>>
>>> - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
>>> - if (on && val == PWR_ACT) {
>>> - rtw89_err(rtwdev, "MAC has already powered on\n");
>>> - return -EBUSY;
>>> + if (on) {
>>> + ret = mac->reset_pwr_state(rtwdev);
>>> + if (ret)
>>> + return ret;
>>> }
>>>
>>> ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
>>> @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>> }
>>>
>>> return 0;
>>> -#undef PWR_ACT
>>> }
>>>
>>> int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
>>> @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
>>> return 0;
>>> }
>>>
>>> +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
>>> +{
>>> + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
>>> + u32 val32;
>>> + int ret;
>>> +
>>> + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
>>> + val32 &= WLAN_FSM_MASK;
>>> + val32 |= WLAN_FSM_SET;
>>> + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
>>> +
>>> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
>>> + 1000, 2000000, false,
>>> + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
>>> + if (ret) {
>>> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
>>> + return ret;
>>> + }
>>
>> I get this error message with every AX chip the first time
>> rtw89_mac_pwr_on() is called:
>>
>> [ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
>> [ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
>>
>> They still work, because the second attempt in rtw89_mac_pwr_on()
>> succeeds.
>>
>> Before this patch, the message was "MAC has already powered on".
>> The new message says it's an error, so it will confuse people.
>
> I borrow a 8852AU and a 8852CU that both don't have error messages.
> The "first time" you meant is just to plug the USB adapter?
> If so, I have not idea about the difference between yours and mine.
>
Yes, the error only appears right after the adapter is plugged in.
I put a message at the top of rtw89_mac_power_switch():
[ +0.721188] usb 1-4: new high-speed USB device number 8 using xhci_hcd
[ +0.126425] usb 1-4: New USB device found, idVendor=0bda, idProduct=8832, bcdDevice= 0.00
[ +0.000014] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
[ +0.000004] usb 1-4: Manufacturer: Realtek
[ +0.000003] usb 1-4: SerialNumber: 00e04c000001
[ +0.007757] rtw89_8852au 1-4:1.0: loaded firmware rtw89/rtw8852a_fw.bin
[ +0.000338] rtw89_mac_power_switch enter, on 1
[ +2.005000] rtw89_8852au 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
[ +0.000010] rtw89_mac_power_switch enter, on 0
[ +0.007867] rtw89_mac_power_switch enter, on 1
[ +0.020254] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 1
[ +0.000010] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 3
[ +0.963868] rtw89_8852au 1-4:1.0: chip rfe_type is 1
[ +0.103131] rtw89_mac_power_switch enter, on 0
[ +0.011027] rtw89_8852au 1-4:1.0: rfkill hardware state changed to enable
[ +0.051507] rtw89_8852au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
[ +0.020062] rtw89_mac_power_switch enter, on 1
>>
>> Is it possible this code related to R_AX_SYSON_FSM_MON is not
>> applicable to USB? My adapters still work if I delete it.
>
> I'm checking internal experts. Quickly checking vendor driver, I don't see
> it avoids calling this because of USB devices.
>
> If you delete code related to R_AX_SYSON_FSM_MON, will it show below messages
> under the case 'val32 == MAC_AX_MAC_ON'?
>
> "[ERR]Polling MAC state timeout= %X\n"
>
No, I never see that error. I checked the value of R_AX_IC_PWR_STATE.
My RTL8832BU with the Windows driver onboard:
[ +4.566707] usb 1-4: new high-speed USB device number 20 using xhci_hcd
[ +0.125152] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
[ +0.000008] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ +0.000002] usb 1-4: Product: DISK
[ +0.000002] usb 1-4: Manufacturer: Realtek
[ +0.000544] usb-storage 1-4:1.0: USB Mass Storage device detected
[ +0.000160] usb-storage 1-4:1.0: device ignored
[ +0.629850] usb 1-4: USB disconnect, device number 20
[ +0.723342] usb 1-4: new high-speed USB device number 21 using xhci_hcd
[ +0.125493] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
[ +0.000013] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
[ +0.000004] usb 1-4: Manufacturer: Realtek
[ +0.000004] usb 1-4: SerialNumber: 00e04c000001
[ +0.007910] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ +0.005682] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200104
[ +2.000406] rtw89_8852bu 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
[ +0.017635] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
[ +0.043991] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
[ +0.000009] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
[ +1.462646] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
[ +0.135147] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
[ +0.045006] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
[ +0.016726] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
And another RTL8832BU without a Windows driver onboard:
[Dec15 19:46] usb 1-4: new high-speed USB device number 22 using xhci_hcd
[ +0.125532] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
[ +0.000010] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ +0.000003] usb 1-4: Product: 802.11ax WLAN Adapter
[ +0.000003] usb 1-4: Manufacturer: Realtek
[ +0.000002] usb 1-4: SerialNumber: 00e04c000001
[ +0.007667] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ +0.002684] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
[ +0.045258] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
[ +0.000015] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
[ +1.462130] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
[ +0.133511] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
[ +0.043307] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
[ +0.017936] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
Maybe your borrowed adapters don't have the Windows drivers onboard either?
>>
>> (I don't get the error with RTL8912AU.)
>>
>
> I'm adding this patch for WiFi 7 chips mainly, and this seems to be expected.
>
My RTL8912AU does have the Windows driver onboard, but no error:
[ +5.365639] usb 1-4: new high-speed USB device number 25 using xhci_hcd
[ +0.124722] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
[ +0.000007] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ +0.000002] usb 1-4: Product: DISK
[ +0.000002] usb 1-4: Manufacturer: Realtek
[ +0.000540] usb-storage 1-4:1.0: USB Mass Storage device detected
[ +0.000143] usb-storage 1-4:1.0: device ignored
[ +0.629713] usb 1-4: USB disconnect, device number 25
[ +0.420492] usb 1-4: new high-speed USB device number 26 using xhci_hcd
[ +0.125490] usb 1-4: New USB device found, idVendor=0bda, idProduct=8912, bcdDevice= 0.00
[ +0.000009] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ +0.000002] usb 1-4: Product: 802.11be WLAN Adapter
[ +0.000002] usb 1-4: Manufacturer: Realtek
[ +0.000002] usb 1-4: SerialNumber: 00e04c000001
[ +0.008039] rtw89_8922au 1-4:1.0: loaded firmware rtw89/rtw8922a_fw-4.bin
[ +0.005192] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200104
[ +0.055131] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 1
[ +0.000009] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 3
[ +1.419275] rtw89_8922au 1-4:1.0: chip rfe_type is 1
[ +0.042634] rtw89_8922au 1-4:1.0: Firmware version 0.1.0.0 (7b393818), cmd version 0, type 64
[ +0.000012] rtw89_8922au 1-4:1.0: Firmware element BB version: 00 49 00 00
[ +0.000014] rtw89_8922au 1-4:1.0: Firmware element radio A version: 00 33 00 00
[ +0.000015] rtw89_8922au 1-4:1.0: Firmware element NCTL version: 00 0f 00 00
[ +0.000118] rtw89_8922au 1-4:1.0: Firmware element TXPWR version: 00 40 00 00
[ +0.000005] rtw89_8922au 1-4:1.0: Firmware element PWR_TRK version: 00 33 00 00
[ +0.000010] rtw89_8922au 1-4:1.0: Firmware element REGD version: 00 48 00 06
[ +0.024441] rtw89_8922au 1-4:1.0: rfkill hardware state changed to enable
[ +0.042643] rtw89_8922au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
[ +0.012737] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200004
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI
2025-12-15 1:24 ` Ping-Ke Shih
@ 2025-12-15 22:13 ` Bitterblue Smith
2025-12-16 0:29 ` Ping-Ke Shih
0 siblings, 1 reply; 23+ messages in thread
From: Bitterblue Smith @ 2025-12-15 22:13 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
On 15/12/2025 03:24, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> On 12/12/2025 05:13, Ping-Ke Shih wrote:
>>> XTAL SI is an indirect serial interface to access registers in another
>>> hardware domain. When BT driver initializes UART interface, firmware might
>>> rarely control XTAL SI at the same time causing access racing.
>>>
>>> Current is to adjust initialization flow to avoid the racing. To make
>>> the racing visible if it still presents, add a message to address this.
>>>
>>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
>>> ---
>>> drivers/net/wireless/realtek/rtw89/mac.c | 11 ++++++++++-
>>> drivers/net/wireless/realtek/rtw89/mac_be.c | 11 ++++++++++-
>>> 2 files changed, 20 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
>>> index cf36be167162..066c99f3e53a 100644
>>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
>>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
>>> @@ -7023,6 +7023,11 @@ int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8
>> m
>>> return ret;
>>> }
>>>
>>> + if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset ||
>>> + u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK) != val)
>>> + rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
>>> + offset, val, val32);
>>> +
>>
>> This message appears several times after I unplug a USB adapter:
>>
>> [ +0.834445] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=10 poll=0
>> [ +0.000015] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
>> [ +0.000007] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
>> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=80 val=0 poll=0
>> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=80 poll=0
>> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
>> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
>>
>
> I think this is because it calls this function during power-off.
>
> With additional changes below, will it avoid warning in your side?
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 7ffb039e7d1b..9113efe00a94 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -1483,6 +1483,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> rtw89_write32_clr(rtwdev, R_AX_RSV_CTRL, B_AX_R_DIS_PRST);
> }
>
> +static int rtw89_mac_pwr_off_func_for_unplugged(struct rtw89_dev *rtwdev)
> +{
> + return 0;
> +}
> +
> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> {
> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> @@ -1497,8 +1502,13 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> cfg_seq = chip->pwr_on_seq;
> cfg_func = chip->ops->pwr_on_func;
> } else {
> - cfg_seq = chip->pwr_off_seq;
> - cfg_func = chip->ops->pwr_off_func;
> + if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) {
> + cfg_seq = NULL;
> + cfg_func = rtw89_mac_pwr_off_func_for_unplugged;
> + } else {
> + cfg_seq = chip->pwr_off_seq;
> + cfg_func = chip->ops->pwr_off_func;
> + }
> }
>
> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
>
>
>
>
Yes, with this the warnings don't appear anymore.
^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI
2025-12-15 22:13 ` Bitterblue Smith
@ 2025-12-16 0:29 ` Ping-Ke Shih
0 siblings, 0 replies; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-16 0:29 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> On 15/12/2025 03:24, Ping-Ke Shih wrote:
> > Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> >> On 12/12/2025 05:13, Ping-Ke Shih wrote:
> >>> XTAL SI is an indirect serial interface to access registers in another
> >>> hardware domain. When BT driver initializes UART interface, firmware might
> >>> rarely control XTAL SI at the same time causing access racing.
> >>>
> >>> Current is to adjust initialization flow to avoid the racing. To make
> >>> the racing visible if it still presents, add a message to address this.
> >>>
> >>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> >>> ---
> >>> drivers/net/wireless/realtek/rtw89/mac.c | 11 ++++++++++-
> >>> drivers/net/wireless/realtek/rtw89/mac_be.c | 11 ++++++++++-
> >>> 2 files changed, 20 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> >>> index cf36be167162..066c99f3e53a 100644
> >>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> >>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> >>> @@ -7023,6 +7023,11 @@ int rtw89_mac_write_xtal_si_ax(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8
> >> m
> >>> return ret;
> >>> }
> >>>
> >>> + if (u32_get_bits(val32, B_AX_WL_XTAL_SI_ADDR_MASK) != offset ||
> >>> + u32_get_bits(val32, B_AX_WL_XTAL_SI_DATA_MASK) != val)
> >>> + rtw89_warn(rtwdev, "xtal si write: offset=%x val=%x poll=%x\n",
> >>> + offset, val, val32);
> >>> +
> >>
> >> This message appears several times after I unplug a USB adapter:
> >>
> >> [ +0.834445] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=10 poll=0
> >> [ +0.000015] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> >> [ +0.000007] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> >> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=80 val=0 poll=0
> >> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=80 poll=0
> >> [ +0.000005] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> >> [ +0.000004] rtw89_8851bu 1-2:1.2: xtal si write: offset=90 val=0 poll=0
> >>
> >
> > I think this is because it calls this function during power-off.
> >
> > With additional changes below, will it avoid warning in your side?
> >
> > diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> > index 7ffb039e7d1b..9113efe00a94 100644
> > --- a/drivers/net/wireless/realtek/rtw89/mac.c
> > +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> > @@ -1483,6 +1483,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> > rtw89_write32_clr(rtwdev, R_AX_RSV_CTRL, B_AX_R_DIS_PRST);
> > }
> >
> > +static int rtw89_mac_pwr_off_func_for_unplugged(struct rtw89_dev *rtwdev)
> > +{
> > + return 0;
> > +}
> > +
> > static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > {
> > const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> > @@ -1497,8 +1502,13 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > cfg_seq = chip->pwr_on_seq;
> > cfg_func = chip->ops->pwr_on_func;
> > } else {
> > - cfg_seq = chip->pwr_off_seq;
> > - cfg_func = chip->ops->pwr_off_func;
> > + if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) {
> > + cfg_seq = NULL;
> > + cfg_func = rtw89_mac_pwr_off_func_for_unplugged;
> > + } else {
> > + cfg_seq = chip->pwr_off_seq;
> > + cfg_func = chip->ops->pwr_off_func;
> > + }
> > }
> >
> > if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
> >
> >
> >
> >
>
> Yes, with this the warnings don't appear anymore.
Thanks for the feedback. I will squash this change into original patch by v2.
^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-15 18:06 ` Bitterblue Smith
@ 2025-12-16 0:34 ` Ping-Ke Shih
2025-12-16 9:06 ` Ping-Ke Shih
0 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-16 0:34 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> On 15/12/2025 04:05, Ping-Ke Shih wrote:
> > Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote;
> >> On 12/12/2025 05:12, Ping-Ke Shih wrote:
> >>> To run power on function properly, reset power states (off/on/PS) to
> >>> initial state. Otherwise, it might be unusable due to fail to power on.
> >>>
> >>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> >>> ---
> >>> drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
> >>> drivers/net/wireless/realtek/rtw89/mac.h | 1 +
> >>> drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
> >>> drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
> >>> 4 files changed, 240 insertions(+), 7 deletions(-)
> >>>
> >>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> >>> index d78fbe73e365..ba4344a640f5 100644
> >>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> >>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> >>> @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> >>>
> >>> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> >>> {
> >>> -#define PWR_ACT 1
> >>> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> >>> const struct rtw89_chip_info *chip = rtwdev->chip;
> >>> const struct rtw89_pwr_cfg * const *cfg_seq;
> >>> int (*cfg_func)(struct rtw89_dev *rtwdev);
> >>> int ret;
> >>> - u8 val;
> >>>
> >>> rtw89_mac_power_switch_boot_mode(rtwdev);
> >>>
> >>> @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> >>> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
> >>> __rtw89_leave_ps_mode(rtwdev);
> >>>
> >>> - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> >>> - if (on && val == PWR_ACT) {
> >>> - rtw89_err(rtwdev, "MAC has already powered on\n");
> >>> - return -EBUSY;
> >>> + if (on) {
> >>> + ret = mac->reset_pwr_state(rtwdev);
> >>> + if (ret)
> >>> + return ret;
> >>> }
> >>>
> >>> ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
> >>> @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> >>> }
> >>>
> >>> return 0;
> >>> -#undef PWR_ACT
> >>> }
> >>>
> >>> int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
> >>> @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
> >>> return 0;
> >>> }
> >>>
> >>> +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
> >>> +{
> >>> + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
> >>> + u32 val32;
> >>> + int ret;
> >>> +
> >>> + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
> >>> + val32 &= WLAN_FSM_MASK;
> >>> + val32 |= WLAN_FSM_SET;
> >>> + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
> >>> +
> >>> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
> >>> + 1000, 2000000, false,
> >>> + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> >>> + if (ret) {
> >>> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> >>> + return ret;
> >>> + }
> >>
> >> I get this error message with every AX chip the first time
> >> rtw89_mac_pwr_on() is called:
> >>
> >> [ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> >> [ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> >>
> >> They still work, because the second attempt in rtw89_mac_pwr_on()
> >> succeeds.
> >>
> >> Before this patch, the message was "MAC has already powered on".
> >> The new message says it's an error, so it will confuse people.
> >
> > I borrow a 8852AU and a 8852CU that both don't have error messages.
> > The "first time" you meant is just to plug the USB adapter?
> > If so, I have not idea about the difference between yours and mine.
> >
>
> Yes, the error only appears right after the adapter is plugged in.
> I put a message at the top of rtw89_mac_power_switch():
>
> [ +0.721188] usb 1-4: new high-speed USB device number 8 using xhci_hcd
> [ +0.126425] usb 1-4: New USB device found, idVendor=0bda, idProduct=8832, bcdDevice= 0.00
> [ +0.000014] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
> [ +0.000004] usb 1-4: Manufacturer: Realtek
> [ +0.000003] usb 1-4: SerialNumber: 00e04c000001
> [ +0.007757] rtw89_8852au 1-4:1.0: loaded firmware rtw89/rtw8852a_fw.bin
> [ +0.000338] rtw89_mac_power_switch enter, on 1
> [ +2.005000] rtw89_8852au 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> [ +0.000010] rtw89_mac_power_switch enter, on 0
> [ +0.007867] rtw89_mac_power_switch enter, on 1
> [ +0.020254] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 1
> [ +0.000010] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 3
> [ +0.963868] rtw89_8852au 1-4:1.0: chip rfe_type is 1
> [ +0.103131] rtw89_mac_power_switch enter, on 0
> [ +0.011027] rtw89_8852au 1-4:1.0: rfkill hardware state changed to enable
> [ +0.051507] rtw89_8852au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> [ +0.020062] rtw89_mac_power_switch enter, on 1
>
> >>
> >> Is it possible this code related to R_AX_SYSON_FSM_MON is not
> >> applicable to USB? My adapters still work if I delete it.
> >
> > I'm checking internal experts. Quickly checking vendor driver, I don't see
> > it avoids calling this because of USB devices.
> >
> > If you delete code related to R_AX_SYSON_FSM_MON, will it show below messages
> > under the case 'val32 == MAC_AX_MAC_ON'?
> >
> > "[ERR]Polling MAC state timeout= %X\n"
> >
>
> No, I never see that error. I checked the value of R_AX_IC_PWR_STATE.
> My RTL8832BU with the Windows driver onboard:
>
> [ +4.566707] usb 1-4: new high-speed USB device number 20 using xhci_hcd
> [ +0.125152] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
> [ +0.000008] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [ +0.000002] usb 1-4: Product: DISK
> [ +0.000002] usb 1-4: Manufacturer: Realtek
> [ +0.000544] usb-storage 1-4:1.0: USB Mass Storage device detected
> [ +0.000160] usb-storage 1-4:1.0: device ignored
> [ +0.629850] usb 1-4: USB disconnect, device number 20
> [ +0.723342] usb 1-4: new high-speed USB device number 21 using xhci_hcd
> [ +0.125493] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
> [ +0.000013] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
> [ +0.000004] usb 1-4: Manufacturer: Realtek
> [ +0.000004] usb 1-4: SerialNumber: 00e04c000001
> [ +0.007910] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> [ +0.005682] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200104
> [ +2.000406] rtw89_8852bu 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> [ +0.017635] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> [ +0.043991] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
> [ +0.000009] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
> [ +1.462646] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
> [ +0.135147] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
> [ +0.045006] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> [ +0.016726] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>
> And another RTL8832BU without a Windows driver onboard:
>
> [Dec15 19:46] usb 1-4: new high-speed USB device number 22 using xhci_hcd
> [ +0.125532] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
> [ +0.000010] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> [ +0.000003] usb 1-4: Product: 802.11ax WLAN Adapter
> [ +0.000003] usb 1-4: Manufacturer: Realtek
> [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
> [ +0.007667] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> [ +0.002684] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> [ +0.045258] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
> [ +0.000015] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
> [ +1.462130] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
> [ +0.133511] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
> [ +0.043307] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> [ +0.017936] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>
> Maybe your borrowed adapters don't have the Windows drivers onboard either?
Yes, the adapters I borrowed are just pure WiFi adapters, no Windows drivers onboard.
I will share these information to internal experts to see how I can handle
this kind of adapters.
>
> >>
> >> (I don't get the error with RTL8912AU.)
> >>
> >
> > I'm adding this patch for WiFi 7 chips mainly, and this seems to be expected.
> >
>
> My RTL8912AU does have the Windows driver onboard, but no error:
>
> [ +5.365639] usb 1-4: new high-speed USB device number 25 using xhci_hcd
> [ +0.124722] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
> [ +0.000007] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> [ +0.000002] usb 1-4: Product: DISK
> [ +0.000002] usb 1-4: Manufacturer: Realtek
> [ +0.000540] usb-storage 1-4:1.0: USB Mass Storage device detected
> [ +0.000143] usb-storage 1-4:1.0: device ignored
> [ +0.629713] usb 1-4: USB disconnect, device number 25
> [ +0.420492] usb 1-4: new high-speed USB device number 26 using xhci_hcd
> [ +0.125490] usb 1-4: New USB device found, idVendor=0bda, idProduct=8912, bcdDevice= 0.00
> [ +0.000009] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> [ +0.000002] usb 1-4: Product: 802.11be WLAN Adapter
> [ +0.000002] usb 1-4: Manufacturer: Realtek
> [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
> [ +0.008039] rtw89_8922au 1-4:1.0: loaded firmware rtw89/rtw8922a_fw-4.bin
> [ +0.005192] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200104
> [ +0.055131] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 1
> [ +0.000009] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 3
> [ +1.419275] rtw89_8922au 1-4:1.0: chip rfe_type is 1
> [ +0.042634] rtw89_8922au 1-4:1.0: Firmware version 0.1.0.0 (7b393818), cmd version 0, type 64
> [ +0.000012] rtw89_8922au 1-4:1.0: Firmware element BB version: 00 49 00 00
> [ +0.000014] rtw89_8922au 1-4:1.0: Firmware element radio A version: 00 33 00 00
> [ +0.000015] rtw89_8922au 1-4:1.0: Firmware element NCTL version: 00 0f 00 00
> [ +0.000118] rtw89_8922au 1-4:1.0: Firmware element TXPWR version: 00 40 00 00
> [ +0.000005] rtw89_8922au 1-4:1.0: Firmware element PWR_TRK version: 00 33 00 00
> [ +0.000010] rtw89_8922au 1-4:1.0: Firmware element REGD version: 00 48 00 06
> [ +0.024441] rtw89_8922au 1-4:1.0: rfkill hardware state changed to enable
> [ +0.042643] rtw89_8922au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> [ +0.012737] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200004
^ permalink raw reply [flat|nested] 23+ messages in thread
* RE: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-16 0:34 ` Ping-Ke Shih
@ 2025-12-16 9:06 ` Ping-Ke Shih
2025-12-17 18:05 ` Bitterblue Smith
0 siblings, 1 reply; 23+ messages in thread
From: Ping-Ke Shih @ 2025-12-16 9:06 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
Hi Bitterblue,
Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> > On 15/12/2025 04:05, Ping-Ke Shih wrote:
> > > Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote;
> > >> On 12/12/2025 05:12, Ping-Ke Shih wrote:
> > >>> To run power on function properly, reset power states (off/on/PS) to
> > >>> initial state. Otherwise, it might be unusable due to fail to power on.
> > >>>
> > >>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
> > >>> ---
> > >>> drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
> > >>> drivers/net/wireless/realtek/rtw89/mac.h | 1 +
> > >>> drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
> > >>> drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
> > >>> 4 files changed, 240 insertions(+), 7 deletions(-)
> > >>>
> > >>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> > >>> index d78fbe73e365..ba4344a640f5 100644
> > >>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> > >>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> > >>> @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> > >>>
> > >>> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > >>> {
> > >>> -#define PWR_ACT 1
> > >>> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
> > >>> const struct rtw89_chip_info *chip = rtwdev->chip;
> > >>> const struct rtw89_pwr_cfg * const *cfg_seq;
> > >>> int (*cfg_func)(struct rtw89_dev *rtwdev);
> > >>> int ret;
> > >>> - u8 val;
> > >>>
> > >>> rtw89_mac_power_switch_boot_mode(rtwdev);
> > >>>
> > >>> @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > >>> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
> > >>> __rtw89_leave_ps_mode(rtwdev);
> > >>>
> > >>> - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
> > >>> - if (on && val == PWR_ACT) {
> > >>> - rtw89_err(rtwdev, "MAC has already powered on\n");
> > >>> - return -EBUSY;
> > >>> + if (on) {
> > >>> + ret = mac->reset_pwr_state(rtwdev);
> > >>> + if (ret)
> > >>> + return ret;
> > >>> }
> > >>>
> > >>> ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
> > >>> @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
> > >>> }
> > >>>
> > >>> return 0;
> > >>> -#undef PWR_ACT
> > >>> }
> > >>>
> > >>> int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
> > >>> @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
> > >>> return 0;
> > >>> }
> > >>>
> > >>> +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
> > >>> +{
> > >>> + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
> > >>> + u32 val32;
> > >>> + int ret;
> > >>> +
> > >>> + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
> > >>> + val32 &= WLAN_FSM_MASK;
> > >>> + val32 |= WLAN_FSM_SET;
> > >>> + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
> > >>> +
> > >>> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
> > >>> + 1000, 2000000, false,
> > >>> + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> > >>> + if (ret) {
> > >>> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> > >>> + return ret;
> > >>> + }
> > >>
> > >> I get this error message with every AX chip the first time
> > >> rtw89_mac_pwr_on() is called:
> > >>
> > >> [ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> > >> [ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> > >>
> > >> They still work, because the second attempt in rtw89_mac_pwr_on()
> > >> succeeds.
> > >>
> > >> Before this patch, the message was "MAC has already powered on".
> > >> The new message says it's an error, so it will confuse people.
> > >
> > > I borrow a 8852AU and a 8852CU that both don't have error messages.
> > > The "first time" you meant is just to plug the USB adapter?
> > > If so, I have not idea about the difference between yours and mine.
> > >
> >
> > Yes, the error only appears right after the adapter is plugged in.
> > I put a message at the top of rtw89_mac_power_switch():
> >
> > [ +0.721188] usb 1-4: new high-speed USB device number 8 using xhci_hcd
> > [ +0.126425] usb 1-4: New USB device found, idVendor=0bda, idProduct=8832, bcdDevice= 0.00
> > [ +0.000014] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> > [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
> > [ +0.000004] usb 1-4: Manufacturer: Realtek
> > [ +0.000003] usb 1-4: SerialNumber: 00e04c000001
> > [ +0.007757] rtw89_8852au 1-4:1.0: loaded firmware rtw89/rtw8852a_fw.bin
> > [ +0.000338] rtw89_mac_power_switch enter, on 1
> > [ +2.005000] rtw89_8852au 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> > [ +0.000010] rtw89_mac_power_switch enter, on 0
> > [ +0.007867] rtw89_mac_power_switch enter, on 1
> > [ +0.020254] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 1
> > [ +0.000010] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 3
> > [ +0.963868] rtw89_8852au 1-4:1.0: chip rfe_type is 1
> > [ +0.103131] rtw89_mac_power_switch enter, on 0
> > [ +0.011027] rtw89_8852au 1-4:1.0: rfkill hardware state changed to enable
> > [ +0.051507] rtw89_8852au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> > [ +0.020062] rtw89_mac_power_switch enter, on 1
> >
> > >>
> > >> Is it possible this code related to R_AX_SYSON_FSM_MON is not
> > >> applicable to USB? My adapters still work if I delete it.
> > >
> > > I'm checking internal experts. Quickly checking vendor driver, I don't see
> > > it avoids calling this because of USB devices.
> > >
> > > If you delete code related to R_AX_SYSON_FSM_MON, will it show below messages
> > > under the case 'val32 == MAC_AX_MAC_ON'?
> > >
> > > "[ERR]Polling MAC state timeout= %X\n"
> > >
> >
> > No, I never see that error. I checked the value of R_AX_IC_PWR_STATE.
> > My RTL8832BU with the Windows driver onboard:
> >
> > [ +4.566707] usb 1-4: new high-speed USB device number 20 using xhci_hcd
> > [ +0.125152] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
> > [ +0.000008] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> > [ +0.000002] usb 1-4: Product: DISK
> > [ +0.000002] usb 1-4: Manufacturer: Realtek
> > [ +0.000544] usb-storage 1-4:1.0: USB Mass Storage device detected
> > [ +0.000160] usb-storage 1-4:1.0: device ignored
> > [ +0.629850] usb 1-4: USB disconnect, device number 20
> > [ +0.723342] usb 1-4: new high-speed USB device number 21 using xhci_hcd
> > [ +0.125493] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
> > [ +0.000013] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> > [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
> > [ +0.000004] usb 1-4: Manufacturer: Realtek
> > [ +0.000004] usb 1-4: SerialNumber: 00e04c000001
> > [ +0.007910] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> > [ +0.005682] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200104
> > [ +2.000406] rtw89_8852bu 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
> > [ +0.017635] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> > [ +0.043991] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
> > [ +0.000009] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
> > [ +1.462646] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
> > [ +0.135147] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
> > [ +0.045006] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> > [ +0.016726] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> >
> > And another RTL8832BU without a Windows driver onboard:
> >
> > [Dec15 19:46] usb 1-4: new high-speed USB device number 22 using xhci_hcd
> > [ +0.125532] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
> > [ +0.000010] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> > [ +0.000003] usb 1-4: Product: 802.11ax WLAN Adapter
> > [ +0.000003] usb 1-4: Manufacturer: Realtek
> > [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
> > [ +0.007667] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
> > [ +0.002684] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> > [ +0.045258] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
> > [ +0.000015] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
> > [ +1.462130] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
> > [ +0.133511] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
> > [ +0.043307] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> > [ +0.017936] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
> >
> > Maybe your borrowed adapters don't have the Windows drivers onboard either?
>
> Yes, the adapters I borrowed are just pure WiFi adapters, no Windows drivers onboard.
>
> I will share these information to internal experts to see how I can handle
> this kind of adapters.
>
> >
> > >>
> > >> (I don't get the error with RTL8912AU.)
> > >>
> > >
> > > I'm adding this patch for WiFi 7 chips mainly, and this seems to be expected.
> > >
> >
> > My RTL8912AU does have the Windows driver onboard, but no error:
> >
> > [ +5.365639] usb 1-4: new high-speed USB device number 25 using xhci_hcd
> > [ +0.124722] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
> > [ +0.000007] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> > [ +0.000002] usb 1-4: Product: DISK
> > [ +0.000002] usb 1-4: Manufacturer: Realtek
> > [ +0.000540] usb-storage 1-4:1.0: USB Mass Storage device detected
> > [ +0.000143] usb-storage 1-4:1.0: device ignored
> > [ +0.629713] usb 1-4: USB disconnect, device number 25
> > [ +0.420492] usb 1-4: new high-speed USB device number 26 using xhci_hcd
> > [ +0.125490] usb 1-4: New USB device found, idVendor=0bda, idProduct=8912, bcdDevice= 0.00
> > [ +0.000009] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> > [ +0.000002] usb 1-4: Product: 802.11be WLAN Adapter
> > [ +0.000002] usb 1-4: Manufacturer: Realtek
> > [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
> > [ +0.008039] rtw89_8922au 1-4:1.0: loaded firmware rtw89/rtw8922a_fw-4.bin
> > [ +0.005192] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200104
> > [ +0.055131] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 1
> > [ +0.000009] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 3
> > [ +1.419275] rtw89_8922au 1-4:1.0: chip rfe_type is 1
> > [ +0.042634] rtw89_8922au 1-4:1.0: Firmware version 0.1.0.0 (7b393818), cmd version 0, type 64
> > [ +0.000012] rtw89_8922au 1-4:1.0: Firmware element BB version: 00 49 00 00
> > [ +0.000014] rtw89_8922au 1-4:1.0: Firmware element radio A version: 00 33 00 00
> > [ +0.000015] rtw89_8922au 1-4:1.0: Firmware element NCTL version: 00 0f 00 00
> > [ +0.000118] rtw89_8922au 1-4:1.0: Firmware element TXPWR version: 00 40 00 00
> > [ +0.000005] rtw89_8922au 1-4:1.0: Firmware element PWR_TRK version: 00 33 00 00
> > [ +0.000010] rtw89_8922au 1-4:1.0: Firmware element REGD version: 00 48 00 06
> > [ +0.024441] rtw89_8922au 1-4:1.0: rfkill hardware state changed to enable
> > [ +0.042643] rtw89_8922au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
> > [ +0.012737] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200004
Could you apply below to my original patchset to see if it can silence warning?
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 7ffb039e7d1b..1f9f21040adc 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -3950,6 +3950,16 @@ static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
1000, 2000000, false,
rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
if (ret) {
+ /*
+ * A USB adapter might play as USB mass storage with driver and
+ * then switch to WiFi adapter, causing it stays on power-on
+ * state when doing WiFi USB probe. Return EAGAIN to caller to
+ * power-off and power-on again to reset the state.
+ */
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_USB &&
+ !test_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags))
+ return -EAGAIN;
+
rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
return ret;
}
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on
2025-12-16 9:06 ` Ping-Ke Shih
@ 2025-12-17 18:05 ` Bitterblue Smith
0 siblings, 0 replies; 23+ messages in thread
From: Bitterblue Smith @ 2025-12-17 18:05 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
Cc: Gary Chang, Damon Chen, Zong-Zhe Yang
On 16/12/2025 11:06, Ping-Ke Shih wrote:
> Hi Bitterblue,
>
> Ping-Ke Shih wrote:
>> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>>> On 15/12/2025 04:05, Ping-Ke Shih wrote:
>>>> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote;
>>>>> On 12/12/2025 05:12, Ping-Ke Shih wrote:
>>>>>> To run power on function properly, reset power states (off/on/PS) to
>>>>>> initial state. Otherwise, it might be unusable due to fail to power on.
>>>>>>
>>>>>> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
>>>>>> ---
>>>>>> drivers/net/wireless/realtek/rtw89/mac.c | 89 ++++++++++++--
>>>>>> drivers/net/wireless/realtek/rtw89/mac.h | 1 +
>>>>>> drivers/net/wireless/realtek/rtw89/mac_be.c | 130 ++++++++++++++++++++
>>>>>> drivers/net/wireless/realtek/rtw89/reg.h | 27 ++++
>>>>>> 4 files changed, 240 insertions(+), 7 deletions(-)
>>>>>>
>>>>>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
>>>>>> index d78fbe73e365..ba4344a640f5 100644
>>>>>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
>>>>>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
>>>>>> @@ -1478,13 +1478,11 @@ static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
>>>>>>
>>>>>> static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>>>>> {
>>>>>> -#define PWR_ACT 1
>>>>>> const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
>>>>>> const struct rtw89_chip_info *chip = rtwdev->chip;
>>>>>> const struct rtw89_pwr_cfg * const *cfg_seq;
>>>>>> int (*cfg_func)(struct rtw89_dev *rtwdev);
>>>>>> int ret;
>>>>>> - u8 val;
>>>>>>
>>>>>> rtw89_mac_power_switch_boot_mode(rtwdev);
>>>>>>
>>>>>> @@ -1499,10 +1497,10 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>>>>> if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
>>>>>> __rtw89_leave_ps_mode(rtwdev);
>>>>>>
>>>>>> - val = rtw89_read32_mask(rtwdev, R_AX_IC_PWR_STATE, B_AX_WLMAC_PWR_STE_MASK);
>>>>>> - if (on && val == PWR_ACT) {
>>>>>> - rtw89_err(rtwdev, "MAC has already powered on\n");
>>>>>> - return -EBUSY;
>>>>>> + if (on) {
>>>>>> + ret = mac->reset_pwr_state(rtwdev);
>>>>>> + if (ret)
>>>>>> + return ret;
>>>>>> }
>>>>>>
>>>>>> ret = cfg_func ? cfg_func(rtwdev) : rtw89_mac_pwr_seq(rtwdev, cfg_seq);
>>>>>> @@ -1529,7 +1527,6 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
>>>>>> }
>>>>>>
>>>>>> return 0;
>>>>>> -#undef PWR_ACT
>>>>>> }
>>>>>>
>>>>>> int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
>>>>>> @@ -3931,6 +3928,83 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> +static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
>>>>>> +{
>>>>>> + enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
>>>>>> + u32 val32;
>>>>>> + int ret;
>>>>>> +
>>>>>> + val32 = rtw89_read32(rtwdev, R_AX_SYSON_FSM_MON);
>>>>>> + val32 &= WLAN_FSM_MASK;
>>>>>> + val32 |= WLAN_FSM_SET;
>>>>>> + rtw89_write32(rtwdev, R_AX_SYSON_FSM_MON, val32);
>>>>>> +
>>>>>> + ret = read_poll_timeout(rtw89_read32_mask, val32, val32 == WLAN_FSM_IDLE,
>>>>>> + 1000, 2000000, false,
>>>>>> + rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
>>>>>> + if (ret) {
>>>>>> + rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
>>>>>> + return ret;
>>>>>> + }
>>>>>
>>>>> I get this error message with every AX chip the first time
>>>>> rtw89_mac_pwr_on() is called:
>>>>>
>>>>> [ +0.007286] rtw89_8852bu 2-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
>>>>> [ +2.001260] rtw89_8852bu 2-4:1.0: [ERR]Polling WLAN PMC timeout= 100
>>>>>
>>>>> They still work, because the second attempt in rtw89_mac_pwr_on()
>>>>> succeeds.
>>>>>
>>>>> Before this patch, the message was "MAC has already powered on".
>>>>> The new message says it's an error, so it will confuse people.
>>>>
>>>> I borrow a 8852AU and a 8852CU that both don't have error messages.
>>>> The "first time" you meant is just to plug the USB adapter?
>>>> If so, I have not idea about the difference between yours and mine.
>>>>
>>>
>>> Yes, the error only appears right after the adapter is plugged in.
>>> I put a message at the top of rtw89_mac_power_switch():
>>>
>>> [ +0.721188] usb 1-4: new high-speed USB device number 8 using xhci_hcd
>>> [ +0.126425] usb 1-4: New USB device found, idVendor=0bda, idProduct=8832, bcdDevice= 0.00
>>> [ +0.000014] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
>>> [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
>>> [ +0.000004] usb 1-4: Manufacturer: Realtek
>>> [ +0.000003] usb 1-4: SerialNumber: 00e04c000001
>>> [ +0.007757] rtw89_8852au 1-4:1.0: loaded firmware rtw89/rtw8852a_fw.bin
>>> [ +0.000338] rtw89_mac_power_switch enter, on 1
>>> [ +2.005000] rtw89_8852au 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
>>> [ +0.000010] rtw89_mac_power_switch enter, on 0
>>> [ +0.007867] rtw89_mac_power_switch enter, on 1
>>> [ +0.020254] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 1
>>> [ +0.000010] rtw89_8852au 1-4:1.0: Firmware version 0.13.36.2 (52acc807), cmd version 0, type 3
>>> [ +0.963868] rtw89_8852au 1-4:1.0: chip rfe_type is 1
>>> [ +0.103131] rtw89_mac_power_switch enter, on 0
>>> [ +0.011027] rtw89_8852au 1-4:1.0: rfkill hardware state changed to enable
>>> [ +0.051507] rtw89_8852au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
>>> [ +0.020062] rtw89_mac_power_switch enter, on 1
>>>
>>>>>
>>>>> Is it possible this code related to R_AX_SYSON_FSM_MON is not
>>>>> applicable to USB? My adapters still work if I delete it.
>>>>
>>>> I'm checking internal experts. Quickly checking vendor driver, I don't see
>>>> it avoids calling this because of USB devices.
>>>>
>>>> If you delete code related to R_AX_SYSON_FSM_MON, will it show below messages
>>>> under the case 'val32 == MAC_AX_MAC_ON'?
>>>>
>>>> "[ERR]Polling MAC state timeout= %X\n"
>>>>
>>>
>>> No, I never see that error. I checked the value of R_AX_IC_PWR_STATE.
>>> My RTL8832BU with the Windows driver onboard:
>>>
>>> [ +4.566707] usb 1-4: new high-speed USB device number 20 using xhci_hcd
>>> [ +0.125152] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
>>> [ +0.000008] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
>>> [ +0.000002] usb 1-4: Product: DISK
>>> [ +0.000002] usb 1-4: Manufacturer: Realtek
>>> [ +0.000544] usb-storage 1-4:1.0: USB Mass Storage device detected
>>> [ +0.000160] usb-storage 1-4:1.0: device ignored
>>> [ +0.629850] usb 1-4: USB disconnect, device number 20
>>> [ +0.723342] usb 1-4: new high-speed USB device number 21 using xhci_hcd
>>> [ +0.125493] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
>>> [ +0.000013] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
>>> [ +0.000005] usb 1-4: Product: 802.11ac WLAN Adapter
>>> [ +0.000004] usb 1-4: Manufacturer: Realtek
>>> [ +0.000004] usb 1-4: SerialNumber: 00e04c000001
>>> [ +0.007910] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
>>> [ +0.005682] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200104
>>> [ +2.000406] rtw89_8852bu 1-4:1.0: [ERR]Polling WLAN PMC timeout= 100
>>> [ +0.017635] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>>> [ +0.043991] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
>>> [ +0.000009] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
>>> [ +1.462646] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
>>> [ +0.135147] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
>>> [ +0.045006] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
>>> [ +0.016726] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>>>
>>> And another RTL8832BU without a Windows driver onboard:
>>>
>>> [Dec15 19:46] usb 1-4: new high-speed USB device number 22 using xhci_hcd
>>> [ +0.125532] usb 1-4: New USB device found, idVendor=0bda, idProduct=b832, bcdDevice= 0.00
>>> [ +0.000010] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
>>> [ +0.000003] usb 1-4: Product: 802.11ax WLAN Adapter
>>> [ +0.000003] usb 1-4: Manufacturer: Realtek
>>> [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
>>> [ +0.007667] rtw89_8852bu 1-4:1.0: loaded firmware rtw89/rtw8852b_fw-1.bin
>>> [ +0.002684] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>>> [ +0.045258] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 5
>>> [ +0.000015] rtw89_8852bu 1-4:1.0: Firmware version 0.29.128.0 (418a672d), cmd version 0, type 3
>>> [ +1.462130] rtw89_8852bu 1-4:1.0: chip rfe_type is 1
>>> [ +0.133511] rtw89_8852bu 1-4:1.0: rfkill hardware state changed to enable
>>> [ +0.043307] rtw89_8852bu 1-4:1.0 wlp3s0f3u4: renamed from wlan0
>>> [ +0.017936] rtw89_mac_reset_pwr_state_ax R_AX_IC_PWR_STATE=0x2200004
>>>
>>> Maybe your borrowed adapters don't have the Windows drivers onboard either?
>>
>> Yes, the adapters I borrowed are just pure WiFi adapters, no Windows drivers onboard.
>>
>> I will share these information to internal experts to see how I can handle
>> this kind of adapters.
>>
>>>
>>>>>
>>>>> (I don't get the error with RTL8912AU.)
>>>>>
>>>>
>>>> I'm adding this patch for WiFi 7 chips mainly, and this seems to be expected.
>>>>
>>>
>>> My RTL8912AU does have the Windows driver onboard, but no error:
>>>
>>> [ +5.365639] usb 1-4: new high-speed USB device number 25 using xhci_hcd
>>> [ +0.124722] usb 1-4: New USB device found, idVendor=0bda, idProduct=1a2b, bcdDevice= 0.00
>>> [ +0.000007] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
>>> [ +0.000002] usb 1-4: Product: DISK
>>> [ +0.000002] usb 1-4: Manufacturer: Realtek
>>> [ +0.000540] usb-storage 1-4:1.0: USB Mass Storage device detected
>>> [ +0.000143] usb-storage 1-4:1.0: device ignored
>>> [ +0.629713] usb 1-4: USB disconnect, device number 25
>>> [ +0.420492] usb 1-4: new high-speed USB device number 26 using xhci_hcd
>>> [ +0.125490] usb 1-4: New USB device found, idVendor=0bda, idProduct=8912, bcdDevice= 0.00
>>> [ +0.000009] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
>>> [ +0.000002] usb 1-4: Product: 802.11be WLAN Adapter
>>> [ +0.000002] usb 1-4: Manufacturer: Realtek
>>> [ +0.000002] usb 1-4: SerialNumber: 00e04c000001
>>> [ +0.008039] rtw89_8922au 1-4:1.0: loaded firmware rtw89/rtw8922a_fw-4.bin
>>> [ +0.005192] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200104
>>> [ +0.055131] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 1
>>> [ +0.000009] rtw89_8922au 1-4:1.0: Firmware version 0.35.80.3 (8ef4f0cf), cmd version 1, type 3
>>> [ +1.419275] rtw89_8922au 1-4:1.0: chip rfe_type is 1
>>> [ +0.042634] rtw89_8922au 1-4:1.0: Firmware version 0.1.0.0 (7b393818), cmd version 0, type 64
>>> [ +0.000012] rtw89_8922au 1-4:1.0: Firmware element BB version: 00 49 00 00
>>> [ +0.000014] rtw89_8922au 1-4:1.0: Firmware element radio A version: 00 33 00 00
>>> [ +0.000015] rtw89_8922au 1-4:1.0: Firmware element NCTL version: 00 0f 00 00
>>> [ +0.000118] rtw89_8922au 1-4:1.0: Firmware element TXPWR version: 00 40 00 00
>>> [ +0.000005] rtw89_8922au 1-4:1.0: Firmware element PWR_TRK version: 00 33 00 00
>>> [ +0.000010] rtw89_8922au 1-4:1.0: Firmware element REGD version: 00 48 00 06
>>> [ +0.024441] rtw89_8922au 1-4:1.0: rfkill hardware state changed to enable
>>> [ +0.042643] rtw89_8922au 1-4:1.0 wlp3s0f3u4: renamed from wlan0
>>> [ +0.012737] rtw89_mac_reset_pwr_state_be R_AX_IC_PWR_STATE=0x2200004
>
> Could you apply below to my original patchset to see if it can silence warning?
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 7ffb039e7d1b..1f9f21040adc 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -3950,6 +3950,16 @@ static int rtw89_mac_reset_pwr_state_ax(struct rtw89_dev *rtwdev)
> 1000, 2000000, false,
> rtwdev, R_AX_SYSON_FSM_MON, WLAN_FSM_STATE_MASK);
> if (ret) {
> + /*
> + * A USB adapter might play as USB mass storage with driver and
> + * then switch to WiFi adapter, causing it stays on power-on
> + * state when doing WiFi USB probe. Return EAGAIN to caller to
> + * power-off and power-on again to reset the state.
> + */
> + if (rtwdev->hci.type == RTW89_HCI_TYPE_USB &&
> + !test_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags))
> + return -EAGAIN;
> +
> rtw89_err(rtwdev, "[ERR]Polling WLAN PMC timeout= %X\n", val32);
> return ret;
> }
>
Yes, that silences the warning.
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2025-12-17 18:05 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-12 3:12 [PATCH rtw-next 00/12] wifi: rtw89: refine MLO, MCC and SER functions Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 01/12] wifi: rtw89: 8852b: increase beacon loss to 6 seconds Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 02/12] wifi: rtw89: mlo: fix missing TX null-data 1 during link switch Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 03/12] wifi: rtw89: mlo: fix incorrect link address in management frames Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 04/12] wifi: rtw89: mac: reset power state before switching to power on Ping-Ke Shih
2025-12-14 22:30 ` Bitterblue Smith
2025-12-15 2:05 ` Ping-Ke Shih
2025-12-15 18:06 ` Bitterblue Smith
2025-12-16 0:34 ` Ping-Ke Shih
2025-12-16 9:06 ` Ping-Ke Shih
2025-12-17 18:05 ` Bitterblue Smith
2025-12-12 3:12 ` [PATCH rtw-next 05/12] wifi: rtw89: ser: enable error IMR after recovering from L1 Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 06/12] wifi: rtw89: ser: L1 skip polling status if FW runs event mode Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 07/12] wifi: rtw89: debug: add ser_counters dbgfs Ping-Ke Shih
2025-12-12 3:12 ` [PATCH rtw-next 08/12] wifi: rtw89: debug: support SER L0/L1 simulation via halt H2C Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 09/12] wifi: rtw89: refine C2H reg event polling timeout for LPS Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 10/12] wifi: rtw89: warn unexpected polling value of XTAL SI Ping-Ke Shih
2025-12-14 22:32 ` Bitterblue Smith
2025-12-15 1:24 ` Ping-Ke Shih
2025-12-15 22:13 ` Bitterblue Smith
2025-12-16 0:29 ` Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 11/12] wifi: rtw89: setting TBTT AGG number when mac port initialization Ping-Ke Shih
2025-12-12 3:13 ` [PATCH rtw-next 12/12] wifi: rtw89: mcc: reset probe counter when receiving beacon Ping-Ke Shih
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).