ath10k: improve warm reset reliability
Warm reset is now able to recover after device crashes which required a cold reset before. This should greatly reduce chances of getting data bus errors or host system freezes due to buggy cold reset on some chips. kvalo: use ath10k_pci_soc_*() Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
d0e0a5524c
commit
de01357b36
@ -1802,6 +1802,26 @@ static void ath10k_pci_fw_interrupt_handler(struct ath10k *ar)
|
|||||||
ath10k_pci_sleep(ar);
|
ath10k_pci_sleep(ar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this function effectively clears target memory controller assert line */
|
||||||
|
static void ath10k_pci_warm_reset_si0(struct ath10k *ar)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = ath10k_pci_soc_read32(ar, SOC_RESET_CONTROL_ADDRESS);
|
||||||
|
ath10k_pci_soc_write32(ar, SOC_RESET_CONTROL_ADDRESS,
|
||||||
|
val | SOC_RESET_CONTROL_SI0_RST_MASK);
|
||||||
|
val = ath10k_pci_soc_read32(ar, SOC_RESET_CONTROL_ADDRESS);
|
||||||
|
|
||||||
|
msleep(10);
|
||||||
|
|
||||||
|
val = ath10k_pci_soc_read32(ar, SOC_RESET_CONTROL_ADDRESS);
|
||||||
|
ath10k_pci_soc_write32(ar, SOC_RESET_CONTROL_ADDRESS,
|
||||||
|
val & ~SOC_RESET_CONTROL_SI0_RST_MASK);
|
||||||
|
val = ath10k_pci_soc_read32(ar, SOC_RESET_CONTROL_ADDRESS);
|
||||||
|
|
||||||
|
msleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
static int ath10k_pci_warm_reset(struct ath10k *ar)
|
static int ath10k_pci_warm_reset(struct ath10k *ar)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -1860,6 +1880,8 @@ static int ath10k_pci_warm_reset(struct ath10k *ar)
|
|||||||
SOC_RESET_CONTROL_ADDRESS);
|
SOC_RESET_CONTROL_ADDRESS);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
|
|
||||||
|
ath10k_pci_warm_reset_si0(ar);
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
val = ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
val = ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
||||||
PCIE_INTR_CAUSE_ADDRESS);
|
PCIE_INTR_CAUSE_ADDRESS);
|
||||||
|
Loading…
Reference in New Issue
Block a user