diff options
author | yiming <yiming.xx.li@stericsson.com> | 2011-05-30 16:58:57 +0200 |
---|---|---|
committer | Sverre Vegge <sverre.vegge@stericsson.com> | 2011-08-02 21:59:03 +0200 |
commit | 0b682f901491c16db95feca9a5c45db6321074d3 (patch) | |
tree | 5fd98fd21016395956031231cd2e53f93414e8cb | |
parent | 16a38a758282c56ff7c24f99d296528479df47b0 (diff) | |
download | u300-0b682f901491c16db95feca9a5c45db6321074d3.tar.gz |
SIM: Handle sim reset.
Signed-off-by: Sverre Vegge <sverre.vegge@stericsson.com>
-rw-r--r-- | u300-ril-sim.c | 113 |
1 files changed, 57 insertions, 56 deletions
diff --git a/u300-ril-sim.c b/u300-ril-sim.c index b1fca5b..d06c74c 100644 --- a/u300-ril-sim.c +++ b/u300-ril-sim.c @@ -98,6 +98,9 @@ static char s_cachedPath[4 * 10 + 1] = {__s_cachedPath}; #define __s_cachedFileid -1 static unsigned short s_cachedFileid = __s_cachedFileid; + +#define __s_simResetting false +static bool s_simResetting = __s_simResetting; /*****************************************************/ /* Controlled static state variables - section end */ /*****************************************************/ @@ -341,49 +344,6 @@ exit: return simAbsent; } -static void resetSim(void *param) -{ - ATResponse *atresponse = NULL; - int err, state, skip; - char *line = NULL; - - err = - at_send_command_singleline("AT*ESIMSR?", "*ESIMSR:", &atresponse); - if (err < 0 || atresponse->success == 0) - goto error; - - line = atresponse->p_intermediates->line; - err = at_tok_start(&line); - if (err < 0) - goto error; - - err = at_tok_nextint(&line, &skip); - if (err < 0) - goto error; - - err = at_tok_nextint(&line, &state); - if (err < 0) - goto error; - - if (state == 7) { - (void)at_send_command("AT*ESIMR", NULL); - - enqueueRILEvent(CMD_QUEUE_DEFAULT, resetSim, NULL, - &TIMEVAL_SIMRESET); - } else { - RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, - NULL, 0); - pollSIMState(NULL); - } - -finally: - at_response_free(atresponse); - return; - -error: - goto finally; -} - void onSimStateChanged(const char *s) { int err, state; @@ -391,16 +351,6 @@ void onSimStateChanged(const char *s) char *line = tok = strdup(s); assert(tok != NULL); - RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, - 0); - - /* Also check sim state, that will trigger radio state to sim absent. */ - enqueueRILEvent(CMD_QUEUE_DEFAULT, pollSIMState, (void *) 1, NULL); - - /* - * Now, find out if we went to poweroff-state. If so, enqueue some loop - * to try to reset the SIM for a minute or so to try to recover. - */ err = at_tok_start(&line); if (err < 0) goto error; @@ -409,8 +359,52 @@ void onSimStateChanged(const char *s) if (err < 0) goto error; - if (state == 7) - enqueueRILEvent(CMD_QUEUE_DEFAULT, resetSim, NULL, NULL); + /* + * s_simResetting is used to coordinate state changes during sim resetting, + * i.e. ESIMSR state changing from 7 to 4 or 5. + */ + switch (state) { + case 7: /* SIM STATE POWER OFF, or indicating no SIM inserted. */ + s_simResetting = true; + setRadioState(RADIO_STATE_SIM_NOT_READY); + break; + case 4: /* SIM STATE WAIT FOR PIN */ + if (s_simResetting) { + s_simResetting = false; + /* + * Android will not poll for SIM state if Radio State has no + * changes. Therefore setRadioState twice to make Android poll for + * Sim state when there is a PIN state change. + */ + setRadioState(RADIO_STATE_SIM_NOT_READY); + setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT); + } + break; + case 5: /* SIM STATE ACTIVE */ + if (s_simResetting) { + s_simResetting = false; + /* + * Android will not poll for SIM state if Radio State has no + * changes. Therefore setRadioState twice to make Android poll for + * Sim state when there is a PIN state change. + */ + setRadioState(RADIO_STATE_SIM_NOT_READY); + setRadioState(RADIO_STATE_SIM_READY); + } + break; + case 2: /* SIM STATE BLOCKED */ + case 3: /* SIM STATE BLOCKED FOREVER */ + setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT); + break; + default: + /* + * s_simResetting should not be changed in the states between SIM POWER + * OFF to SIM STATE WAIT FOR PIN or SIM STATE ACTIVE. + */ + break; + } + + RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0); finally: free(tok); @@ -479,7 +473,8 @@ static SIM_Status getSIMStatus() char *cpinResult = NULL; ATCmeError cme_error_code; - if (getCurrentState() == RADIO_STATE_OFF || + if (s_simResetting || + getCurrentState() == RADIO_STATE_OFF || getCurrentState() == RADIO_STATE_UNAVAILABLE) { ret = SIM_NOT_READY; goto exit; @@ -2290,6 +2285,8 @@ void onResetModemStateSim(int resetState) s_cachedPath[0] = __s_cachedPath; /** s_cachedFileid */ s_cachedFileid = __s_cachedFileid; + /** s_simResetting */ + s_simResetting = __s_simResetting; break; case RESET_AT_INITIALIZED: /* @@ -2307,6 +2304,8 @@ void onResetModemStateSim(int resetState) /* No impact */ /** s_cachedFileid */ /* No impact */ + /** s_simResetting */ + /* No impact */ break; case RESET_SIM_READY: /* @@ -2322,6 +2321,8 @@ void onResetModemStateSim(int resetState) /* No impact */ /** s_cachedFileid */ /* No impact */ + /** s_simResetting */ + /* No impact */ break; default: LOGE("%s() received unknown resetState. Fatal error!", __func__); |