summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaman Padhiar <quic_npadhiar@quicinc.com>2023-03-16 12:46:44 +0530
committerMadan Koyyalamudi <quic_mkoyyala@quicinc.com>2023-03-16 22:37:14 -0700
commit643d19ee98fb5faa37a540d7edf4243ba360c362 (patch)
tree7c02954540f7d8d2881e7ef11eb45a6b80b96e49
parent31dbde2074436c86f3c25534b2aa0595dfbd80bb (diff)
downloadwlan-platform-643d19ee98fb5faa37a540d7edf4243ba360c362.tar.gz
icnss2: Check for SSR before SOC Wake request
There are scenarios when WLAN Host request for SOC Wake during SSR. If WLAN FW receives the request before FW_READY it ASSERT. Avoid sending SOC Wake request to FW during SSR. Change-Id: Ia42cc17149de7a33da0161a280c79d5dfce0f4c8 CRs-Fixed: 3435111
-rw-r--r--icnss2/main.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/icnss2/main.c b/icnss2/main.c
index 9c07d1e..ed5f843 100644
--- a/icnss2/main.c
+++ b/icnss2/main.c
@@ -486,8 +486,12 @@ static int icnss_send_smp2p(struct icnss_priv *priv,
return ret;
}
- if (test_bit(ICNSS_FW_DOWN, &priv->state))
- return -ENODEV;
+ if (test_bit(ICNSS_FW_DOWN, &priv->state) ||
+ !test_bit(ICNSS_FW_READY, &priv->state)) {
+ icnss_pr_smp2p("FW down, ignoring sending SMP2P state: 0x%lx\n",
+ priv->state);
+ return -EINVAL;
+ }
value |= priv->smp2p_info[smp2p_entry].seq++;
value <<= ICNSS_SMEM_SEQ_NO_POS;
@@ -3303,6 +3307,13 @@ int icnss_force_wake_request(struct device *dev)
return -EINVAL;
}
+ if (test_bit(ICNSS_FW_DOWN, &priv->state) ||
+ !test_bit(ICNSS_FW_READY, &priv->state)) {
+ icnss_pr_soc_wake("FW down, ignoring SOC Wake request state: 0x%lx\n",
+ priv->state);
+ return -EINVAL;
+ }
+
if (atomic_inc_not_zero(&priv->soc_wake_ref_count)) {
icnss_pr_soc_wake("SOC already awake, Ref count: %d",
atomic_read(&priv->soc_wake_ref_count));
@@ -3332,6 +3343,13 @@ int icnss_force_wake_release(struct device *dev)
return -EINVAL;
}
+ if (test_bit(ICNSS_FW_DOWN, &priv->state) ||
+ !test_bit(ICNSS_FW_READY, &priv->state)) {
+ icnss_pr_soc_wake("FW down, ignoring SOC Wake release state: 0x%lx\n",
+ priv->state);
+ return -EINVAL;
+ }
+
icnss_pr_soc_wake("Calling SOC Wake response");
if (atomic_read(&priv->soc_wake_ref_count) &&