Make sure that the SIM card is ready before sending commands
---
 plugins/zte.c |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 64 insertions(+), 1 deletions(-)

diff --git a/plugins/zte.c b/plugins/zte.c
index 4bac3cf..53b3fa0 100644
--- a/plugins/zte.c
+++ b/plugins/zte.c
@@ -49,10 +49,14 @@
 #include <drivers/atmodem/vendor.h>
 
 static const char *none_prefix[] = { NULL };
+static const char *cpin_prefix[] = { "+CPIN:", NULL };
 
 struct zte_data {
        GAtChat *modem;
        GAtChat *aux;
+       guint cpin_poll_source;
+       guint cpin_poll_count;
+       gboolean have_sim;
        struct ofono_gprs *gprs;
        struct ofono_gprs_context *gc;
 };
@@ -83,6 +87,9 @@ static void zte_remove(struct ofono_modem *modem)
        g_at_chat_unref(data->modem);
        g_at_chat_unref(data->aux);
 
+       if (data->cpin_poll_source > 0)
+               g_source_remove(data->cpin_poll_source);
+
        g_free(data);
 }
 
@@ -152,13 +159,69 @@ static void zte_disconnect(gpointer user_data)
                ofono_gprs_add_context(data->gprs, data->gc);
 }
 
+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 zte_data *data = ofono_modem_get_data(modem);
+       struct ofono_error error;
+
+       DBG("");
+
+       decode_at_error(&error, g_at_result_final_response(result));
+
+       /* Modem returns an error if SIM is not ready. */
+       switch (error.error) {
+       case 10:
+       case 13:
+               data->have_sim = FALSE;
+               break;
+       case 14: /* SIM Busy, wait and check again the card status */
+               if (data->cpin_poll_count++ < 5) {
+                       data->cpin_poll_source =
+                               g_timeout_add_seconds(1, init_simpin_check,
+                                               modem);
+                       return;
+               }
+               /*SIM card is present but not accessible*/
+               data->have_sim = FALSE;
+               break;
+       default:
+               data->have_sim = TRUE;
+       }
+
+       data->cpin_poll_count = 0;
+
+       ofono_modem_set_powered(modem, TRUE);
+}
+
+static gboolean init_simpin_check(gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct zte_data *data = ofono_modem_get_data(modem);
+
+       data->cpin_poll_source = 0;
+
+       g_at_chat_send(data->modem, "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("");
 
-       ofono_modem_set_powered(modem, ok);
+       if (!ok) {
+               ofono_modem_set_powered(modem, FALSE);
+               return;
+       }
+
+       init_simpin_check(modem);
 }
 
 static int zte_enable(struct ofono_modem *modem)
-- 
1.7.4.1

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

Reply via email to