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 --- 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