summaryrefslogtreecommitdiffstats
path: root/plugins/huawei.c
diff options
context:
space:
mode:
authorMartin Xu <martin.xu@intel.com>2011-03-09 13:27:22 +0800
committerDenis Kenzior <denkenz@gmail.com>2011-03-15 13:54:59 -0500
commita9f75b3f23c5d0dd336a5a35cecb16cedc2c291e (patch)
tree6ad73f0583a523aeaeb6cf7d01983d433122c1f4 /plugins/huawei.c
parent6ca4d780db5f0da01967a8a1daeda6527538b9d0 (diff)
downloadofono-a9f75b3f23c5d0dd336a5a35cecb16cedc2c291e.tar.bz2
huawei: Fix huawei_disconnect function issue
huawei_disconnect is used to recovery the io and gprs context when io error happends, see commit 39382730d7758b093ca6271f4e9dea875fa04b3a However, io error not only happends at PPP disconnect, in theory it can happends at any situation. I also observed that it happens when modem go into offline mode at my Huawei EM770W modem. in this case, gprs should not be reopened.
Diffstat (limited to 'plugins/huawei.c')
-rw-r--r--plugins/huawei.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/plugins/huawei.c b/plugins/huawei.c
index cb200c8e..4051a934 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -469,10 +469,7 @@ static void huawei_disconnect(gpointer user_data)
struct ofono_modem *modem = user_data;
struct huawei_data *data = ofono_modem_get_data(modem);
- DBG("");
-
- if (data->gc)
- ofono_gprs_context_remove(data->gc);
+ DBG("data->gc %p", data->gc);
g_at_chat_unref(data->modem);
data->modem = NULL;
@@ -484,6 +481,12 @@ static void huawei_disconnect(gpointer user_data)
g_at_chat_set_disconnect_function(data->modem,
huawei_disconnect, modem);
+ /* gprs_context has been destructed and needs not reopen */
+ if (data->gc == NULL)
+ return;
+
+ ofono_gprs_context_remove(data->gc);
+
if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
ofono_info("Reopened GPRS context channel");
@@ -582,11 +585,27 @@ static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
- if (ok)
- CALLBACK_WITH_SUCCESS(cb, cbd->data);
- else
- CALLBACK_WITH_FAILURE(cb, cbd->data);
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+}
+
+static void set_offline_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ if (ok) {
+ struct huawei_data *data = cbd->user;
+
+ data->gc = NULL;
+ data->gprs = NULL;
+ }
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
}
static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online,
@@ -599,7 +618,11 @@ static void huawei_set_online(struct ofono_modem *modem, ofono_bool_t online,
DBG("modem %p %s", modem, online ? "online" : "offline");
- if (g_at_chat_send(chat, command, NULL, set_online_cb, cbd, g_free))
+ cbd->user = data;
+
+ if (g_at_chat_send(chat, command, NULL,
+ online ? set_online_cb : set_offline_cb,
+ cbd, g_free))
return;
g_free(cbd);