(1) Sometimes when open the data device, it may fail. If open the data device 
failed,
retry once one second later.

(2) Fix Huawei NDIS modem gprs doesn't work issue

---
 plugins/huawei.c |   43 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/plugins/huawei.c b/plugins/huawei.c
index e791718..6b2caa4 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -80,6 +80,7 @@ struct huawei_data {
        gboolean ndis;
        guint sim_poll_timeout;
        guint sim_poll_count;
+       guint reopen_timeout;
 };
 
 #define MAX_SIM_POLL_COUNT 5
@@ -107,6 +108,11 @@ static void huawei_remove(struct ofono_modem *modem)
 
        DBG("%p", modem);
 
+       if (data->reopen_timeout > 0) {
+               g_source_remove(data->reopen_timeout);
+               data->reopen_timeout = 0;
+       }
+
        ofono_modem_set_data(modem, NULL);
 
        if (data->modem)
@@ -465,6 +471,20 @@ static GAtChat *open_device(struct ofono_modem *modem,
        return chat;
 }
 
+static void huawei_disconnect(gpointer user_data);
+
+static gboolean reopen_callback(gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct huawei_data *data = ofono_modem_get_data(modem);
+
+       huawei_disconnect(user_data);
+
+       data->reopen_timeout = 0;
+
+       return FALSE;
+}
+
 static void huawei_disconnect(gpointer user_data)
 {
        struct ofono_modem *modem = user_data;
@@ -476,8 +496,17 @@ static void huawei_disconnect(gpointer user_data)
        data->modem = NULL;
 
        data->modem = open_device(modem, "Modem", "Modem: ");
-       if (data->modem == NULL)
+       /* retry once if failed */
+       if (data->modem == NULL) {
+               if (data->reopen_timeout == 0) {
+                       data->reopen_timeout =
+                               g_timeout_add_seconds(1, reopen_callback,
+                                       modem);
+
+                       ofono_debug("open device failed, try to reopen it.");
+               }
                return;
+       }
 
        g_at_chat_set_disconnect_function(data->modem,
                                                huawei_disconnect, modem);
@@ -559,6 +588,11 @@ static int huawei_disable(struct ofono_modem *modem)
 
        DBG("%p", modem);
 
+       if (data->reopen_timeout > 0) {
+               g_source_remove(data->reopen_timeout);
+               data->reopen_timeout = 0;
+       }
+
        if (data->sim_poll_timeout > 0) {
                g_source_remove(data->sim_poll_timeout);
                data->sim_poll_timeout = 0;
@@ -682,16 +716,15 @@ static void huawei_post_online(struct ofono_modem *modem)
        ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
                                                "atmodem", data->pcui);
 
-       if ((data->sim_state == HUAWEI_SIM_STATE_VALID ||
-                       data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) &&
-                       data->modem != NULL) {
+       if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
+                       data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
                data->gprs = ofono_gprs_create(modem, OFONO_VENDOR_HUAWEI,
                                                "atmodem", data->pcui);
 
                if (data->ndis == TRUE)
                        data->gc = ofono_gprs_context_create(modem, 0,
                                                "huaweimodem", data->pcui);
-               else
+               else if (data->modem != NULL)
                        data->gc = ofono_gprs_context_create(modem, 0,
                                                "atmodem", data->modem);
 
-- 
1.7.5

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

Reply via email to