msm: bam_dmux: delay premature uplink wakeup votes
Delay processing of wakeup votes until after bam has been initialized.
Premature votes can cause bam_dmux to go into the fatal error state if
wakeup votes are processed before the modem has powered up for the first
time.
Change-Id: I18e6963d6b1003a08c117233c9465795c7aab5b2
Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
diff --git a/arch/arm/mach-msm/bam_dmux.c b/arch/arm/mach-msm/bam_dmux.c
index eba5637..befa5bb 100644
--- a/arch/arm/mach-msm/bam_dmux.c
+++ b/arch/arm/mach-msm/bam_dmux.c
@@ -241,6 +241,8 @@
static int disconnect_ack;
static LIST_HEAD(bam_other_notify_funcs);
static DEFINE_MUTEX(smsm_cb_lock);
+static DEFINE_MUTEX(delayed_ul_vote_lock);
+static int need_delayed_ul_vote;
struct outside_notify_func {
void (*notify)(void *, int, unsigned long);
@@ -1601,6 +1603,19 @@
return;
}
+ /*
+ * if someone is voting for UL before bam is inited (modem up first
+ * time), set flag for init to kickoff ul wakeup once bam is inited
+ */
+ mutex_lock(&delayed_ul_vote_lock);
+ if (unlikely(!bam_mux_initialized)) {
+ need_delayed_ul_vote = 1;
+ mutex_unlock(&delayed_ul_vote_lock);
+ mutex_unlock(&wakeup_lock);
+ return;
+ }
+ mutex_unlock(&delayed_ul_vote_lock);
+
if (a2_pc_disabled) {
/*
* don't grab the wakelock the first time because it is
@@ -2012,7 +2027,13 @@
goto rx_event_reg_failed;
}
+ mutex_lock(&delayed_ul_vote_lock);
bam_mux_initialized = 1;
+ if (need_delayed_ul_vote) {
+ need_delayed_ul_vote = 0;
+ msm_bam_dmux_kickoff_ul_wakeup();
+ }
+ mutex_unlock(&delayed_ul_vote_lock);
toggle_apps_ack();
bam_connection_is_active = 1;
complete_all(&bam_connection_completion);
@@ -2079,6 +2100,14 @@
goto register_bam_failed;
}
a2_device_handle = h;
+
+ mutex_lock(&delayed_ul_vote_lock);
+ bam_mux_initialized = 1;
+ if (need_delayed_ul_vote) {
+ need_delayed_ul_vote = 0;
+ msm_bam_dmux_kickoff_ul_wakeup();
+ }
+ mutex_unlock(&delayed_ul_vote_lock);
toggle_apps_ack();
return 0;