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

Commit 8bead6d8 authored by Yue Ma's avatar Yue Ma
Browse files

cnss2: Support collecting firmware dump during driver load



When firmware crashes during WLAN host driver loads, collects
firmware dump and proceeds with SSR as normal cases.

Change-Id: If2ac7da3c2db4b4116949d092ad53299f23c87e0
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
parent 3eb55626
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -571,7 +571,8 @@ static int cnss_driver_call_probe(struct cnss_plat_data *plat_priv)
		goto out;
	}

	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
	    test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) {
		ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev,
						    pci_priv->pci_device_id);
		if (ret) {
@@ -588,6 +589,7 @@ static int cnss_driver_call_probe(struct cnss_plat_data *plat_priv)
				    ret);
			goto out;
		}
		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);
	}
@@ -614,7 +616,8 @@ static int cnss_driver_call_remove(struct cnss_plat_data *plat_priv)
		return -EINVAL;
	}

	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
	    test_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state)) {
		plat_priv->driver_ops->shutdown(pci_priv->pci_dev);
	} else if (test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
		plat_priv->driver_ops->remove(pci_priv->pci_dev);
@@ -652,7 +655,9 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
		complete(&plat_priv->power_up_complete);
	}

	if (ret)
	if (ret && test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
		goto out;
	else if (ret)
		goto shutdown;

	return 0;
@@ -662,6 +667,10 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv)
	cnss_suspend_pci_link(plat_priv->bus_priv);
	cnss_power_off_device(plat_priv);

	clear_bit(CNSS_FW_READY, &plat_priv->driver_state);
	clear_bit(CNSS_FW_MEM_READY, &plat_priv->driver_state);

out:
	return ret;
}

@@ -1527,11 +1536,6 @@ static int cnss_driver_recovery_hdlr(struct cnss_plat_data *plat_priv,
		if (!test_bit(CNSS_FW_READY, &plat_priv->driver_state)) {
			set_bit(CNSS_FW_BOOT_RECOVERY,
				&plat_priv->driver_state);
		} else if (test_bit(CNSS_DRIVER_LOADING,
			   &plat_priv->driver_state)) {
			cnss_pr_err("Driver probe is in progress, ignore recovery\n");
			ret = -EINVAL;
			goto out;
		}
		break;
	}
+4 −0
Original line number Diff line number Diff line
@@ -1214,6 +1214,10 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv,

	cnss_pr_dbg("MHI status cb is called with reason %d\n", reason);

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

	switch (reason) {
	case MHI_CB_EE_RDDM:
		cnss_reason = CNSS_REASON_RDDM;
+2 −1
Original line number Diff line number Diff line
/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -88,6 +88,7 @@ enum cnss_driver_status {
	CNSS_INITIALIZED,
	CNSS_LOAD_UNLOAD,
	CNSS_RECOVERY,
	CNSS_FW_DOWN,
};

struct cnss_ce_tgt_pipe_cfg {