From e0ab3312f6ff09bbb7c8273081de1a7592e53684 Mon Sep 17 00:00:00 2001 From: Sandeep Singh Date: Thu, 16 Apr 2020 19:34:25 +0530 Subject: [PATCH] cnss2: Serialize driver load and unload WLAN driver unload should happen only when it has been probed successfully. So, In driver unload path wait for driver probe to be completed or timed out if it is already in progress. Change-Id: I3359a4286fc36aa9b2abc95c7af3ca2b6dc3a980 Signed-off-by: Sandeep Singh --- drivers/net/wireless/cnss2/pci.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index c57295c34461..be41b74f88bd 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1458,6 +1458,7 @@ int cnss_pci_call_driver_probe(struct cnss_pci_data *pci_priv) clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state); set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); + complete_all(&plat_priv->power_up_complete); } else if (test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state)) { ret = pci_priv->driver_ops->idle_restart(pci_priv->pci_dev, @@ -2157,6 +2158,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) } register_driver: + reinit_completion(&plat_priv->power_up_complete); ret = cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_REGISTER_DRIVER, CNSS_EVENT_SYNC_UNKILLABLE, @@ -2178,19 +2180,20 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops) } if (plat_priv->device_id == QCA6174_DEVICE_ID || - !test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state)) - goto skip_wait_idle_restart; + !(test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state) || + test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state))) + goto skip_wait_power_up; timeout = cnss_get_qmi_timeout(plat_priv); ret = wait_for_completion_timeout(&plat_priv->power_up_complete, msecs_to_jiffies((timeout << 1) + WLAN_WD_TIMEOUT_MS)); if (!ret) { - cnss_pr_err("Timeout waiting for idle restart to complete\n"); + cnss_pr_err("Timeout waiting for driver power up to complete\n"); CNSS_ASSERT(0); } -skip_wait_idle_restart: +skip_wait_power_up: if (!test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) && !test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state)) goto skip_wait_recovery;