summaryrefslogtreecommitdiffstats
path: root/plugins/huawei.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/huawei.c')
-rw-r--r--plugins/huawei.c86
1 files changed, 62 insertions, 24 deletions
diff --git a/plugins/huawei.c b/plugins/huawei.c
index e2dfd1e4..ae0139ae 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -56,6 +56,8 @@ struct huawei_data {
GAtChat *pcui;
struct ofono_sim *sim;
gint sim_state;
+ struct ofono_gprs *gprs;
+ struct ofono_gprs_context *gc;
};
static int huawei_probe(struct ofono_modem *modem)
@@ -196,42 +198,80 @@ static GAtChat *create_port(const char *device)
return chat;
}
-static int huawei_enable(struct ofono_modem *modem)
+static GAtChat *open_device(struct ofono_modem *modem,
+ const char *key, char *debug)
{
struct huawei_data *data = ofono_modem_get_data(modem);
- const char *modem_device, *pcui_device;
+ const char *device;
+ GAtChat *chat;
- DBG("%p", modem);
+ device = ofono_modem_get_string(modem, key);
+ if (device == NULL)
+ return NULL;
- modem_device = ofono_modem_get_string(modem, "Modem");
- pcui_device = ofono_modem_get_string(modem, "Pcui");
+ DBG("%s %s", key, device);
- if (modem_device == NULL || pcui_device == NULL)
- return -EINVAL;
+ chat = create_port(device);
+ if (chat == NULL)
+ return NULL;
+
+ g_at_chat_add_terminator(chat, "COMMAND NOT SUPPORT", -1, FALSE);
+
+ if (getenv("OFONO_AT_DEBUG"))
+ g_at_chat_set_debug(chat, huawei_debug, debug);
+
+ return chat;
+}
+
+static void huawei_disconnect(gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct huawei_data *data = ofono_modem_get_data(modem);
+
+ DBG("");
+
+ ofono_gprs_context_remove(data->gc);
- data->modem = create_port(modem_device);
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
+ data->modem = open_device(modem, "Modem", "Modem:");
if (data->modem == NULL)
- return -EIO;
+ return;
- g_at_chat_add_terminator(data->modem, "COMMAND NOT SUPPORT", -1, FALSE);
+ g_at_chat_set_disconnect_function(data->modem,
+ huawei_disconnect, modem);
- if (getenv("OFONO_AT_DEBUG"))
- g_at_chat_set_debug(data->modem, huawei_debug, "Modem:");
+ ofono_info("Reopened GPRS context channel");
+
+ data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+ data->modem);
+
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
+}
+
+static int huawei_enable(struct ofono_modem *modem)
+{
+ struct huawei_data *data = ofono_modem_get_data(modem);
+ const char *modem_device, *pcui_device;
+
+ DBG("%p", modem);
+
+ data->modem = open_device(modem, "Modem", "Modem:");
+ if (data->modem == NULL)
+ return -EINVAL;
- data->pcui = create_port(pcui_device);
+ g_at_chat_set_disconnect_function(data->modem,
+ huawei_disconnect, modem);
+ data->pcui = open_device(modem, "Pcui", "Pcui:");
if (data->pcui == NULL) {
g_at_chat_unref(data->modem);
data->modem = NULL;
return -EIO;
}
- g_at_chat_add_terminator(data->pcui, "COMMAND NOT SUPPORT", -1, FALSE);
-
- if (getenv("OFONO_AT_DEBUG"))
- g_at_chat_set_debug(data->pcui, huawei_debug, "Pcui:");
-
data->sim_state = 0;
g_at_chat_send(data->pcui, "ATE0", none_prefix, NULL, NULL, NULL);
@@ -293,9 +333,7 @@ static void huawei_pre_sim(struct ofono_modem *modem)
static void huawei_post_sim(struct ofono_modem *modem)
{
struct huawei_data *data = ofono_modem_get_data(modem);
- struct ofono_gprs_context *gc;
struct ofono_netreg *netreg;
- struct ofono_gprs *gprs;
DBG("%p", modem);
@@ -307,11 +345,11 @@ static void huawei_post_sim(struct ofono_modem *modem)
data->pcui);
ofono_ussd_create(modem, 0, "atmodem", data->pcui);
- gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
- gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+ data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
+ data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
- if (gprs && gc)
- ofono_gprs_add_context(gprs, gc);
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
}
static struct ofono_modem_driver huawei_driver = {