diff options
author | Naman Padhiar <quic_npadhiar@quicinc.com> | 2023-03-16 12:46:44 +0530 |
---|---|---|
committer | Madan Koyyalamudi <quic_mkoyyala@quicinc.com> | 2023-03-16 22:37:14 -0700 |
commit | 643d19ee98fb5faa37a540d7edf4243ba360c362 (patch) | |
tree | 7c02954540f7d8d2881e7ef11eb45a6b80b96e49 | |
parent | 31dbde2074436c86f3c25534b2aa0595dfbd80bb (diff) | |
download | wlan-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.c | 22 |
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) && |