summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hfpmodem/voicecall.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/hfpmodem/voicecall.c b/drivers/hfpmodem/voicecall.c
index 2caf8ab2..323893b4 100644
--- a/drivers/hfpmodem/voicecall.c
+++ b/drivers/hfpmodem/voicecall.c
@@ -60,6 +60,7 @@ struct voicecall_data {
int cind_val[HFP_INDICATOR_LAST];
unsigned int id_list;
unsigned int local_release;
+ ofono_bool_t ignore_callheld_1;
};
struct release_id_req {
@@ -321,6 +322,8 @@ static void atd_cb(gboolean ok, GAtResult *result, gpointer user_data)
call->status = CALL_STATUS_HELD;
ofono_voicecall_notify(vc, call);
+
+ vd->ignore_callheld_1 = TRUE;
}
call = create_call(vd, 0, 0, CALL_STATUS_DIALING, NULL, type, validity);
@@ -847,6 +850,15 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc,
struct ofono_call *call;
unsigned int callheld = vd->cind_val[HFP_INDICATOR_CALLHELD];
+ /* When ATD is sent when another call is active, we will receive
+ * callheld=1, then callsetup=2. We have already placed active
+ * calls on hold in atd_cb, so ignore the callheld in this case
+ */
+ if (vd->ignore_callheld_1 == TRUE && value == 1) {
+ vd->ignore_callheld_1 = FALSE;
+ goto out;
+ }
+
switch (value) {
case 0:
/* We have to poll here, we have no idea whether the call was
@@ -906,6 +918,7 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc,
release_with_status(vc, CALL_STATUS_ACTIVE);
}
+out:
vd->cind_val[HFP_INDICATOR_CALLHELD] = value;
}