OSDN Git Service

ath11k: Fix inaccessible debug registers
authorBaochen Qiang <bqiang@codeaurora.org>
Tue, 28 Sep 2021 11:00:44 +0000 (14:00 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 28 Sep 2021 13:33:41 +0000 (16:33 +0300)
Current code clears debug registers after SOC global reset performed
in ath11k_pci_sw_reset. However at that time those registers are
not accessible due to reset, thus they are actually not cleared at all.
For WCN6855, it may cause target fail to initialize. This issue can be
fixed by moving clear action ahead.

In addition, on some specific platforms, need to add delay to wait
those registers to become accessible.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1

Signed-off-by: Baochen Qiang <bqiang@codeaurora.org>
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210913180246.193388-3-jouni@codeaurora.org
drivers/net/wireless/ath/ath11k/pci.c

index 5abb38c..7b3bce0 100644 (file)
@@ -430,6 +430,8 @@ static void ath11k_pci_force_wake(struct ath11k_base *ab)
 
 static void ath11k_pci_sw_reset(struct ath11k_base *ab, bool power_on)
 {
+       mdelay(100);
+
        if (power_on) {
                ath11k_pci_enable_ltssm(ab);
                ath11k_pci_clear_all_intrs(ab);
@@ -439,9 +441,9 @@ static void ath11k_pci_sw_reset(struct ath11k_base *ab, bool power_on)
        }
 
        ath11k_mhi_clear_vector(ab);
+       ath11k_pci_clear_dbg_registers(ab);
        ath11k_pci_soc_global_reset(ab);
        ath11k_mhi_set_mhictrl_reset(ab);
-       ath11k_pci_clear_dbg_registers(ab);
 }
 
 int ath11k_pci_get_msi_irq(struct device *dev, unsigned int vector)