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

Commit 4945d76d authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Serialize driver load and unload"

parents 0298f69e 3ad1e700
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -1403,6 +1403,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,
@@ -2075,6 +2076,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,
@@ -2100,19 +2102,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;