Hi Caiwen,
(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
what does this comment mean. We should just not try the NDIS part of
Huawei until I get clear specs on how to use the NDIS port. Even the
basic AT^DHCP handling of this is unreliable.
---
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;
+ }
Please do not nest here.
if (data->modem == NULL) {
if (data->reopen_timeout > 0)
return;
data->reopen_timeout = ...
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) {
Why this change?
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);
I do not understand this change.
Regards
Marcel