From a2151251061010d4e338cf2b0ecd38bb989b7dbf Mon Sep 17 00:00:00 2001
From: Yue Ma <yuem@codeaurora.org>
Date: Tue, 22 Jul 2014 11:01:09 -0700
Subject: [PATCH] cnss: Save/restore target PCIe config space during
 suspend/resume

In some cases PCIe framework fails to restore the target PCIe config
space during suspend/resume, so add the support that CNSS platform
driver can save/restore it.

Change-Id: I5522eaba98421df6734b596f62174e159450c367
CRs-fixed: 697607
Signed-off-by: Yue Ma <yuem@codeaurora.org>
---
 drivers/net/wireless/cnss/cnss.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/cnss/cnss.c b/drivers/net/wireless/cnss/cnss.c
index 031b151e69ab..3529029295e5 100644
--- a/drivers/net/wireless/cnss/cnss.c
+++ b/drivers/net/wireless/cnss/cnss.c
@@ -677,9 +677,15 @@ static int cnss_wlan_pci_suspend(struct pci_dev *pdev, pm_message_t state)
 	if (!wdriver)
 		goto out;
 
-	if (wdriver->suspend)
+	if (wdriver->suspend) {
 		ret = wdriver->suspend(pdev, state);
 
+		if (penv->pcie_link_state) {
+			pci_save_state(pdev);
+			penv->saved_state = pci_store_saved_state(pdev);
+		}
+	}
+
 out:
 	return ret;
 }
@@ -696,8 +702,14 @@ static int cnss_wlan_pci_resume(struct pci_dev *pdev)
 	if (!wdriver)
 		goto out;
 
-	if (wdriver->resume && !penv->pcie_link_down_ind)
+	if (wdriver->resume && !penv->pcie_link_down_ind) {
+		if (penv->saved_state)
+			pci_load_and_free_saved_state(pdev,
+				&penv->saved_state);
+		pci_restore_state(pdev);
+
 		ret = wdriver->resume(pdev);
+	}
 
 out:
 	return ret;
-- 
GitLab