Re: [PATCH] wifi: ath11k: run ahb shutdown() teardown only on WCN6750
Jeff Johnson <[email protected]>
| Newsgroups | org.kernel.vger.linux-wireless,org.infradead.lists.ath11k,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On 8/7/2026 8:34 AM, Jeff Johnson wrote:
> 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
+ Mani's current e-mail address @oss.qualcomm.com