On 10/16/2025 1:11 PM, Andreas Tobler wrote:
Hello Baochen,
thanks for responding.
On 16.10.2025 04:01, Baochen Qiang wrote:
On 10/16/2025 4:10 AM, Andreas Tobler wrote:
Dear all,
this commit (Upstream commit 51a73f1b2e56b0324b4a3bb8cebc4221b5be4c7) makes our WLE600 Compex wifi cards (qca988x based) unusable. Reverting the commit brings the wifi card back.
This was discovered on the v6.12.53 from today.
ath10k messages excerpt:
Oct 15 22:00:13 klog: ath10k_pci 0000:05:00.0: pci irq msi oper_irq_mode 2 irq_mode 0 reset_mode 0 Oct 15 22:00:13 klog: ath10k_pci 0000:05:00.0: qca988x hw2.0 target 0x4100016c chip_id 0x043222ff sub 0000:0000 Oct 15 22:00:13 klog: ath10k_pci 0000:05:00.0: kconfig debug 0 debugfs 0 tracing 0 dfs 1 testmode 0 Oct 15 22:00:13 klog: ath10k_pci 0000:05:00.0: firmware ver 10.2.4-1.0-00047 api 5 features no-p2p,raw-mode,mfp,allows-mesh-bcast crc32 35bd9258 Oct 15 22:00:13 klog: ath10k_pci 0000:05:00.0: board_file api 1 bmi_id N/A crc32 bebc7c08 Oct 15 22:00:20 klog: ath10k_pci 0000:05:00.0: wmi unified ready event not received Oct 15 22:00:21 klog: ath10k_pci 0000:05:00.0: could not init core (-110) Oct 15 22:00:21 klog: ath10k_pci 0000:05:00.0: could not probe fw (-110)
Beside reverting, how can we help fixing this?
Thank you Andreas for the report.
If this 100% repro?
Yes, on several boards, amd, armada-385 and imx6 based.
Can you try just ignore the err and see what we get? I am suspecting we are missing the interrupt for unified ready message.
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/ core.c index 6f78f1752cd6..cf4cc44d0a1e 100644 --- a/drivers/net/wireless/ath/ath10k/core.c +++ b/drivers/net/wireless/ath/ath10k/core.c @@ -3217,7 +3217,6 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode, status = ath10k_wmi_wait_for_unified_ready(ar); if (status) { ath10k_err(ar, "wmi unified ready event not received\n"); - goto err_hif_stop; }
status = ath10k_core_compat_services(ar);
No changes.
Anyway, please help collect verbose ath10k log, you may enable verbose log by
modprobe ath10k_core debug_mask=0xffffffff modprobe ath10k_pci
I attached the compressed log, not sure if it is too big while uncompressed.
Thank you Andreas for the log.
Could you please try if below diff can fix this regression?
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c index 7bbda46cfd93..1a981d333b5c 100644 --- a/drivers/net/wireless/ath/ath10k/ce.c +++ b/drivers/net/wireless/ath/ath10k/ce.c @@ -1256,6 +1256,19 @@ void ath10k_ce_per_engine_service(struct ath10k *ar, unsigned int ce_id) } EXPORT_SYMBOL(ath10k_ce_per_engine_service);
+void ath10k_ce_per_engine_check(struct ath10k *ar, unsigned int ce_id) +{ + struct ath10k_ce *ce = ath10k_ce_priv(ar); + struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; + + if (ce_state->recv_cb) + ce_state->recv_cb(ce_state); + + if (ce_state->send_cb) + ce_state->send_cb(ce_state); +} +EXPORT_SYMBOL(ath10k_ce_per_engine_check); + /* * Handler for per-engine interrupts on ALL active CEs. * This is used in cases where the system is sharing a diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h index 27367bd64e95..9923530e51eb 100644 --- a/drivers/net/wireless/ath/ath10k/ce.h +++ b/drivers/net/wireless/ath/ath10k/ce.h @@ -255,6 +255,7 @@ int ath10k_ce_cancel_send_next(struct ath10k_ce_pipe *ce_state, /*==================CE Interrupt Handlers====================*/ void ath10k_ce_per_engine_service_any(struct ath10k *ar); void ath10k_ce_per_engine_service(struct ath10k *ar, unsigned int ce_id); +void ath10k_ce_per_engine_check(struct ath10k *ar, unsigned int ce_id); void ath10k_ce_disable_interrupt(struct ath10k *ar, int ce_id); void ath10k_ce_disable_interrupts(struct ath10k *ar); void ath10k_ce_enable_interrupt(struct ath10k *ar, int ce_id); diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c index 97b49bf4ad80..ce8e0c2fb975 100644 --- a/drivers/net/wireless/ath/ath10k/pci.c +++ b/drivers/net/wireless/ath/ath10k/pci.c @@ -1812,7 +1812,7 @@ void ath10k_pci_hif_send_complete_check(struct ath10k *ar, u8 pipe, if (resources > (ar_pci->attr[pipe].src_nentries >> 1)) return; } - ath10k_ce_per_engine_service(ar, pipe); + ath10k_ce_per_engine_check(ar, pipe); }
static void ath10k_pci_rx_retry_sync(struct ath10k *ar)
Thank you!
Andreas