summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorYue Ma <yuem@codeaurora.org>2017-10-20 09:54:57 -0700
committerYue Ma <yuem@codeaurora.org>2017-10-20 10:33:54 -0700
commite938800669fc1c2835980d5b170ed91538c22613 (patch)
treebfa78a872eaec3fc92ccfa39be6fbde4b1d3e083 /drivers/net
parent20caa060844314aa4a2cd2e50c9e82eb12d57b34 (diff)
cnss2: Decouple WLAN host driver and PCI/MHI for suspend/resume
Decouple WLAN host driver suspend/resume and PCI link and MHI suspend/resume so that PCI link and MHI can be suspended/resumeed separately without WLAN host driver. Change-Id: I82cb7b8b54c61657c5d0bbaead0ffc1c55ecee8d Signed-off-by: Yue Ma <yuem@codeaurora.org>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/cnss2/pci.c87
1 files changed, 56 insertions, 31 deletions
diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c
index e4c35c4d664a..2efc3aa63a75 100644
--- a/drivers/net/wireless/cnss2/pci.c
+++ b/drivers/net/wireless/cnss2/pci.c
@@ -117,6 +117,7 @@ int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv)
if (!pci_priv)
return -ENODEV;
+ cnss_pr_dbg("Suspending PCI link\n");
if (!pci_priv->pci_link_state) {
cnss_pr_info("PCI link is already suspended!\n");
goto out;
@@ -150,6 +151,7 @@ int cnss_resume_pci_link(struct cnss_pci_data *pci_priv)
if (!pci_priv)
return -ENODEV;
+ cnss_pr_dbg("Resuming PCI link\n");
if (pci_priv->pci_link_state) {
cnss_pr_info("PCI link is already resumed!\n");
goto out;
@@ -368,27 +370,37 @@ static int cnss_pci_suspend(struct device *dev)
driver_ops = plat_priv->driver_ops;
if (driver_ops && driver_ops->suspend) {
ret = driver_ops->suspend(pci_dev, state);
- if (pci_priv->pci_link_state) {
- if (cnss_pci_set_mhi_state(pci_priv,
- CNSS_MHI_SUSPEND)) {
+ if (ret) {
+ cnss_pr_err("Failed to suspend host driver, err = %d\n",
+ ret);
+ ret = -EAGAIN;
+ goto out;
+ }
+ }
+
+ if (pci_priv->pci_link_state) {
+ ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_SUSPEND);
+ if (ret) {
+ if (driver_ops && driver_ops->resume)
driver_ops->resume(pci_dev);
- ret = -EAGAIN;
- goto out;
- }
-
- cnss_set_pci_config_space(pci_priv,
- SAVE_PCI_CONFIG_SPACE);
- pci_disable_device(pci_dev);
-
- ret = pci_set_power_state(pci_dev, PCI_D3hot);
- if (ret)
- cnss_pr_err("Failed to set D3Hot, err = %d\n",
- ret);
+ ret = -EAGAIN;
+ goto out;
}
+
+ cnss_set_pci_config_space(pci_priv,
+ SAVE_PCI_CONFIG_SPACE);
+ pci_disable_device(pci_dev);
+
+ ret = pci_set_power_state(pci_dev, PCI_D3hot);
+ if (ret)
+ cnss_pr_err("Failed to set D3Hot, err = %d\n",
+ ret);
}
cnss_pci_set_monitor_wake_intr(pci_priv, false);
+ return 0;
+
out:
return ret;
}
@@ -408,23 +420,30 @@ static int cnss_pci_resume(struct device *dev)
if (!plat_priv)
goto out;
- driver_ops = plat_priv->driver_ops;
- if (driver_ops && driver_ops->resume && !pci_priv->pci_link_down_ind) {
- ret = pci_enable_device(pci_dev);
- if (ret)
- cnss_pr_err("Failed to enable PCI device, err = %d\n",
- ret);
+ if (pci_priv->pci_link_down_ind)
+ goto out;
- if (pci_priv->saved_state)
- cnss_set_pci_config_space(pci_priv,
- RESTORE_PCI_CONFIG_SPACE);
+ ret = pci_enable_device(pci_dev);
+ if (ret)
+ cnss_pr_err("Failed to enable PCI device, err = %d\n", ret);
- pci_set_master(pci_dev);
- cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RESUME);
+ if (pci_priv->saved_state)
+ cnss_set_pci_config_space(pci_priv,
+ RESTORE_PCI_CONFIG_SPACE);
+
+ pci_set_master(pci_dev);
+ cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RESUME);
+ driver_ops = plat_priv->driver_ops;
+ if (driver_ops && driver_ops->resume) {
ret = driver_ops->resume(pci_dev);
+ if (ret)
+ cnss_pr_err("Failed to resume host driver, err = %d\n",
+ ret);
}
+ return 0;
+
out:
return ret;
}
@@ -600,14 +619,17 @@ int cnss_auto_suspend(void)
ret = pci_set_power_state(pci_dev, PCI_D3hot);
if (ret)
cnss_pr_err("Failed to set D3Hot, err = %d\n", ret);
+
+ cnss_pr_dbg("Suspending PCI link\n");
if (cnss_set_pci_link(pci_priv, PCI_LINK_DOWN)) {
- cnss_pr_err("Failed to shutdown PCI link!\n");
+ cnss_pr_err("Failed to suspend PCI link!\n");
ret = -EAGAIN;
goto resume_mhi;
}
+
+ pci_priv->pci_link_state = PCI_LINK_DOWN;
}
- pci_priv->pci_link_state = PCI_LINK_DOWN;
cnss_pci_set_auto_suspended(pci_priv, 1);
cnss_pci_set_monitor_wake_intr(pci_priv, true);
@@ -643,21 +665,24 @@ int cnss_auto_resume(void)
pci_dev = pci_priv->pci_dev;
if (!pci_priv->pci_link_state) {
+ cnss_pr_dbg("Resuming PCI link\n");
if (cnss_set_pci_link(pci_priv, PCI_LINK_UP)) {
cnss_pr_err("Failed to resume PCI link!\n");
ret = -EAGAIN;
goto out;
}
pci_priv->pci_link_state = PCI_LINK_UP;
+
ret = pci_enable_device(pci_dev);
if (ret)
cnss_pr_err("Failed to enable PCI device, err = %d\n",
ret);
+
+ cnss_set_pci_config_space(pci_priv, RESTORE_PCI_CONFIG_SPACE);
+ pci_set_master(pci_dev);
+ cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RESUME);
}
- cnss_set_pci_config_space(pci_priv, RESTORE_PCI_CONFIG_SPACE);
- pci_set_master(pci_dev);
- cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RESUME);
cnss_pci_set_auto_suspended(pci_priv, 0);
bus_bw_info = &plat_priv->bus_bw_info;