OSDN Git Service

cnss2: Fix PCIe D3hot for WLAN suspend
authorjiad <jiad@codeaurora.org>
Thu, 7 Jun 2018 03:34:00 +0000 (11:34 +0800)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 7 Jun 2018 06:46:53 +0000 (23:46 -0700)
Setting D3hot is newly added for Napier platform. And system hang is
observed on legacy Rome platform. In previous implementations for Rome
PCIe platforms, setting D3hot is not needed.

Fix is to not set D3hot for legacy platforms.

Change-Id: I1fce39eff4aa674553a214e7d0f99a81b0e6b93d
CRs-Fixed: 2255872
Signed-off-by: Jia Ding <jiad@codeaurora.org>
drivers/net/wireless/cnss2/pci.c

index 5746366..2356caa 100644 (file)
@@ -133,7 +133,8 @@ int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv)
        pci_disable_device(pci_priv->pci_dev);
 
        if (pci_priv->pci_dev->device != QCA6174_DEVICE_ID) {
-               if (pci_set_power_state(pci_priv->pci_dev, PCI_D3hot))
+               ret = pci_set_power_state(pci_priv->pci_dev, PCI_D3hot);
+               if (ret)
                        cnss_pr_err("Failed to set D3Hot, err =  %d\n", ret);
        }
 
@@ -404,10 +405,12 @@ static int cnss_pci_suspend(struct device *dev)
                                          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);
+               if (pci_dev->device != QCA6174_DEVICE_ID) {
+                       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);
@@ -643,9 +646,12 @@ int cnss_auto_suspend(struct device *dev)
                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);
+               if (pci_dev->device != QCA6174_DEVICE_ID) {
+                       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)) {