Re: [PATCH] wifi: ath11k: run ahb shutdown() teardown only on WCN6750
Jeff Johnson <[email protected]>
| Newsgroups | org.infradead.lists.ath11k,org.kernel.vger.linux-wireless,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On 8/7/2026 2:48 AM, André Valentin wrote:
> The AHB shutdown() callback was introduced solely for WCN6750, which has
> to stop DMA before the SMMU is torn down at system reboot/shutdown. It
> was registered unconditionally in the shared ath11k_ahb_driver, so it also
> runs on the IPQ AHB targets (IPQ8074/IPQ6018/IPQ5018), which never had a
> shutdown() handler before and have no such SMMU requirement.
>
> On IPQ6018 the shutdown teardown stops the WCSS Q6 remote processor
> firmware. Stopping the Q6 firmware leaves shared WCSS state such that the
> boot ROM (SBL1) hangs during DDR training on the following warm reset;
> only a cold (power-on) reset recovers. A plain reboot therefore never
> comes back and needs a physical power cycle.
>
> This was pinned by bisecting the teardown at reboot: skipping
> ath11k_qmi_firmware_stop() (i.e. not stopping the Q6) is what lets the
> warm reset train DDR and boot normally, whereas none of the q6v5 power,
> reset or clock steps reproduce it on their own.
>
> Restrict the shutdown() teardown to WCN6750, restoring the pre-regression
> behaviour for the IPQ AHB targets. On reboot/shutdown the whole SoC is
> reset by the boot chain, which re-initializes the WCSS from scratch, so no
> teardown is needed there. Module removal (rmmod / remove()) is unchanged.
>
> Verified on a MikroTik Chateau 5G R17 ax (IPQ6018): before, a plain reboot
> froze in SBL1 at "sbl1_ddr_set_params"; after, SBL1 reaches "SBL1, End",
> trains DDR and boots the kernel across repeated reboots.
>
> Fixes: ac41c2b642b1 ("wifi: ath11k: Register shutdown handler for WCN6750")
> Cc: [email protected]
> Cc: Manikanta Pubbisetty <[email protected]>
> Signed-off-by: André Valentin <[email protected]>
> ---
> drivers/net/wireless/ath/ath11k/ahb.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c
> index 1e1dea4..749d8bf 100644
> --- a/drivers/net/wireless/ath/ath11k/ahb.c
> +++ b/drivers/net/wireless/ath/ath11k/ahb.c
> @@ -1288,6 +1288,18 @@ static void ath11k_ahb_shutdown(struct platform_device *pdev)
> * remove() is invoked during rmmod & shutdown() during
> * system reboot/shutdown.
> */
> +
> + /* The shutdown() callback was added for WCN6750, which has to stop DMA
> + * before the SMMU is torn down. The other AHB targets (IPQ8074/IPQ6018/
> + * IPQ5018) have no such requirement, and running the teardown here stops
> + * the WCSS Q6 firmware, which leaves shared state that hangs the boot ROM
> + * (SBL1) during DDR training on the following warm reset -- only a cold
> + * (power-on) reset recovers. Skip it on those targets; the SoC reset
> + * re-initializes the WCSS from scratch.
> + */
> + if (ab->hw_rev != ATH11K_HW_WCN6750_HW10)
> + return;
this is not the correct approach per the driver architecture.
all hardware-specific operations should be driven via the hw_params structure.
/jeff