Hi Christopher,


  plugins/telit.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++++++----
  1 file changed, 60 insertions(+), 4 deletions(-)

diff --git a/plugins/telit.c b/plugins/telit.c
index fe2ccd6..a0f7deb 100644
--- a/plugins/telit.c
+++ b/plugins/telit.c
@@ -62,6 +62,7 @@
static const char *none_prefix[] = { NULL };
  static const char *rsen_prefix[]= { "#RSEN:", NULL };
+static const char *qss_prefix[] = { "#QSS:", NULL };
struct telit_data {
        GAtChat *chat;          /* AT chat */
@@ -219,7 +220,7 @@ static void switch_sim_state_status(struct ofono_modem 
*modem, int status)
switch (status) {
        case 0: /* SIM not inserted */
-               if (data->have_sim == TRUE) {
+               if (data->have_sim == TRUE && ofono_modem_get_online(modem)) {
                        ofono_sim_inserted_notify(data->sim, FALSE);
                        data->have_sim = FALSE;
                        data->sms_phonebook_added = FALSE;
@@ -233,6 +234,14 @@ static void switch_sim_state_status(struct ofono_modem 
*modem, int status)
                }
                break;
        case 3: /* SIM inserted, SMS and phonebook ready */
+               /* It's possible that we arrive at QSS=3 state without
+                * ever seeing QSS=2, so we need to make sure that we've
+                * also done the QSS=2 work, as well
+                */
+               if (data->have_sim == FALSE) {
+                       ofono_sim_inserted_notify(data->sim, TRUE);
+                       data->have_sim = TRUE;
+               }
                if (data->sms_phonebook_added == FALSE) {
                        ofono_phonebook_create(modem, 0, "atmodem", data->chat);
                        ofono_sms_create(modem, 0, "atmodem", data->chat);
@@ -245,6 +254,28 @@ static void switch_sim_state_status(struct ofono_modem 
*modem, int status)
        }
  }
+/*
+ * telit_qss_cb gets invoked once when querying the QSS status immediately
+ * after enabling the modem.
+ */
+static void telit_qss_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       int mode;
+       int status;
+       GAtResultIter iter;
+
+       g_at_result_iter_init(&iter, result);
+
+       DBG("%p", modem);
+       if (!g_at_result_iter_next(&iter, "#QSS:"))
+               return;
+       g_at_result_iter_next_number(&iter, &mode);
+       g_at_result_iter_next_number(&iter, &status);
+
+       switch_sim_state_status(modem, status);
+}
+
  static void telit_qss_notify(GAtResult *result, gpointer user_data)
  {
        struct ofono_modem *modem = user_data;
@@ -304,6 +335,12 @@ static void cfun_enable_cb(gboolean ok, GAtResult *result, 
gpointer user_data)
/* Enable sim state notification */
        g_at_chat_send(data->chat, "AT#QSS=2", none_prefix, NULL, NULL, NULL);
+
+       /* Query current sim state so that we don't need to wait a long
+        * time for a notification in case SIM state is already 'ready'
+        */
+       g_at_chat_send(data->chat, "AT#QSS?", qss_prefix,
+                               telit_qss_cb, modem, NULL);
  }
static int telit_enable(struct ofono_modem *modem)
@@ -334,12 +371,19 @@ static int telit_enable(struct ofono_modem *modem)
/*
         * Disable sim state notification so that we sure get a notification
-        * when we enable it again later and don't have to query it.
+        * when we enable it again later and don't have to query it.  For
+        * the HE910, this doesn't seem to work... querying appears to be
+        * necessary as there will be no notification unless there is an
+        * actual _change_ of state.
         */
        g_at_chat_send(data->chat, "AT#QSS=0", none_prefix, NULL, NULL, NULL);
- /* Set phone functionality */
-       g_at_chat_send(data->chat, "AT+CFUN=4", none_prefix,
+       /* Set phone functionality.
+        * When enabling the modem, we need to have the modem powered
+        * up until we've been able to get to post_sim state... for this
+        * reason, we start off with CFUN=4
+        */
+       g_at_chat_send(data->chat, "AT+CFUN=1", none_prefix,
                                cfun_enable_cb, modem, NULL);
return -EINPROGRESS;
@@ -565,6 +609,10 @@ static void telit_post_sim(struct ofono_modem *modem)
if (gprs && gc)
                ofono_gprs_add_context(gprs, gc);
+
+       if (!ofono_modem_get_online(modem))
+               g_at_chat_send(data->chat, "AT+CFUN=4", none_prefix,
+                               NULL, NULL, NULL);
  }
static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -588,6 +636,14 @@ static void telit_set_online(struct ofono_modem *modem, 
ofono_bool_t online,
g_at_chat_send(data->chat, command, none_prefix, set_online_cb,
                                                cbd, g_free);
+
+       if (online) {
+               /* Query current sim state in case it changed while we
+                * were offline and ignoring the QSS: 0 reports.
+                */
+               g_at_chat_send(data->chat, "AT#QSS?", qss_prefix,
+                                       telit_qss_cb, modem, NULL);
+       }
  }
static void telit_post_online(struct ofono_modem *modem)
Although this patch works for me, Is it a reasonable solution, or are there any better solutions for this problem?

Thanks

Mingli


--
Mingli Wu                       South Pole AB
Phone:  +46 8 56237100          Anderstorpsvägen 16
Mobile: +46 73 7628460          SE - 171 54 Solna
e-mail: [email protected]      www.southpole.se

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to