Interim solution until support for SIM 'ready' notification is supported.
---
Changes:
 o Fixed style issues (tabs and newlines)


 plugins/ste.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/plugins/ste.c b/plugins/ste.c
index 9cb49d3..e1ca06c 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,16 +105,55 @@ 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)
@@ -168,7 +216,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.6.3.3

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to