From 3a7735e8e21a0fcf6aedac7f7cef4b47437a07fe Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Thu, 13 Feb 2020 15:57:55 -0800 Subject: [PATCH] cnss2: Avoid double calling MHI force wake put If MHI force wake get returns failure, it means MHI force wake put has already been done. Add checks to avoid double calling. Change-Id: I14f8cef5e6736130e76c287748d7ce3ff0023505 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 1c381d3c7095..fd794dbd74f6 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -544,6 +544,7 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset, u32 *val) { int ret = 0; + bool do_force_wake_put = true; ret = cnss_pci_is_device_down(&pci_priv->pci_dev->dev); if (ret) @@ -553,7 +554,9 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset, if (ret < 0) goto runtime_pm_put; - cnss_pci_force_wake_get(pci_priv); + ret = cnss_pci_force_wake_get(pci_priv); + if (ret) + do_force_wake_put = false; ret = cnss_pci_reg_read(pci_priv, offset, val); if (ret) { @@ -563,7 +566,8 @@ int cnss_pci_debug_reg_read(struct cnss_pci_data *pci_priv, u32 offset, } force_wake_put: - cnss_pci_force_wake_put(pci_priv); + if (do_force_wake_put) + cnss_pci_force_wake_put(pci_priv); runtime_pm_put: cnss_pci_pm_runtime_mark_last_busy(pci_priv); cnss_pci_pm_runtime_put_autosuspend(pci_priv); @@ -575,6 +579,7 @@ int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset, u32 val) { int ret = 0; + bool do_force_wake_put = true; ret = cnss_pci_is_device_down(&pci_priv->pci_dev->dev); if (ret) @@ -584,7 +589,9 @@ int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset, if (ret < 0) goto runtime_pm_put; - cnss_pci_force_wake_get(pci_priv); + ret = cnss_pci_force_wake_get(pci_priv); + if (ret) + do_force_wake_put = false; ret = cnss_pci_reg_write(pci_priv, offset, val); if (ret) { @@ -594,7 +601,8 @@ int cnss_pci_debug_reg_write(struct cnss_pci_data *pci_priv, u32 offset, } force_wake_put: - cnss_pci_force_wake_put(pci_priv); + if (do_force_wake_put) + cnss_pci_force_wake_put(pci_priv); runtime_pm_put: cnss_pci_pm_runtime_mark_last_busy(pci_priv); cnss_pci_pm_runtime_put_autosuspend(pci_priv); @@ -1518,7 +1526,8 @@ static void cnss_pci_misc_reg_dump(struct cnss_pci_data *pci_priv, if (cnss_pci_check_link_status(pci_priv)) return; - cnss_pci_force_wake_get(pci_priv); + if (cnss_pci_force_wake_get(pci_priv)) + return; cnss_pr_dbg("start to dump %s registers\n", reg_name); @@ -1574,6 +1583,7 @@ static void cnss_pci_dump_shadow_reg(struct cnss_pci_data *pci_priv) { int i, j = 0, array_size = SHADOW_REG_COUNT + SHADOW_REG_INTER_COUNT; u32 reg_offset; + bool do_force_wake_put = true; if (in_interrupt() || irqs_disabled()) return; @@ -1590,7 +1600,7 @@ static void cnss_pci_dump_shadow_reg(struct cnss_pci_data *pci_priv) } if (cnss_pci_force_wake_get(pci_priv)) - return; + do_force_wake_put = false; cnss_pr_dbg("Start to dump shadow registers\n"); @@ -1611,7 +1621,8 @@ static void cnss_pci_dump_shadow_reg(struct cnss_pci_data *pci_priv) } force_wake_put: - cnss_pci_force_wake_put(pci_priv); + if (do_force_wake_put) + cnss_pci_force_wake_put(pci_priv); } #ifdef CONFIG_CNSS2_DEBUG