summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuanyuan Liu <yuanliu@codeaurora.org>2016-10-24 10:13:48 -0700
committerYuanyuan Liu <yuanliu@codeaurora.org>2016-10-24 16:42:57 -0700
commit0b2474a9bfd7d39e4a3158696d7fa0041a45b894 (patch)
treeaad1b0bb379774e13bb9662bf6d9c4aa2dbcb5be
parent46aa49c1188a77f52dc4969f82292c176d8f399b (diff)
icnss: Do top level reset when timeout to pull register state
When system timeouts to pull register state, we do wsi error recovery, which causes an AHB bus hang. Fix this by doing top level reset instead of wsi error recovery. CRs-Fixed: 1080014 Change-Id: Ic5dbac9c2cd31f3193ede7cdc64249f7514e3e98 Signed-off-by: Yuanyuan Liu <yuanliu@codeaurora.org>
-rw-r--r--drivers/soc/qcom/icnss.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c
index 5e7f5c8bd2a1..c1c80bc135cc 100644
--- a/drivers/soc/qcom/icnss.c
+++ b/drivers/soc/qcom/icnss.c
@@ -1318,7 +1318,7 @@ static int icnss_hw_reset_rf_reset_cmd(struct icnss_priv *priv)
if (ret) {
icnss_pr_err("RESET: RF reset command failed, state: 0x%lx\n",
priv->state);
- icnss_hw_wsi_cmd_error_recovery(priv);
+ return ret;
}
icnss_hw_write_reg_field(priv->mem_base_va, PMM_WSI_CMD_OFFSET,
@@ -1389,7 +1389,7 @@ static int icnss_hw_reset_xo_disable_cmd(struct icnss_priv *priv)
if (ret) {
icnss_pr_err("RESET: XO disable command failed, state: 0x%lx\n",
priv->state);
- icnss_hw_wsi_cmd_error_recovery(priv);
+ return ret;
}
icnss_hw_write_reg_field(priv->mem_base_va, PMM_WSI_CMD_OFFSET,
@@ -1406,6 +1406,7 @@ static int icnss_hw_reset(struct icnss_priv *priv)
u32 rdata;
u32 rdata1;
int i;
+ int ret = 0;
if (test_bit(HW_ONLY_TOP_LEVEL_RESET, &quirks))
goto top_level_reset;
@@ -1457,11 +1458,15 @@ static int icnss_hw_reset(struct icnss_priv *priv)
icnss_hw_reset_wlan_rfactrl_power_down(priv);
- icnss_hw_reset_rf_reset_cmd(priv);
+ ret = icnss_hw_reset_rf_reset_cmd(priv);
+ if (ret)
+ goto top_level_reset;
icnss_hw_reset_switch_to_cxo(priv);
- icnss_hw_reset_xo_disable_cmd(priv);
+ ret = icnss_hw_reset_xo_disable_cmd(priv);
+ if (ret)
+ goto top_level_reset;
icnss_hw_write_reg_field(priv->mpm_config_va, MPM_WCSSAON_CONFIG_OFFSET,
MPM_WCSSAON_CONFIG_FORCE_ACTIVE, 0);