summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuba Pawlak <kubax.t.pawlak@intel.com>2016-01-12 16:03:29 +0100
committerDenis Kenzior <denkenz@gmail.com>2016-01-12 10:31:15 -0600
commitfc4088fb0217ae0b54e88d3c3df077a0996b0c47 (patch)
tree7c7edf86d850621beb1ce88679289766449b6ae1
parentabb72e8999c01c373fca3a6e845185917ca7c256 (diff)
downloadofono-fc4088fb0217ae0b54e88d3c3df077a0996b0c47.tar.bz2
hfpmodem: Handle repeated held call indicator
An issue with iPhone 5C iOS 9.2 triggers desynchronization in call states. When an active call is put on hold and another call arrives, it is in WAITING state. It should be possible to answer it by issuing AT+CHLD=2 but the phone changes its state to INCOMING so ATA should be used. This change is advertised by sending callheld:2 event, but it is not handled. This event can be used to trigger CLCC poll to synchronize call states. +CIEV: 3,1 <- first call arrives AT+CLCC +CLCC: 1,1,4,0,0,"01234567890",129 OK RING +CLIP: "01234567890",129 ATA OK +CIEV: 2,1 +CIEV: 3,0. AT+CHLD=2.$ <- first call is put on hold OK +CIEV: 7,2 <- notification confirming that call #1 is on hold +CCWA: "09876543210",129,1 <- second call arrives +CIEV: 7,2 +CIEV: 3,1 AT+CLCC +CLCC: 1,1,1,0,0,"01234567890",129 +CLCC: 2,1,5,0,0,"09876543210",129 <- new call is still in WAITING state OK +CIEV: 7,2 <- phone iternally promotes WAITING call to INCOMING AT+CHLD=2 <- there is no WAITING call anymore, ATA should be used +CME ERROR:3
-rw-r--r--drivers/hfpmodem/voicecall.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/hfpmodem/voicecall.c b/drivers/hfpmodem/voicecall.c
index d0e93537..3acfc3a3 100644
--- a/drivers/hfpmodem/voicecall.c
+++ b/drivers/hfpmodem/voicecall.c
@@ -1110,6 +1110,17 @@ static void ciev_callheld_notify(struct ofono_voicecall *vc,
*/
vd->clcc_source = g_timeout_add(POLL_CLCC_DELAY,
poll_clcc, vc);
+ } else {
+ if (vd->clcc_source)
+ g_source_remove(vd->clcc_source);
+
+ /*
+ * We got a notification that there is a held call
+ * and no active call but we already are in such state.
+ * Let's schedule a poll to see what happened.
+ */
+ vd->clcc_source = g_timeout_add(POLL_CLCC_DELAY,
+ poll_clcc, vc);
}
}