Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ad1e700 authored by Sandeep Singh's avatar Sandeep Singh Committed by Yue Ma
Browse files

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: default avatarSandeep Singh <sandsing@codeaurora.org>
parent 84b56d3a
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -1400,6 +1400,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_RECOVERY, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
		set_bit(CNSS_DRIVER_PROBED, &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,
	} else if (test_bit(CNSS_DRIVER_IDLE_RESTART,
			    &plat_priv->driver_state)) {
			    &plat_priv->driver_state)) {
		ret = pci_priv->driver_ops->idle_restart(pci_priv->pci_dev,
		ret = pci_priv->driver_ops->idle_restart(pci_priv->pci_dev,
@@ -2072,6 +2073,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops)
	}
	}


register_driver:
register_driver:
	reinit_completion(&plat_priv->power_up_complete);
	ret = cnss_driver_event_post(plat_priv,
	ret = cnss_driver_event_post(plat_priv,
				     CNSS_DRIVER_EVENT_REGISTER_DRIVER,
				     CNSS_DRIVER_EVENT_REGISTER_DRIVER,
				     CNSS_EVENT_SYNC_UNINTERRUPTIBLE,
				     CNSS_EVENT_SYNC_UNINTERRUPTIBLE,
@@ -2097,19 +2099,20 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops)
	}
	}


	if (plat_priv->device_id == QCA6174_DEVICE_ID ||
	if (plat_priv->device_id == QCA6174_DEVICE_ID ||
	    !test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state))
	    !(test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state) ||
		goto skip_wait_idle_restart;
	      test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state)))
		goto skip_wait_power_up;


	timeout = cnss_get_qmi_timeout(plat_priv);
	timeout = cnss_get_qmi_timeout(plat_priv);
	ret = wait_for_completion_timeout(&plat_priv->power_up_complete,
	ret = wait_for_completion_timeout(&plat_priv->power_up_complete,
					  msecs_to_jiffies((timeout << 1) +
					  msecs_to_jiffies((timeout << 1) +
							   WLAN_WD_TIMEOUT_MS));
							   WLAN_WD_TIMEOUT_MS));
	if (!ret) {
	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);
		CNSS_ASSERT(0);
	}
	}


skip_wait_idle_restart:
skip_wait_power_up:
	if (!test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
	if (!test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
	    !test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
	    !test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
		goto skip_wait_recovery;
		goto skip_wait_recovery;