Commit acd19580 authored by Vasanthakumar Thiagarajan's avatar Vasanthakumar Thiagarajan Committed by Kalle Valo

ath10k: delay device access after cold reset

It is observed that during cold reset pcie access right
after a write operation to SOC_GLOBAL_RESET_ADDRESS causes
Data Bus Error and system hard lockup. The reason
for bus error is that pcie needs some time to get
back to stable state for any transaction during cold reset. Add
delay of 20 msecs after write of SOC_GLOBAL_RESET_ADDRESS
to fix this issue. This patch is tested on QCA988X. This is
also tested on QCA99X0 which is WIP.
Signed-off-by: default avatarVasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent c538bb3b
...@@ -2761,7 +2761,6 @@ static int ath10k_pci_wait_for_target_init(struct ath10k *ar) ...@@ -2761,7 +2761,6 @@ static int ath10k_pci_wait_for_target_init(struct ath10k *ar)
static int ath10k_pci_cold_reset(struct ath10k *ar) static int ath10k_pci_cold_reset(struct ath10k *ar)
{ {
int i;
u32 val; u32 val;
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset\n"); ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset\n");
...@@ -2777,23 +2776,18 @@ static int ath10k_pci_cold_reset(struct ath10k *ar) ...@@ -2777,23 +2776,18 @@ static int ath10k_pci_cold_reset(struct ath10k *ar)
val |= 1; val |= 1;
ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val); ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val);
for (i = 0; i < ATH_PCI_RESET_WAIT_MAX; i++) { /* After writing into SOC_GLOBAL_RESET to put device into
if (ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS) & * reset and pulling out of reset pcie may not be stable
RTC_STATE_COLD_RESET_MASK) * for any immediate pcie register access and cause bus error,
break; * add delay before any pcie access request to fix this issue.
msleep(1); */
} msleep(20);
/* Pull Target, including PCIe, out of RESET. */ /* Pull Target, including PCIe, out of RESET. */
val &= ~1; val &= ~1;
ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val); ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val);
for (i = 0; i < ATH_PCI_RESET_WAIT_MAX; i++) { msleep(20);
if (!(ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS) &
RTC_STATE_COLD_RESET_MASK))
break;
msleep(1);
}
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset complete\n"); ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset complete\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment