summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-09-17 12:59:52 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-17 12:59:52 -0700
commit1befebc47d9d055ea7557d0fb4de431c521b1fe6 (patch)
tree636efd379cf39bf917ff43a232d329cedac7edca
parentc93a92750eb0024249d8abcf93f82d765acf51d0 (diff)
parent7b2f56361b350186bdbe52f3cd9864057195056f (diff)
Merge "icnss: Handle multiple PD down notifications"
-rw-r--r--drivers/soc/qcom/icnss.c40
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);