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

Commit 9de4633a authored by Naman Padhiar's avatar Naman Padhiar
Browse files

icnss2: Add support for host triggered recovery



Send force FW crash message to FW via smp2p to trigger
SSR. This will be used by host to recover FW bad state.

Change-Id: If840a94c9102acb775fc67e6fd2098e9ae3b8a33
Signed-off-by: default avatarNaman Padhiar <npadhiar@codeaurora.org>
parent ba87aa9b
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -1834,6 +1834,30 @@ static int icnss_enable_recovery(struct icnss_priv *priv)
	return 0;
}

static int icnss_trigger_ssr_smp2p(struct icnss_priv *priv)
{
	unsigned int value = 0;
	int ret;

	if (IS_ERR(priv->smp2p_info.smem_state))
		return -EINVAL;

	value |= priv->smp2p_info.seq++;
	value <<= ICNSS_SMEM_SEQ_NO_POS;
	value |= ICNSS_TRIGGER_SSR;
	ret = qcom_smem_state_update_bits(
			priv->smp2p_info.smem_state,
			ICNSS_SMEM_VALUE_MASK,
			value);
	if (ret)
		icnss_pr_dbg("Error in SMP2P sent ret: %d\n", ret);

	icnss_pr_dbg("Initiate Root PD restart. SMP2P sent value: 0x%X\n",
		     value);
	set_bit(ICNSS_HOST_TRIGGERED_PDR, &priv->state);
	return ret;
}

static int icnss_tcdev_get_max_state(struct thermal_cooling_device *tcdev,
					unsigned long *thermal_state)
{
@@ -2681,6 +2705,9 @@ int icnss_trigger_recovery(struct device *dev)
		goto out;
	}

	if (priv->device_id == WCN6750_DEVICE_ID)
		return icnss_trigger_ssr_smp2p(priv);

	if (!test_bit(ICNSS_PDR_REGISTERED, &priv->state)) {
		icnss_pr_err("PD restart not enabled to trigger recovery: state: 0x%lx\n",
			     priv->state);
+3 −1
Original line number Diff line number Diff line
@@ -172,10 +172,12 @@ struct icnss_fw_mem {
	unsigned long attrs;
};

enum icnss_power_save_mode {
enum icnss_smp2p_msg_id {
	ICNSS_POWER_SAVE_ENTER = 1,
	ICNSS_POWER_SAVE_EXIT,
	ICNSS_TRIGGER_SSR,
};

struct icnss_stats {
	struct {
		uint32_t posted;