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

Commit 56eae51c authored by Yuanyuan Liu's avatar Yuanyuan Liu
Browse files

cnss2: Switch from enum to bitmap to record driver state



Using bitmap to record driver state, which is more accurate
and extensible.

CRs-Fixed: 2012284
Change-Id: I1cce0870d839405db0fa40a3d8c9468a9bf6874f
Signed-off-by: default avatarYuanyuan Liu <yuanliu@codeaurora.org>
parent edc93d8c
Loading
Loading
Loading
Loading
+32 −25
Original line number Diff line number Diff line
@@ -473,7 +473,7 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
	if (!pci_priv)
		return -ENODEV;

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD)
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state))
		complete(&plat_priv->fw_ready_event);
	else
		ret = cnss_wlfw_wlan_mode_send_sync(plat_priv,
@@ -740,7 +740,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops)
		goto out;
	}

	plat_priv->driver_status = CNSS_LOAD_UNLOAD;
	set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
	plat_priv->driver_ops = driver_ops;
	subsys_info = &plat_priv->subsys_info;

@@ -754,12 +754,10 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops)
		goto reset_ctx;
	}

	plat_priv->driver_status = CNSS_INITIALIZED;

	return 0;
reset_ctx:
	cnss_pr_err("Failed to get subsystem, err = %d\n", ret);
	plat_priv->driver_status = CNSS_UNINITIALIZED;
	clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
	plat_priv->driver_ops = NULL;
out:
	return ret;
@@ -776,12 +774,11 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops)
		return;
	}

	plat_priv->driver_status = CNSS_LOAD_UNLOAD;
	set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
	subsys_info = &plat_priv->subsys_info;
	subsystem_put(subsys_info->subsys_handle);
	subsys_info->subsys_handle = NULL;
	plat_priv->driver_ops = NULL;
	plat_priv->driver_status = CNSS_UNINITIALIZED;
}
EXPORT_SYMBOL(cnss_wlan_unregister_driver);

@@ -941,7 +938,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv)
		goto power_off;
	}

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) {
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		ret = plat_priv->driver_ops->probe(pci_priv->pci_dev,
						   pci_priv->pci_device_id);
		if (ret) {
@@ -949,7 +946,9 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv)
				    ret);
			goto suspend_link;
		}
	} else if (plat_priv->driver_status == CNSS_RECOVERY) {
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	} else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
		ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev,
						    pci_priv->pci_device_id);
		if (ret) {
@@ -957,7 +956,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv)
				    ret);
			goto suspend_link;
		}
		plat_priv->driver_status = CNSS_INITIALIZED;
		clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
	} else {
		cnss_pr_err("Driver state is not correct to power up!\n");
		ret = -EINVAL;
@@ -984,13 +983,13 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv)
	if (!plat_priv->driver_ops)
		return -EINVAL;

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) {
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE);
		plat_priv->driver_ops->remove(pci_priv->pci_dev);
		cnss_pci_set_monitor_wake_intr(pci_priv, false);
		cnss_pci_set_auto_suspended(pci_priv, 0);
	} else {
		plat_priv->driver_status = CNSS_RECOVERY;
		set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
		plat_priv->driver_ops->shutdown(pci_priv->pci_dev);
	}

@@ -1000,6 +999,11 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv)

	cnss_power_off_device(plat_priv);

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	}

	return ret;
}

@@ -1071,7 +1075,7 @@ skip_fw_ready:
		goto out;
	}

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) {
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		ret = plat_priv->driver_ops->probe(pci_priv->pci_dev,
						   pci_priv->pci_device_id);
		if (ret) {
@@ -1079,7 +1083,9 @@ skip_fw_ready:
				    ret);
			goto stop_mhi;
		}
	} else if (plat_priv->driver_status == CNSS_RECOVERY) {
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	} else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
		ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev,
						    pci_priv->pci_device_id);
		if (ret) {
@@ -1087,15 +1093,13 @@ skip_fw_ready:
				    ret);
			goto stop_mhi;
		}
		plat_priv->driver_status = CNSS_INITIALIZED;
		clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
	} else {
		cnss_pr_err("Driver state is not correct to power up!\n");
		ret = -EINVAL;
		goto stop_mhi;
	}

	set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);

	return 0;

stop_mhi:
@@ -1123,18 +1127,16 @@ static int cnss_qca6290_shutdown(struct cnss_plat_data *plat_priv)
	if (enable_waltest)
		goto bypass_driver_remove;

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) {
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE);
		plat_priv->driver_ops->remove(pci_priv->pci_dev);
		cnss_pci_set_monitor_wake_intr(pci_priv, false);
		cnss_pci_set_auto_suspended(pci_priv, 0);
	} else {
		plat_priv->driver_status = CNSS_RECOVERY;
		set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
		plat_priv->driver_ops->shutdown(pci_priv->pci_dev);
	}

	clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);

bypass_driver_remove:
	if (!fbc_bypass)
		cnss_pci_stop_mhi(pci_priv);
@@ -1145,6 +1147,11 @@ bypass_driver_remove:

	cnss_power_off_device(plat_priv);

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	}

	return ret;
}

@@ -1271,6 +1278,7 @@ void cnss_device_crashed(void)

	subsys_info = &plat_priv->subsys_info;
	if (subsys_info->subsys_device) {
		set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
		subsys_set_crash_status(subsys_info->subsys_device, true);
		subsystem_restart_dev(subsys_info->subsys_device);
	}
@@ -1319,25 +1327,24 @@ int cnss_self_recovery(struct device *dev,
		return -EINVAL;
	}

	if (plat_priv->driver_status == CNSS_RECOVERY) {
	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
		cnss_pr_err("Recovery is already in progress!\n");
		return -EINVAL;
	}

	if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) {
	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
		cnss_pr_err("Driver load or unload is in progress!\n");
		return -EINVAL;
	}

	subsys_info = &plat_priv->subsys_info;
	plat_priv->recovery_count++;
	plat_priv->driver_status = CNSS_RECOVERY;
	set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
	pm_stay_awake(dev);
	cnss_shutdown(&subsys_info->subsys_desc, false);
	udelay(WLAN_RECOVERY_DELAY);
	cnss_powerup(&subsys_info->subsys_desc);
	pm_relax(dev);
	plat_priv->driver_status = CNSS_INITIALIZED;

	return 0;
}
+2 −0
Original line number Diff line number Diff line
@@ -105,7 +105,9 @@ enum cnss_driver_state {
	CNSS_FW_MEM_READY,
	CNSS_FW_READY,
	CNSS_COLD_BOOT_CAL_DONE,
	CNSS_DRIVER_LOAD_UNLOAD,
	CNSS_DRIVER_PROBED,
	CNSS_DRIVER_RECOVERY,
};

struct cnss_recovery_work_t {
+2 −2
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ static int cnss_set_pci_config_space(struct cnss_pci_data *pci_priv, bool save)
		return -ENODEV;

	link_down_or_recovery = pci_priv->pci_link_down_ind ||
		(plat_priv->driver_status == CNSS_RECOVERY);
		(test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state));

	if (save) {
		if (link_down_or_recovery) {
@@ -98,7 +98,7 @@ static int cnss_set_pci_link(struct cnss_pci_data *pci_priv, bool link_up)
		return -ENODEV;

	link_down_or_recovery = pci_priv->pci_link_down_ind ||
		(plat_priv->driver_status == CNSS_RECOVERY);
		(test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state));

	ret = msm_pcie_pm_control(link_up ? MSM_PCIE_RESUME :
				  MSM_PCIE_SUSPEND,