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

Commit 7f4eeee9 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Force assert if MHI resume fails"

parents 09c88be7 20c012c9
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -1195,9 +1195,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");
@@ -1219,7 +1254,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);
+8 −0
Original line number Diff line number Diff line
@@ -1098,6 +1098,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;
}

@@ -2477,7 +2481,9 @@ static int cnss_pci_suspend(struct device *dev)
		goto clear_flag;

	if (!pci_priv->disable_pc) {
		mutex_lock(&pci_priv->bus_lock);
		ret = cnss_pci_suspend_bus(pci_priv);
		mutex_unlock(&pci_priv->bus_lock);
		if (ret)
			goto resume_driver;
	}
@@ -2516,7 +2522,9 @@ static int cnss_pci_resume(struct device *dev)
		goto out;

	if (!pci_priv->disable_pc) {
		mutex_lock(&pci_priv->bus_lock);
		ret = cnss_pci_resume_bus(pci_priv);
		mutex_unlock(&pci_priv->bus_lock);
		if (ret)
			goto out;
	}
+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);