[PATCH] wifi: rtw89: retry efuse physical map dump on transient failure
From: Christian Hewitt
Date: Sat Feb 28 2026 - 23:24:33 EST
On Radxa Rock 5B with a RTL8852BE combo WiFi/BT card, the efuse
physical map dump intermittently fails with -EBUSY during probe.
The failure occurs in rtw89_dump_physical_efuse_map_ddv() where
read_poll_timeout_atomic() times out waiting for the B_AX_EF_RDY
bit after 1 second.
The root cause is a timing race during boot: the WiFi driver's
chip initialization (firmware download via PCIe) overlaps with the
Bluetooth firmware download to the same combo chip over USB. This
can leave the efuse controller temporarily unavailable when the
WiFi driver attempts to read the efuse map.
Add a retry loop (up to 3 attempts with 500ms delays) around the
physical efuse map dump in rtw89_parse_efuse_map_ax(). The firmware
download path already retries up to 5 times, but the efuse read
that follows has no retry logic, making it the weak link in the
probe sequence.
Signed-off-by: Christian Hewitt <christianshewitt@xxxxxxxxx>
---
The LibreELEC distro is minimalist and fast-booting with some
history of exposing racy probing and timing issues that don't
show up on the mainstream distros. Below are some before/after
dmesg prints to support the patch:
Before:
ROCK5B:~ # dmesg | grep rtw89
[ 6.575383] rtw89_8852be 0002:21:00.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ 6.575538] rtw89_8852be 0002:21:00.0: enabling device (0000 -> 0003)
[ 6.585763] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 5
[ 6.585779] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 3
[ 10.174946] rtw89_8852be 0002:21:00.0: failed to dump efuse physical map
[ 10.176584] rtw89_8852be 0002:21:00.0: failed to setup chip information
[ 10.178173] rtw89_8852be 0002:21:00.0: probe with driver rtw89_8852be failed with error -16
After:
ROCK5B:~ # dmesg | grep rtw89
[ 7.393558] rtw89_8852be 0002:21:00.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ 7.393729] rtw89_8852be 0002:21:00.0: enabling device (0000 -> 0003)
[ 7.406341] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 5
[ 7.406363] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 3
[ 11.041563] rtw89_8852be 0002:21:00.0: efuse dump failed, retrying (1)
[ 11.798390] rtw89_8852be 0002:21:00.0: chip info CID: 0, CV: 1, AID: 0, ACV: 1, RFE: 1
[ 11.801013] rtw89_8852be 0002:21:00.0: rfkill hardware state changed to enable
For context, firmware also fails (and recovers) sometimes:
ROCK5B:~ # dmesg | grep rtw89
[ 6.436873] rtw89_8852be 0002:21:00.0: loaded firmware rtw89/rtw8852b_fw-1.bin
[ 6.437165] rtw89_8852be 0002:21:00.0: enabling device (0000 -> 0003)
[ 6.450228] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 5
[ 6.450239] rtw89_8852be 0002:21:00.0: Firmware version 0.29.29.15 (6fb3ec41), cmd version 0, type 3
[ 7.864148] rtw89_8852be 0002:21:00.0: fw security fail
[ 7.864154] rtw89_8852be 0002:21:00.0: download firmware fail
[ 7.864160] rtw89_8852be 0002:21:00.0: [ERR]fwdl 0x1E0 = 0x62
[ 7.864165] rtw89_8852be 0002:21:00.0: [ERR]fwdl 0x83F0 = 0x80011
[ 7.864173] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864188] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864203] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864219] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864234] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864250] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864265] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864281] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864296] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864311] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864327] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864342] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931150
[ 7.864358] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864373] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 7.864387] rtw89_8852be 0002:21:00.0: [ERR]fw PC = 0xb8931154
[ 8.181342] rtw89_8852be 0002:21:00.0: chip info CID: 0, CV: 1, AID: 0, ACV: 1, RFE: 1
[ 8.184322] rtw89_8852be 0002:21:00.0: rfkill hardware state changed to enable
drivers/net/wireless/realtek/rtw89/efuse.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/efuse.c b/drivers/net/wireless/realtek/rtw89/efuse.c
index a2757a88d55d..d506f04ffd6c 100644
--- a/drivers/net/wireless/realtek/rtw89/efuse.c
+++ b/drivers/net/wireless/realtek/rtw89/efuse.c
@@ -270,6 +270,7 @@ int rtw89_parse_efuse_map_ax(struct rtw89_dev *rtwdev)
u8 *log_map = NULL;
u8 *dav_phy_map = NULL;
u8 *dav_log_map = NULL;
+ int retry;
int ret;
if (rtw89_read16(rtwdev, R_AX_SYS_WL_EFUSE_CTRL) & B_AX_AUTOLOAD_SUS)
@@ -289,7 +290,17 @@ int rtw89_parse_efuse_map_ax(struct rtw89_dev *rtwdev)
goto out_free;
}
- ret = rtw89_dump_physical_efuse_map(rtwdev, phy_map, 0, phy_size, false);
+ for (retry = 0; retry < 3; retry++) {
+ if (retry) {
+ rtw89_warn(rtwdev, "efuse dump failed, retrying (%d)\n",
+ retry);
+ fsleep(500000);
+ }
+ ret = rtw89_dump_physical_efuse_map(rtwdev, phy_map, 0,
+ phy_size, false);
+ if (!ret)
+ break;
+ }
if (ret) {
rtw89_warn(rtwdev, "failed to dump efuse physical map\n");
goto out_free;
--
2.43.0