From dc06247a6671880c8cb1404b70ba5dc654ce494e Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Tue, 31 Mar 2020 15:20:56 -0700 Subject: [PATCH] cnss2: Check driver link state before prevent/allow PCIe L1 Avoid calling prevent/allow PCIe L1 APIs if driver has already known link is not accessible. Change-Id: Ia12c6b932fb7d99916ca2b76323bd2c01bdb655d Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 5a5ffce8d1c3..dfb9d9d34249 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -828,6 +828,22 @@ out: int cnss_pci_prevent_l1(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); + + if (!pci_priv) { + cnss_pr_err("pci_priv is NULL\n"); + return -ENODEV; + } + + if (pci_priv->pci_link_state == PCI_LINK_DOWN) { + cnss_pr_dbg("PCIe link is suspended\n"); + return -EIO; + } + + if (pci_priv->pci_link_down_ind) { + cnss_pr_err("PCIe link is down\n"); + return -EIO; + } return msm_pcie_prevent_l1(pci_dev); } @@ -836,6 +852,22 @@ EXPORT_SYMBOL(cnss_pci_prevent_l1); void cnss_pci_allow_l1(struct device *dev) { struct pci_dev *pci_dev = to_pci_dev(dev); + struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); + + if (!pci_priv) { + cnss_pr_err("pci_priv is NULL\n"); + return; + } + + if (pci_priv->pci_link_state == PCI_LINK_DOWN) { + cnss_pr_dbg("PCIe link is suspended\n"); + return; + } + + if (pci_priv->pci_link_down_ind) { + cnss_pr_err("PCIe link is down\n"); + return; + } msm_pcie_allow_l1(pci_dev); }