From 9d783b8514aa5a004198e50eec161928d8640910 Mon Sep 17 00:00:00 2001 From: Jayachandran Sreekumaran Date: Mon, 13 Feb 2023 14:53:08 +0530 Subject: [PATCH] cnss2: Ensure driver registration before suspend Ensure wlan driver registration before invoking suspend callback. Change-Id: I2c8e40770209ae37364bdfea71045522d43465a8 CRs-Fixed: 3378544 --- cnss2/pci.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/cnss2/pci.c b/cnss2/pci.c index e2e34a1969..fe98d720b4 100644 --- a/cnss2/pci.c +++ b/cnss2/pci.c @@ -3620,10 +3620,12 @@ static int cnss_pci_suspend_driver(struct cnss_pci_data *pci_priv) struct pci_dev *pci_dev = pci_priv->pci_dev; struct cnss_wlan_driver *driver_ops = pci_priv->driver_ops; int ret = 0; + struct cnss_plat_data *plat_priv = pci_priv->plat_priv; pm_message_t state = { .event = PM_EVENT_SUSPEND }; - if (driver_ops && driver_ops->suspend) { + if (test_bit(CNSS_DRIVER_REGISTERED, &plat_priv->driver_state) && + driver_ops && driver_ops->suspend) { ret = driver_ops->suspend(pci_dev, state); if (ret) { cnss_pr_err("Failed to suspend host driver, err = %d\n", @@ -3640,8 +3642,10 @@ static int cnss_pci_resume_driver(struct cnss_pci_data *pci_priv) struct pci_dev *pci_dev = pci_priv->pci_dev; struct cnss_wlan_driver *driver_ops = pci_priv->driver_ops; int ret = 0; + struct cnss_plat_data *plat_priv = pci_priv->plat_priv; - if (driver_ops && driver_ops->resume) { + if (test_bit(CNSS_DRIVER_REGISTERED, &plat_priv->driver_state) && + driver_ops && driver_ops->resume) { ret = driver_ops->resume(pci_dev); if (ret) cnss_pr_err("Failed to resume host driver, err = %d\n", @@ -3849,6 +3853,7 @@ static int cnss_pci_suspend_noirq(struct device *dev) struct pci_dev *pci_dev = to_pci_dev(dev); struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); struct cnss_wlan_driver *driver_ops; + struct cnss_plat_data *plat_priv; if (!pci_priv) goto out; @@ -3857,7 +3862,9 @@ static int cnss_pci_suspend_noirq(struct device *dev) goto out; driver_ops = pci_priv->driver_ops; - if (driver_ops && driver_ops->suspend_noirq) + plat_priv = pci_priv->plat_priv; + if (test_bit(CNSS_DRIVER_REGISTERED, &plat_priv->driver_state) && + driver_ops && driver_ops->suspend_noirq) ret = driver_ops->suspend_noirq(pci_dev); if (pci_priv->disable_pc && !pci_dev->state_saved && @@ -3874,6 +3881,7 @@ static int cnss_pci_resume_noirq(struct device *dev) struct pci_dev *pci_dev = to_pci_dev(dev); struct cnss_pci_data *pci_priv = cnss_get_pci_priv(pci_dev); struct cnss_wlan_driver *driver_ops; + struct cnss_plat_data *plat_priv; if (!pci_priv) goto out; @@ -3881,8 +3889,10 @@ static int cnss_pci_resume_noirq(struct device *dev) if (!cnss_is_device_powered_on(pci_priv->plat_priv)) goto out; + plat_priv = pci_priv->plat_priv; driver_ops = pci_priv->driver_ops; - if (driver_ops && driver_ops->resume_noirq && + if (test_bit(CNSS_DRIVER_REGISTERED, &plat_priv->driver_state) && + driver_ops && driver_ops->resume_noirq && !pci_priv->pci_link_down_ind) ret = driver_ops->resume_noirq(pci_dev);