Skip to content

Commit

Permalink
ath10k: fix pm resume after suspend
Browse files Browse the repository at this point in the history
Firmware was crashing when we were trying to warm reset it
after suspend. This was due to the fact that target registeres
can be accessed only if the hardware is awaken.

This patch makes sure to awake the device also on the hif up,
not only in case of probe call.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
  • Loading branch information
Bartosz Markowski authored and Kalle Valo committed Nov 3, 2014
1 parent aa292fa commit 707b1bb
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions drivers/net/wireless/ath/ath10k/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1875,6 +1875,12 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)

ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif power up\n");

ret = ath10k_pci_wake(ar);
if (ret) {
ath10k_err(ar, "failed to wake up target: %d\n", ret);
return ret;
}

/*
* Bring the target up cleanly.
*
Expand All @@ -1888,13 +1894,13 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
ret = ath10k_pci_chip_reset(ar);
if (ret) {
ath10k_err(ar, "failed to reset chip: %d\n", ret);
goto err;
goto err_sleep;
}

ret = ath10k_pci_init_pipes(ar);
if (ret) {
ath10k_err(ar, "failed to initialize CE: %d\n", ret);
goto err;
goto err_sleep;
}

ret = ath10k_pci_init_config(ar);
Expand All @@ -1914,7 +1920,8 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
err_ce:
ath10k_pci_ce_deinit(ar);

err:
err_sleep:
ath10k_pci_sleep(ar);
return ret;
}

Expand All @@ -1925,6 +1932,8 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar)
/* Currently hif_power_up performs effectively a reset and hif_stop
* resets the chip as well so there's no point in resetting here.
*/

ath10k_pci_sleep(ar);
}

#ifdef CONFIG_PM
Expand Down Expand Up @@ -2526,6 +2535,8 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
goto err_deinit_irq;
}

ath10k_pci_sleep(ar);

ret = ath10k_core_register(ar, chip_id);
if (ret) {
ath10k_err(ar, "failed to register driver core: %d\n", ret);
Expand Down Expand Up @@ -2577,7 +2588,6 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
ath10k_pci_deinit_irq(ar);
ath10k_pci_ce_deinit(ar);
ath10k_pci_free_pipes(ar);
ath10k_pci_sleep(ar);
ath10k_pci_release(ar);
ath10k_core_destroy(ar);
}
Expand Down

0 comments on commit 707b1bb

Please sign in to comment.