diff options
author | Arun Ravindran <arunlee@gmail.com> | 2011-05-23 18:20:11 +0300 |
---|---|---|
committer | Aki Niemi <aki.niemi@nokia.com> | 2011-06-14 11:27:13 +0300 |
commit | 870905a62a3e310f1fafaeeccbdda4637540cf4d (patch) | |
tree | e79bf642861a175e617f401c5afd5b941286a046 /drivers/isimodem | |
parent | 56d315f2dd32fbcab63e948c62071661ad809701 (diff) |
isimodem: Improper handling of missed call
Diffstat (limited to 'drivers/isimodem')
-rw-r--r-- | drivers/isimodem/voicecall.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/isimodem/voicecall.c b/drivers/isimodem/voicecall.c index 333f9b88..7944248a 100644 --- a/drivers/isimodem/voicecall.c +++ b/drivers/isimodem/voicecall.c @@ -50,6 +50,7 @@ struct isi_call { uint8_t id; uint8_t call_id; uint8_t status; + uint8_t prev_status; uint8_t mode; uint8_t mode_info; uint8_t cause_type; @@ -314,7 +315,7 @@ static void isi_call_status_sb_proc(struct isi_voicecall *ivc, if (!g_isi_sb_iter_get_byte(sb, &status, 2)) return; - + call->prev_status = call->status; call->status = status; } @@ -401,10 +402,16 @@ static int isi_call_status_to_clcc(const struct isi_call *call) return 5; case CALL_STATUS_MO_RELEASE: - case CALL_STATUS_MT_RELEASE: - case CALL_STATUS_TERMINATED: return 6; + case CALL_STATUS_MT_RELEASE: + if ((call->prev_status == CALL_STATUS_MT_ALERTING) || + (call->prev_status == CALL_STATUS_COMING) || + (call->prev_status == CALL_STATUS_WAITING)) + return 4; + else + return 6; + case CALL_STATUS_ACTIVE: case CALL_STATUS_HOLD_INITIATED: return 0; @@ -548,9 +555,26 @@ static void isi_call_notify(struct ofono_voicecall *ovc, struct isi_call *call) case CALL_STATUS_MO_RELEASE: case CALL_STATUS_MT_RELEASE: - case CALL_STATUS_TERMINATED: + /* + * Core requires the call status to be either incoming + * or waiting to identify the disconnected call as missed. + * The MT RELEASE is not mapped to any state in +CLCC, but + * we need the disconnect reason. + */ isi_call_set_disconnect_reason(call); break; + case CALL_STATUS_TERMINATED: + DBG("State( CALL_STATUS_TERMINATED ) need not be reported to Core"); + /* + * The call terminated is not reported to core as + * these intermediate states are not processed in + * the core. We report the call status when it becomes + * idle and TERMINATED is not mapped to +CLCC. The disconnect + * reason is set, so that the call termination cause + * in case of error is available to the core. + */ + isi_call_set_disconnect_reason(call); + return; case CALL_STATUS_ANSWERED: DBG("State need not be reported to Core"); return; |