he910: Fixup SIM detection 82/17582/1
authorDenis Kenzior <denkenz@gmail.com>
Wed, 5 Mar 2014 18:48:21 +0000 (12:48 -0600)
committerCaiwen Zhang <caiwen.zhang@intel.com>
Fri, 7 Mar 2014 14:47:09 +0000 (22:47 +0800)
In certain cases the #QSS notification is never sent, or sent too early.
Make sure that we enable #QSS notification only after the modem has been
set as powered.  Also make sure that we explicitly query #QSS in case we
missed the earlier #QSS notification.

Change-Id: Ia155459f910f3891110a460ec6bb5fa875914ee5

plugins/he910.c

index 8d32af9..ce7e57b 100644 (file)
@@ -59,6 +59,7 @@
 #include <drivers/atmodem/vendor.h>
 
 static const char *none_prefix[] = { NULL };
+static const char *qss_prefix[] = { "#QSS:", NULL };
 
 struct he910_data {
        GAtChat *chat;          /* AT chat */
@@ -167,6 +168,32 @@ static void he910_qss_notify(GAtResult *result, gpointer user_data)
        switch_sim_state_status(modem, status);
 }
 
+static void qss_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct he910_data *data = ofono_modem_get_data(modem);
+       int status, mode;
+       GAtResultIter iter;
+
+       DBG("%p", modem);
+
+       if (!ok)
+               return;
+
+       g_at_result_iter_init(&iter, result);
+
+       if (!g_at_result_iter_next(&iter, "#QSS:"))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, &mode))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, &status))
+               return;
+
+       switch_sim_state_status(modem, status);
+}
+
 static void cfun_enable_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
        struct ofono_modem *modem = user_data;
@@ -203,6 +230,16 @@ static void cfun_enable_cb(gboolean ok, GAtResult *result, gpointer user_data)
         */
        g_at_chat_send(data->chat, "AT#AUTOATT=0", none_prefix,
                                NULL, NULL, NULL);
+
+       /* Follow sim state */
+       g_at_chat_register(data->chat, "#QSS:", he910_qss_notify,
+                               FALSE, modem, NULL);
+
+       /* Enable sim state notification */
+       g_at_chat_send(data->chat, "AT#QSS=2", none_prefix, NULL, NULL, NULL);
+
+       g_at_chat_send(data->chat, "AT#QSS?", qss_prefix,
+                       qss_query_cb, modem, NULL);
 }
 
 static int he910_enable(struct ofono_modem *modem)
@@ -231,13 +268,6 @@ static int he910_enable(struct ofono_modem *modem)
        g_at_chat_send(data->chat, "ATE0 +CMEE=1", none_prefix,
                                NULL, NULL, NULL);
 
-       /* Follow sim state */
-       g_at_chat_register(data->chat, "#QSS:", he910_qss_notify,
-                               FALSE, modem, NULL);
-
-       /* Enable sim state notification */
-       g_at_chat_send(data->chat, "AT#QSS=2", none_prefix, NULL, NULL, NULL);
-
        /* Set phone functionality */
        g_at_chat_send(data->chat, "AT+CFUN=1", none_prefix,
                                cfun_enable_cb, modem, NULL);