From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <timlee@realtek.com>, <dian_syuan0116@realtek.com>,
<phhuang@realtek.com>, <kevin_yang@realtek.com>
Subject: [PATCH rtw-next 02/13] wifi: rtw89: debug: Wi-Fi 7 update simulation of SER L0/L1 by halt H2C command
Date: Fri, 15 May 2026 09:44:22 +0800 [thread overview]
Message-ID: <20260515014433.16168-3-pkshih@realtek.com> (raw)
In-Reply-To: <20260515014433.16168-1-pkshih@realtek.com>
From: Zong-Zhe Yang <kevin_yang@realtek.com>
Wi-Fi 7 FW fixes support of triggering SER L0/L1 simulation via halt H2C
command on v0.35.108.0. After that, the halt H2C command trigger for
Wi-Fi 6 and Wi-Fi 7 can be the same. Update FW feature table and share the
halt H2C command trigger function between Wi-Fi 6 and Wi-Fi 7.
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 | 101 +++++++++------------
drivers/net/wireless/realtek/rtw89/fw.c | 2 +-
2 files changed, 45 insertions(+), 58 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
index e5976b8e7056..c0fbb016cea4 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.c
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
@@ -3543,20 +3543,38 @@ rtw89_debug_priv_early_h2c_set(struct rtw89_dev *rtwdev,
return count;
}
-static int rtw89_dbg_trigger_l1_error_by_halt_h2c_ax(struct rtw89_dev *rtwdev)
+static int rtw89_dbg_trigger_l1_error_ax(struct rtw89_dev *rtwdev)
{
- if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
- return -EBUSY;
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
+ struct rtw89_cpuio_ctrl ctrl_para = {};
+ u16 pkt_id;
+ int ret;
- return rtw89_mac_set_err_status(rtwdev, MAC_AX_ERR_L1_RESET_FORCE);
+ ret = mac->dle_buf_req(rtwdev, 0x20, true, &pkt_id);
+ if (ret)
+ return ret;
+
+ /* intentionally, enqueue two pkt, but has only one pkt id */
+ ctrl_para.cmd_type = CPUIO_OP_CMD_ENQ_TO_HEAD;
+ ctrl_para.start_pktid = pkt_id;
+ ctrl_para.end_pktid = pkt_id;
+ ctrl_para.pkt_num = 1; /* start from 0 */
+ ctrl_para.dst_pid = WDE_DLE_PORT_ID_WDRLS;
+ ctrl_para.dst_qid = WDE_DLE_QUEID_NO_REPORT;
+
+ if (mac->set_cpuio(rtwdev, &ctrl_para, true))
+ return -EFAULT;
+
+ return 0;
}
-static int rtw89_dbg_trigger_l1_error_by_halt_h2c_be(struct rtw89_dev *rtwdev)
+static int rtw89_dbg_trigger_l1_error_be(struct rtw89_dev *rtwdev)
{
- if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
- return -EBUSY;
+ int ret;
- rtw89_leave_ps_mode(rtwdev);
+ ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL);
+ if (ret)
+ return ret;
rtw89_write32_set(rtwdev, R_BE_FW_TRIGGER_IDCT_ISR,
B_BE_DMAC_FW_TRIG_IDCT | B_BE_DMAC_FW_ERR_IDCT_IMR);
@@ -3565,47 +3583,35 @@ static int rtw89_dbg_trigger_l1_error_by_halt_h2c_be(struct rtw89_dev *rtwdev)
}
static int rtw89_dbg_trigger_l1_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_l1_error(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ int (*sim_l1)(struct rtw89_dev *rtwdev);
switch (chip->chip_gen) {
case RTW89_CHIP_AX:
- return rtw89_dbg_trigger_l1_error_by_halt_h2c_ax(rtwdev);
+ sim_l1 = rtw89_dbg_trigger_l1_error_ax;
+ break;
case RTW89_CHIP_BE:
- return rtw89_dbg_trigger_l1_error_by_halt_h2c_be(rtwdev);
+ sim_l1 = rtw89_dbg_trigger_l1_error_be;
+ break;
default:
return -EOPNOTSUPP;
}
-}
-
-static int rtw89_dbg_trigger_l1_error(struct rtw89_dev *rtwdev)
-{
- const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
- struct rtw89_cpuio_ctrl ctrl_para = {0};
- u16 pkt_id;
- int ret;
if (RTW89_CHK_FW_FEATURE(SIM_SER_L0L1_BY_HALT_H2C, &rtwdev->fw))
return rtw89_dbg_trigger_l1_error_by_halt_h2c(rtwdev);
rtw89_leave_ps_mode(rtwdev);
- ret = mac->dle_buf_req(rtwdev, 0x20, true, &pkt_id);
- if (ret)
- return ret;
-
- /* intentionally, enqueue two pkt, but has only one pkt id */
- ctrl_para.cmd_type = CPUIO_OP_CMD_ENQ_TO_HEAD;
- ctrl_para.start_pktid = pkt_id;
- ctrl_para.end_pktid = pkt_id;
- ctrl_para.pkt_num = 1; /* start from 0 */
- ctrl_para.dst_pid = WDE_DLE_PORT_ID_WDRLS;
- ctrl_para.dst_qid = WDE_DLE_QUEID_NO_REPORT;
-
- if (mac->set_cpuio(rtwdev, &ctrl_para, true))
- return -EFAULT;
-
- return 0;
+ return sim_l1(rtwdev);
}
static int rtw89_dbg_trigger_l0_error_ax(struct rtw89_dev *rtwdev)
@@ -3632,22 +3638,19 @@ static int rtw89_dbg_trigger_l0_error_ax(struct rtw89_dev *rtwdev)
static int rtw89_dbg_trigger_l0_error_be(struct rtw89_dev *rtwdev)
{
- u8 val8;
int ret;
ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_CMAC_SEL);
if (ret)
return ret;
- val8 = rtw89_read8(rtwdev, R_BE_CMAC_FUNC_EN);
- rtw89_write8(rtwdev, R_BE_CMAC_FUNC_EN, val8 & ~B_BE_TMAC_EN);
- mdelay(1);
- rtw89_write8(rtwdev, R_BE_CMAC_FUNC_EN, val8);
+ rtw89_write32_set(rtwdev, R_BE_CMAC_FW_TRIGGER_IDCT_ISR,
+ B_BE_CMAC_FW_TRIG_IDCT | B_BE_CMAC_FW_ERR_IDCT_IMR);
return 0;
}
-static int rtw89_dbg_trigger_l0_error_by_halt_h2c_ax(struct rtw89_dev *rtwdev)
+static int rtw89_dbg_trigger_l0_error_by_halt_h2c(struct rtw89_dev *rtwdev)
{
if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
return -EBUSY;
@@ -3655,32 +3658,16 @@ static int rtw89_dbg_trigger_l0_error_by_halt_h2c_ax(struct rtw89_dev *rtwdev)
return rtw89_mac_set_err_status(rtwdev, MAC_AX_ERR_L0_RESET_FORCE);
}
-static int rtw89_dbg_trigger_l0_error_by_halt_h2c_be(struct rtw89_dev *rtwdev)
-{
- if (!test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags))
- return -EBUSY;
-
- rtw89_leave_ps_mode(rtwdev);
-
- rtw89_write32_set(rtwdev, R_BE_CMAC_FW_TRIGGER_IDCT_ISR,
- B_BE_CMAC_FW_TRIG_IDCT | B_BE_CMAC_FW_ERR_IDCT_IMR);
-
- return 0;
-}
-
static int rtw89_dbg_trigger_l0_error(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
- int (*sim_l0_by_halt_h2c)(struct rtw89_dev *rtwdev);
int (*sim_l0)(struct rtw89_dev *rtwdev);
switch (chip->chip_gen) {
case RTW89_CHIP_AX:
- sim_l0_by_halt_h2c = rtw89_dbg_trigger_l0_error_by_halt_h2c_ax;
sim_l0 = rtw89_dbg_trigger_l0_error_ax;
break;
case RTW89_CHIP_BE:
- sim_l0_by_halt_h2c = rtw89_dbg_trigger_l0_error_by_halt_h2c_be;
sim_l0 = rtw89_dbg_trigger_l0_error_be;
break;
default:
@@ -3688,7 +3675,7 @@ static int rtw89_dbg_trigger_l0_error(struct rtw89_dev *rtwdev)
}
if (RTW89_CHK_FW_FEATURE(SIM_SER_L0L1_BY_HALT_H2C, &rtwdev->fw))
- return sim_l0_by_halt_h2c(rtwdev);
+ return rtw89_dbg_trigger_l0_error_by_halt_h2c(rtwdev);
rtw89_leave_ps_mode(rtwdev);
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index ff3914a16b81..c5a598a507f4 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -931,8 +931,8 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 84, 0, RFK_PRE_NOTIFY_MCC_V1),
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 84, 0, ADDR_CAM_V0),
__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 92, 0, TX_HISTORY_V1),
- __CFG_FW_FEAT(RTL8922A, ge, 0, 35, 97, 0, SIM_SER_L0L1_BY_HALT_H2C),
__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 100, 0, SER_POST_RECOVER_DMAC),
+ __CFG_FW_FEAT(RTL8922A, ge, 0, 35, 108, 0, SIM_SER_L0L1_BY_HALT_H2C),
};
static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
--
2.25.1
next prev parent reply other threads:[~2026-05-15 1:44 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-15 1:44 [PATCH rtw-next 00/13] wifi: rtw89: update SER, PCI, WoW and quota settings Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 01/13] wifi: rtw89: debug: Wi-Fi 7 show count of SER L0 simulation Ping-Ke Shih
2026-05-15 1:44 ` Ping-Ke Shih [this message]
2026-05-15 1:44 ` [PATCH rtw-next 03/13] wifi: rtw89: fw: dump status of H2C command and C2H event for SER Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 04/13] wifi: rtw89: pci: enable LTR based on pcie control register Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 05/13] wifi: rtw89: pci: not disable PCI completion timeout control for a variant of RTL8922DE Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 06/13] wifi: rtw89: pci: disable PCI PHY error flag 8 Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 07/13] wifi: rtw89: clear auto K delay value before downloading firmware Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 08/13] wifi: rtw89: wow: send ARP reply packets instead of Null packets to keep alive Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 09/13] wifi: rtw89: correct drop logic for malformed AMPDU frames Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 10/13] wifi: rtw89: 8922d: change naming number and update values for WDE/PLE quota Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 11/13] wifi: rtw89: mac: add field of release report size to DLE quota Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 12/13] wifi: rtw89: mac: consolidate quota into a struct for variant chips Ping-Ke Shih
2026-05-15 1:44 ` [PATCH rtw-next 13/13] wifi: rtw89: 8922d: add quota for RTL8922DE variant Ping-Ke Shih
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260515014433.16168-3-pkshih@realtek.com \
--to=pkshih@realtek.com \
--cc=dian_syuan0116@realtek.com \
--cc=kevin_yang@realtek.com \
--cc=linux-wireless@vger.kernel.org \
--cc=phhuang@realtek.com \
--cc=timlee@realtek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.