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

Commit 20c012c9 authored by Mahesh Kumar Kalikot Veetil's avatar Mahesh Kumar Kalikot Veetil Committed by Gerrit - the friendly Code Review server
Browse files

cnss2: Force assert if MHI resume fails



Add a new API to post force assert task to work context. Call this API
if MHI resume fails to collect dump. Also add an explicit print on
asynchronous vs synchronous call.

Change-Id: I5077b57919e475bed15e3b6f251cc3c06cf7a619
CRs-Fixed: 2741967
Signed-off-by: default avatarMahesh Kumar Kalikot Veetil <mkalikot@codeaurora.org>
parent 79b15c7d
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -1170,9 +1170,44 @@ void cnss_schedule_recovery(struct device *dev,
}
EXPORT_SYMBOL(cnss_schedule_recovery);

int cnss_force_fw_assert_async(struct device *dev)
{
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);

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

	if (plat_priv->device_id == QCA6174_DEVICE_ID) {
		cnss_pr_info("Forced FW assert is not supported\n");
		return -EOPNOTSUPP;
	}

	if (cnss_bus_is_device_down(plat_priv)) {
		cnss_pr_info("Device is already in bad state, ignore force assert\n");
		return 0;
	}

	if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) {
		cnss_pr_info("Recovery is already in progress, ignore forced FW assert\n");
		return 0;
	}

	cnss_pr_info("Force assert (async)\n");

	cnss_driver_event_post(plat_priv,
			       CNSS_DRIVER_EVENT_FORCE_FW_ASSERT,
			       0, NULL);

	return 0;
}
EXPORT_SYMBOL(cnss_force_fw_assert_async);

int cnss_force_fw_assert(struct device *dev)
{
	struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
	bool post = (in_interrupt() || irqs_disabled());

	if (!plat_priv) {
		cnss_pr_err("plat_priv is NULL\n");
@@ -1194,7 +1229,9 @@ int cnss_force_fw_assert(struct device *dev)
		return 0;
	}

	if (in_interrupt() || irqs_disabled())
	cnss_pr_info("Force assert (%s)\n", post ? "async" : "sync");

	if (post)
		cnss_driver_event_post(plat_priv,
				       CNSS_DRIVER_EVENT_FORCE_FW_ASSERT,
				       0, NULL);
+4 −0
Original line number Diff line number Diff line
@@ -1099,6 +1099,10 @@ static int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv,
out:
	cnss_pr_err("Failed to set MHI state: %s(%d)\n",
		    cnss_mhi_state_to_str(mhi_state), mhi_state);

	if (mhi_state == CNSS_MHI_RESUME)
		cnss_force_fw_assert_async(&pci_priv->pci_dev->dev);

	return ret;
}

+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ extern void cnss_schedule_recovery(struct device *dev,
extern int cnss_self_recovery(struct device *dev,
			      enum cnss_recovery_reason reason);
extern int cnss_force_fw_assert(struct device *dev);
extern int cnss_force_fw_assert_async(struct device *dev);
extern int cnss_force_collect_rddm(struct device *dev);
extern int cnss_qmi_send_get(struct device *dev);
extern int cnss_qmi_send_put(struct device *dev);