Copied SIM/PIN handling from MBM. o Poll SIM status when initializing o STE modem uses PIN entry quirk for mbm as well --- drivers/atmodem/sim.c | 9 +++++-- plugins/ste.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 6 deletions(-)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index eb40ad7..8e7c403 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -567,10 +567,12 @@ static void at_pin_send_cb(gboolean ok, GAtResult *result, decode_at_error(&error, g_at_result_final_response(result)); /* - * On the MBM modem, AT+CPIN? keeps returning SIM PIN for a moment - * after successful AT+CPIN="..", but sends *EPEV when that changes. + * On the MBM and STE modem, AT+CPIN? keeps returning SIM PIN for a + * moment after successful AT+CPIN="..", but sends *EPEV when that + * changes. */ - if (ok && sd->vendor == OFONO_VENDOR_MBM) { + if (ok && (sd->vendor == OFONO_VENDOR_MBM || + sd->vendor == OFONO_VENDOR_STE)) { sd->epev_id = g_at_chat_register(sd->chat, "*EPEV", at_epev_notify, FALSE, cbd, g_free); @@ -817,6 +819,7 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor, case OFONO_VENDOR_WAVECOM: g_at_chat_add_terminator(sd->chat, "+CPIN:", 6, TRUE); break; + case OFONO_VENDOR_STE: case OFONO_VENDOR_MBM: g_at_chat_send(sd->chat, "AT*EPEE=1", NULL, NULL, NULL, NULL); break; diff --git a/plugins/ste.c b/plugins/ste.c index ab48e18..d82f48e 100644 --- a/plugins/ste.c +++ b/plugins/ste.c @@ -60,8 +60,13 @@ #include <drivers/stemodem/caif_socket.h> #include <drivers/stemodem/if_caif.h> +static const char *cpin_prefix[] = { "+CPIN:", NULL }; + struct ste_data { GAtChat *chat; + guint cpin_poll_source; + guint cpin_poll_count; + gboolean have_sim; }; static int ste_probe(struct ofono_modem *modem) @@ -88,6 +93,10 @@ static void ste_remove(struct ofono_modem *modem) ofono_modem_set_data(modem, NULL); g_at_chat_unref(data->chat); + + if (data->cpin_poll_source > 0) + g_source_remove(data->cpin_poll_source); + g_free(data); } @@ -96,18 +105,58 @@ static void ste_debug(const char *str, void *user_data) ofono_info("%s", str); } +static gboolean init_simpin_check(gpointer user_data); + +static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct ste_data *data = ofono_modem_get_data(modem); + + /* Modem returns +CME ERROR: 10 if SIM is not ready. */ + if (!ok && result->final_or_pdu && + !strcmp(result->final_or_pdu, "+CME ERROR: 10") && + data->cpin_poll_count++ < 5) { + data->cpin_poll_source = + g_timeout_add_seconds(1, init_simpin_check, modem); + return; + } + + data->cpin_poll_count = 0; + + /* Modem returns ERROR if there is no SIM in slot. */ + data->have_sim = ok; + + ofono_modem_set_powered(modem, TRUE); +} + +static gboolean init_simpin_check(gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct ste_data *data = ofono_modem_get_data(modem); + + data->cpin_poll_source = 0; + + g_at_chat_send(data->chat, "AT+CPIN?", cpin_prefix, + simpin_check, modem, NULL); + + return FALSE; +} + static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; DBG(""); - if (!ok) + if (!ok) { ofono_modem_set_powered(modem, FALSE); + return; + } - ofono_modem_set_powered(modem, TRUE); + init_simpin_check(modem); } + static int ste_enable(struct ofono_modem *modem) { struct ste_data *data = ofono_modem_get_data(modem); @@ -168,7 +217,8 @@ static int ste_enable(struct ofono_modem *modem) if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(data->chat, ste_debug, NULL); - g_at_chat_send(data->chat, "ATE0 +CMEE=1", NULL, NULL, NULL, NULL); + g_at_chat_send(data->chat, "AT&F E0 V1 X4 &C1 +CMEE=1", + NULL, NULL, NULL, NULL); g_at_chat_send(data->chat, "AT+CFUN=1", NULL, cfun_enable, modem, NULL); return -EINPROGRESS; -- 1.7.0.4 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono