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

Commit a5c805aa authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Check WLAN host driver driver_ops properly"

parents ccb55e32 97a9649c
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -80,8 +80,11 @@ static int cnss_stats_show_state(struct seq_file *s,
		case CNSS_COLD_BOOT_CAL_DONE:
			seq_puts(s, "COLD_BOOT_CAL_DONE");
			continue;
		case CNSS_DRIVER_LOAD_UNLOAD:
			seq_puts(s, "DRIVER_LOAD_UNLOAD");
		case CNSS_DRIVER_LOADING:
			seq_puts(s, "DRIVER_LOADING");
			continue;
		case CNSS_DRIVER_UNLOADING:
			seq_puts(s, "DRIVER_UNLOADING");
			continue;
		case CNSS_DRIVER_PROBED:
			seq_puts(s, "DRIVER_PROBED");
+25 −25
Original line number Diff line number Diff line
@@ -471,6 +471,12 @@ static int cnss_driver_call_probe(struct cnss_plat_data *plat_priv)
	int ret;
	struct cnss_pci_data *pci_priv = plat_priv->bus_priv;

	if (!plat_priv->driver_ops) {
		cnss_pr_err("driver_ops is NULL!");
		ret = -EINVAL;
		goto out;
	}

	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);
@@ -488,7 +494,7 @@ static int cnss_driver_call_probe(struct cnss_plat_data *plat_priv)
				    ret);
			goto out;
		}
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
		set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	}

@@ -514,7 +520,7 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
	if (!pci_priv)
		return -ENODEV;

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state) ||
	if (test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) ||
	    test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state))
		ret = cnss_driver_call_probe(plat_priv);
	else if (enable_waltest)
@@ -920,7 +926,7 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv)
	if (!plat_priv->driver_ops)
		return -EINVAL;

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
	if (test_bit(CNSS_DRIVER_UNLOADING, &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);
@@ -935,8 +941,8 @@ 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);
	if (test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
		clear_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	}

@@ -964,11 +970,6 @@ static int cnss_qca6290_powerup(struct cnss_plat_data *plat_priv)
		return -ENODEV;
	}

	if (!plat_priv->driver_ops) {
		cnss_pr_err("driver_ops is NULL!\n");
		return -EINVAL;
	}

	ret = cnss_power_on_device(plat_priv);
	if (ret) {
		cnss_pr_err("Failed to power on device, err = %d\n", ret);
@@ -1024,7 +1025,7 @@ static int cnss_qca6290_shutdown(struct cnss_plat_data *plat_priv)
	if (!plat_priv->driver_ops)
		return -EINVAL;

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
	if (test_bit(CNSS_DRIVER_UNLOADING, &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);
@@ -1041,8 +1042,8 @@ static int cnss_qca6290_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);
	if (test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
		clear_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
	}

@@ -1058,7 +1059,8 @@ static void cnss_qca6290_crash_shutdown(struct cnss_plat_data *plat_priv)
		    plat_priv->driver_state);

	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) ||
	    test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state))
	    test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) ||
	    test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state))
		return;

	ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RDDM_KERNEL_PANIC);
@@ -1273,16 +1275,13 @@ static int cnss_do_recovery(struct cnss_plat_data *plat_priv,

	plat_priv->recovery_count++;

	if (!plat_priv->driver_ops) {
		cnss_pr_err("Host driver has not registered yet, ignore recovery!\n");
		return 0;
	}

	if (plat_priv->device_id == QCA6174_DEVICE_ID)
		goto self_recovery;

	if (plat_priv->driver_ops)
		plat_priv->driver_ops->update_status(pci_priv->pci_dev,
						     CNSS_RECOVERY);

	if (reason == CNSS_REASON_LINK_DOWN) {
		cnss_pci_set_mhi_state(plat_priv->bus_priv,
				       CNSS_MHI_NOTIFY_LINK_ERROR);
@@ -1332,7 +1331,8 @@ static int cnss_driver_recovery_hdlr(struct cnss_plat_data *plat_priv,
		goto out;
	}

	if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) {
	if (test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) ||
	    test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
		cnss_pr_err("Driver load or unload is in progress!\n");
		ret = -EINVAL;
		goto out;
@@ -1394,13 +1394,13 @@ static int cnss_register_driver_hdlr(struct cnss_plat_data *plat_priv,
	int ret = 0;
	struct cnss_subsys_info *subsys_info;

	set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
	set_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
	plat_priv->driver_ops = data;
	subsys_info = &plat_priv->subsys_info;

	ret = cnss_powerup(&subsys_info->subsys_desc);
	if (ret) {
		clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
		plat_priv->driver_ops = NULL;
	}

@@ -1411,7 +1411,7 @@ static int cnss_unregister_driver_hdlr(struct cnss_plat_data *plat_priv)
{
	struct cnss_subsys_info *subsys_info;

	set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state);
	set_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state);
	subsys_info = &plat_priv->subsys_info;
	cnss_shutdown(&subsys_info->subsys_desc, false);
	subsys_info->subsys_handle = NULL;
+2 −1
Original line number Diff line number Diff line
@@ -131,7 +131,8 @@ enum cnss_driver_state {
	CNSS_FW_MEM_READY,
	CNSS_FW_READY,
	CNSS_COLD_BOOT_CAL_DONE,
	CNSS_DRIVER_LOAD_UNLOAD,
	CNSS_DRIVER_LOADING,
	CNSS_DRIVER_UNLOADING,
	CNSS_DRIVER_PROBED,
	CNSS_DRIVER_RECOVERY,
};