]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath11k: Flush the posted write after writing to PCIE_SOC_GLOBAL_RESET
authorManivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Tue, 23 Jun 2026 14:16:48 +0000 (16:16 +0200)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 9 Jul 2026 14:44:42 +0000 (07:44 -0700)
ath11k_pci_soc_global_reset() tries to reset the device by writing to the
PCIE_SOC_GLOBAL_RESET register. But it doesn't do a read-back to ensure
that the write gets flushed to the device before the delay.

This may lead to the delay on the host to be insufficient, if the posted
write doesn't reach the device before the delay.

So add a read-back after writing to the PCIE_SOC_GLOBAL_RESET register and
before the delay.

Compile tested only.

Fixes: f3c603d412b3 ("ath11k: reset MHI during power down and power up")
Reported-by: Alex Williamson <alex@shazbot.org>
Closes: https://lore.kernel.org/linux-pci/20260622160822.09350246@shazbot.org
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: Raj Kumar Bhagat <raj.bhagat@oss.qualcomm.com>
Link: https://patch.msgid.link/20260623141649.41087-1-manivannan.sadhasivam@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath11k/pci.c

index 35bb9e7a63a20759a4d5f78b9e3e1a9d17f1889f..a163168f3617640ffb847593a71db769d7e00288 100644 (file)
@@ -199,6 +199,8 @@ static void ath11k_pci_soc_global_reset(struct ath11k_base *ab)
        val |= PCIE_SOC_GLOBAL_RESET_V;
 
        ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
+       /* Flush the posted write to the device */
+       ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
 
        /* TODO: exact time to sleep is uncertain */
        delay = 10;
@@ -208,6 +210,8 @@ static void ath11k_pci_soc_global_reset(struct ath11k_base *ab)
        val &= ~PCIE_SOC_GLOBAL_RESET_V;
 
        ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
+       /* Flush the posted write to the device */
+       ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
 
        mdelay(delay);