From 4ea02373bc8049342436a2466ab11fc47b69f776 Mon Sep 17 00:00:00 2001 From: Naman Padhiar Date: Tue, 20 Oct 2020 23:44:51 +0530 Subject: [PATCH] icnss2: Avoid race between SOC WAKE REQ/RESP There is a race between soc wake release in event queue and soc wake request called from driver. Due to which ref count is not updated properly and results in number of soc wake release send to FW is more than number of soc wake request. Fix it by atomically incrementing ref count. Change-Id: I1e134af8a1170d804aeaea53ea6bd288bbcb42b8 Signed-off-by: Naman Padhiar --- drivers/soc/qcom/icnss2/main.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c index 8f8de8d35170..7c29a9e5cb7d 100644 --- a/drivers/soc/qcom/icnss2/main.c +++ b/drivers/soc/qcom/icnss2/main.c @@ -2336,7 +2336,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; @@ -2346,9 +2345,9 @@ int icnss_force_wake_request(struct device *dev) return -EINVAL; } - 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); + if (atomic_inc_not_zero(&priv->soc_wake_ref_count)) { + icnss_pr_dbg("SOC already awake, Ref count: %d", + atomic_read(&priv->soc_wake_ref_count)); return 0; }