aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryiming <yiming.xx.li@stericsson.com>2011-05-30 16:58:57 +0200
committerSverre Vegge <sverre.vegge@stericsson.com>2011-08-02 21:59:03 +0200
commit0b682f901491c16db95feca9a5c45db6321074d3 (patch)
tree5fd98fd21016395956031231cd2e53f93414e8cb
parent16a38a758282c56ff7c24f99d296528479df47b0 (diff)
downloadu300-0b682f901491c16db95feca9a5c45db6321074d3.tar.gz
SIM: Handle sim reset.
Signed-off-by: Sverre Vegge <sverre.vegge@stericsson.com>
-rw-r--r--u300-ril-sim.c113
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__);