diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-09-17 12:59:52 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-09-17 12:59:52 -0700 |
commit | 1befebc47d9d055ea7557d0fb4de431c521b1fe6 (patch) | |
tree | 636efd379cf39bf917ff43a232d329cedac7edca | |
parent | c93a92750eb0024249d8abcf93f82d765acf51d0 (diff) | |
parent | 7b2f56361b350186bdbe52f3cd9864057195056f (diff) |
Merge "icnss: Handle multiple PD down notifications"
-rw-r--r-- | drivers/soc/qcom/icnss.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c index d0d395244469..e56030e3b116 100644 --- a/drivers/soc/qcom/icnss.c +++ b/drivers/soc/qcom/icnss.c @@ -281,6 +281,7 @@ enum icnss_driver_state { ICNSS_SSR_ENABLED, ICNSS_PDR_ENABLED, ICNSS_PD_RESTART, + ICNSS_MSA0_ASSIGNED, }; struct ce_irq_list { @@ -1484,7 +1485,7 @@ int icnss_power_off(struct device *dev) } EXPORT_SYMBOL(icnss_power_off); -int icnss_map_msa_permissions(struct icnss_priv *priv, u32 index) +static int icnss_map_msa_permissions(struct icnss_priv *priv, u32 index) { int ret = 0; phys_addr_t addr; @@ -1522,7 +1523,7 @@ out: } -int icnss_unmap_msa_permissions(struct icnss_priv *priv, u32 index) +static int icnss_unmap_msa_permissions(struct icnss_priv *priv, u32 index) { int ret = 0; phys_addr_t addr; @@ -1560,7 +1561,10 @@ out: static int icnss_setup_msa_permissions(struct icnss_priv *priv) { - int ret = 0; + int ret; + + if (test_bit(ICNSS_MSA0_ASSIGNED, &priv->state)) + return 0; ret = icnss_map_msa_permissions(priv, 0); if (ret) @@ -1570,6 +1574,8 @@ static int icnss_setup_msa_permissions(struct icnss_priv *priv) if (ret) goto err_map_msa; + set_bit(ICNSS_MSA0_ASSIGNED, &priv->state); + return ret; err_map_msa: @@ -1579,8 +1585,13 @@ err_map_msa: static void icnss_remove_msa_permissions(struct icnss_priv *priv) { + if (!test_bit(ICNSS_MSA0_ASSIGNED, &priv->state)) + return; + icnss_unmap_msa_permissions(priv, 0); icnss_unmap_msa_permissions(priv, 1); + + clear_bit(ICNSS_MSA0_ASSIGNED, &priv->state); } static int wlfw_msa_mem_info_send_sync_msg(void) @@ -2437,12 +2448,17 @@ out: return 0; } -static int icnss_qmi_pd_event_service_down(struct icnss_priv *priv, void *data) +static int icnss_driver_event_pd_service_down(struct icnss_priv *priv, + void *data) { int ret = 0; - if (test_bit(ICNSS_PD_RESTART, &priv->state)) + if (test_bit(ICNSS_PD_RESTART, &priv->state)) { + icnss_pr_err("PD Down while recovery inprogress, state: 0x%lx\n", + priv->state); + ICNSS_ASSERT(0); goto out; + } set_bit(ICNSS_PD_RESTART, &priv->state); clear_bit(ICNSS_FW_READY, &priv->state); @@ -2460,7 +2476,7 @@ out: ret = icnss_hw_power_off(priv); - icnss_pr_dbg("Shutdown completed: %d, state: 0x%lx\n", + icnss_pr_dbg("PD down completed: %d, state: 0x%lx\n", ret, priv->state); return ret; @@ -2502,7 +2518,7 @@ static void icnss_driver_event_work(struct work_struct *work) ret = icnss_driver_event_unregister_driver(event->data); break; case ICNSS_DRIVER_EVENT_PD_SERVICE_DOWN: - icnss_qmi_pd_event_service_down(penv, event->data); + icnss_driver_event_pd_service_down(penv, event->data); break; default: icnss_pr_err("Invalid Event type: %d", event->type); @@ -3687,7 +3703,7 @@ static ssize_t icnss_stats_write(struct file *fp, const char __user *buf, static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv) { - int i; + enum icnss_driver_state i; int skip = 0; unsigned long state; @@ -3716,11 +3732,14 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv) case ICNSS_FW_TEST_MODE: seq_puts(s, "FW TEST MODE"); continue; + case ICNSS_SUSPEND: + seq_puts(s, "SUSPEND"); + continue; case ICNSS_PM_SUSPEND: seq_puts(s, "PM SUSPEND"); continue; case ICNSS_PM_SUSPEND_NOIRQ: - seq_puts(s, "PM SUSPEND_NOIRQ"); + seq_puts(s, "PM SUSPEND NOIRQ"); continue; case ICNSS_SSR_ENABLED: seq_puts(s, "SSR ENABLED"); @@ -3731,6 +3750,9 @@ static int icnss_stats_show_state(struct seq_file *s, struct icnss_priv *priv) case ICNSS_PD_RESTART: seq_puts(s, "PD RESTART"); continue; + case ICNSS_MSA0_ASSIGNED: + seq_puts(s, "MSA0 ASSIGNED"); + continue; } seq_printf(s, "UNKNOWN-%d", i); |