cnss: Recover PCIe configuration space during normal WLAN recovery

During normal SSR there is a corner case that somehow WLAN driver fails to
read PCIe configuration space which can result corruption when it tries to
save it. Hence recover PCIe configuration space from shadow registers as
well in normal SSR. This is same as the recovery for real PCIe link down.

Change-Id: I2bae0f2e322829a9689d3a129145b54c079dccdf
CRs-fixed: 886245
Signed-off-by: Yue Ma <yuem@codeaurora.org>
This commit is contained in:
Yue Ma 2015-12-10 19:08:18 -08:00 committed by David Keitel
parent f6c9eb5139
commit b7df8c422e

View file

@ -2281,17 +2281,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop)
if (wdrv && wdrv->shutdown) if (wdrv && wdrv->shutdown)
wdrv->shutdown(pdev); wdrv->shutdown(pdev);
if (penv->pcie_link_state && !penv->pcie_link_down_ind) { if (penv->pcie_link_state) {
pci_save_state(pdev);
penv->saved_state = pci_store_saved_state(pdev);
if (msm_pcie_pm_control(MSM_PCIE_SUSPEND,
cnss_get_pci_dev_bus_number(pdev),
pdev, NULL, PM_OPTIONS)) {
pr_debug("cnss: Failed to shutdown PCIe link!\n");
ret = -EFAULT;
}
penv->pcie_link_state = PCIE_LINK_DOWN;
} else if (penv->pcie_link_state && penv->pcie_link_down_ind) {
if (msm_pcie_pm_control(MSM_PCIE_SUSPEND, if (msm_pcie_pm_control(MSM_PCIE_SUSPEND,
cnss_get_pci_dev_bus_number(pdev), cnss_get_pci_dev_bus_number(pdev),
pdev, NULL, PM_OPTIONS_SUSPEND_LINK_DOWN)) { pdev, NULL, PM_OPTIONS_SUSPEND_LINK_DOWN)) {
@ -2345,18 +2335,7 @@ static int cnss_powerup(const struct subsys_desc *subsys)
goto err_pcie_link_up; goto err_pcie_link_up;
} }
if (!penv->pcie_link_state && !penv->pcie_link_down_ind) { if (!penv->pcie_link_state) {
ret = msm_pcie_pm_control(MSM_PCIE_RESUME,
cnss_get_pci_dev_bus_number(pdev),
pdev, NULL, PM_OPTIONS);
if (ret) {
pr_err("cnss: Failed to bring-up PCIe link!\n");
goto err_pcie_link_up;
}
penv->pcie_link_state = PCIE_LINK_UP;
} else if (!penv->pcie_link_state && penv->pcie_link_down_ind) {
ret = msm_pcie_pm_control(MSM_PCIE_RESUME, ret = msm_pcie_pm_control(MSM_PCIE_RESUME,
cnss_get_pci_dev_bus_number(pdev), cnss_get_pci_dev_bus_number(pdev),
pdev, NULL, PM_OPTIONS_RESUME_LINK_DOWN); pdev, NULL, PM_OPTIONS_RESUME_LINK_DOWN);