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

Commit 51de3256 authored by Naman Padhiar's avatar Naman Padhiar
Browse files

icnss2: Fix race condition during SOC wake req/release



Read ref count in soc event work to avoid race between
reading and updating ref count.

Change-Id: Ife9249cc4c76577a0ccd7113d17cef3fd703215a
Signed-off-by: default avatarNaman Padhiar <npadhiar@codeaurora.org>
parent 6e7cb1d2
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -983,10 +983,17 @@ static int icnss_qdss_trace_save_hdlr(struct icnss_priv *priv,
static int icnss_event_soc_wake_request(struct icnss_priv *priv, void *data)
{
	int ret = 0;
	int count = 0;

	if (!priv)
		return -ENODEV;

	if (atomic_read(&priv->soc_wake_ref_count)) {
		count = atomic_inc_return(&priv->soc_wake_ref_count);
		icnss_pr_dbg("SOC already awake, Ref count: %d", count);
		return 0;
	}

	ret = wlfw_send_soc_wake_msg(priv, QMI_WLFW_WAKE_REQUEST_V01);
	if (!ret)
		atomic_inc(&priv->soc_wake_ref_count);
@@ -2326,7 +2333,6 @@ EXPORT_SYMBOL(icnss_set_fw_log_mode);
int icnss_force_wake_request(struct device *dev)
{
	struct icnss_priv *priv = dev_get_drvdata(dev);
	int count = 0;

	if (!dev)
		return -ENODEV;
@@ -2338,12 +2344,6 @@ int icnss_force_wake_request(struct device *dev)

	icnss_pr_dbg("Calling SOC Wake request");

	if (atomic_read(&priv->soc_wake_ref_count)) {
		count = atomic_inc_return(&priv->soc_wake_ref_count);
		icnss_pr_dbg("SOC already awake, Ref count: %d", count);
		return 0;
	}

	icnss_soc_wake_event_post(priv, ICNSS_SOC_WAKE_REQUEST_EVENT,
				  0, NULL);