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: Yue Ma <yuem@codeaurora.org>
This commit is contained in:
parent
a56e768ca3
commit
bde7c6fb4d
3 changed files with 20 additions and 9 deletions
|
@ -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 @@ shutdown:
|
|||
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;
|
||||
}
|
||||
|
||||
|
@ -1179,8 +1188,10 @@ static void cnss_qca6290_crash_shutdown(struct cnss_plat_data *plat_priv)
|
|||
|
||||
if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) ||
|
||||
test_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state) ||
|
||||
test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state))
|
||||
test_bit(CNSS_DRIVER_UNLOADING, &plat_priv->driver_state)) {
|
||||
cnss_pr_dbg("Ignore crash shutdown\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RDDM_KERNEL_PANIC);
|
||||
if (ret) {
|
||||
|
@ -1538,11 +1549,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;
|
||||
}
|
||||
|
|
|
@ -1185,6 +1185,10 @@ static void cnss_mhi_notify_status(enum MHI_CB_REASON reason, 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);
|
||||
|
||||
set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state);
|
||||
del_timer(&plat_priv->fw_boot_timer);
|
||||
|
||||
|
|
|
@ -88,6 +88,7 @@ enum cnss_driver_status {
|
|||
CNSS_INITIALIZED,
|
||||
CNSS_LOAD_UNLOAD,
|
||||
CNSS_RECOVERY,
|
||||
CNSS_FW_DOWN,
|
||||
};
|
||||
|
||||
struct cnss_ce_tgt_pipe_cfg {
|
||||
|
|
Loading…
Add table
Reference in a new issue