From: Christopher Griffin ath11k_fw_pre_init() asks for firmware-2.bin through ath11k_core_firmware_request(), that is firmware_request_nowarn(), and falls back to API 1 when the file is not there. The file is optional, and many installations have none: on an Arista C-360 the QCN9074 runs from amss.bin alone. With CONFIG_FW_LOADER_USER_HELPER_FALLBACK, which OpenWrt sets, firmware_request_nowarn() still hands a missing file to the user-space loader, so every probe of such a device waits on a uevent and its answer, and the loader logs the miss; when the device goes away before the answer, as when it is unbound right after probing, the loader then fails to write its answer: procd: Failed to write to .../firmware/ath11k!QCN9074!hw1.0!firmware-2.bin/loading: Bad file descriptor Request it with request_firmware_direct() instead, which looks on the filesystem only, as ath11k already does for the optional calibration file in ath11k_qmi_load_bdf_qmi(). Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.r4-00683-QCAHKSWPL_SILICONZ-1 Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Christopher Griffin --- Seen on an Arista C-360 with OpenWrt: its QCN9074 has no firmware-2.bin, and its scan radio is unbound right after probing. --- drivers/net/wireless/ath/ath11k/fw.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/fw.c b/drivers/net/wireless/ath/ath11k/fw.c index ef1b4c81843a3..3628e33e57f6e 100644 --- a/drivers/net/wireless/ath/ath11k/fw.c +++ b/drivers/net/wireless/ath/ath11k/fw.c @@ -16,10 +16,14 @@ static int ath11k_fw_request_firmware_api_n(struct ath11k_base *ab, struct ath11k_fw_ie *hdr; const u8 *data; __le32 *timestamp; - - ab->fw.fw = ath11k_core_firmware_request(ab, name); - if (IS_ERR(ab->fw.fw)) { - ret = PTR_ERR(ab->fw.fw); + char path[100]; + + /* The file is optional: look for it on the filesystem only, so a + * missing one does not go through the user-space fallback loader. + */ + ath11k_core_create_firmware_path(ab, name, path, sizeof(path)); + ret = request_firmware_direct(&ab->fw.fw, path, ab->dev); + if (ret) { ath11k_dbg(ab, ATH11K_DBG_BOOT, "failed to load %s: %d\n", name, ret); ab->fw.fw = NULL; return ret; --- base-commit: a3ddbb45768717b5c9f923489387cf55c838d1ad change-id: 20261101-b123-fw-api-n-direct-7390bf5fecb3 Best regards, -- Christopher Griffin