summaryrefslogtreecommitdiff
path: root/plugins/mbm.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-10-27 02:02:41 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-10-27 02:02:41 +0200
commit23f2706dd009e263c7ccf73b5a6c0efedc787e9d (patch)
treebc0ffb65526e905435633e55fa652c888cbc1406 /plugins/mbm.c
parent3c2d59978b6bdc0b0c0115c81acbbbbac1b9e61a (diff)
downloadofono-23f2706dd009e263c7ccf73b5a6c0efedc787e9d.tar.gz
mbm: Handle TTY disconnect for PPP based GPRS context
The Ericsson MBM modems also hangup the TTY when disconnecting PPP and in that case the TTY needs to be re-opened. In addition it seems that the TTY is actually blocked until the context is fully brought down, so also a delay is required.
Diffstat (limited to 'plugins/mbm.c')
-rw-r--r--plugins/mbm.c73
1 files changed, 66 insertions, 7 deletions
diff --git a/plugins/mbm.c b/plugins/mbm.c
index 57902e52..118e999d 100644
--- a/plugins/mbm.c
+++ b/plugins/mbm.c
@@ -64,6 +64,9 @@ struct mbm_data {
guint cpin_poll_source;
guint cpin_poll_count;
gboolean have_sim;
+ struct ofono_gprs *gprs;
+ struct ofono_gprs_context *gc;
+ guint reopen_source;
enum mbm_variant variant;
};
@@ -294,6 +297,55 @@ static GAtChat *create_port(const char *device)
return chat;
}
+static void mbm_disconnect(gpointer user_data);
+
+static gboolean reopen_callback(gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct mbm_data *data = ofono_modem_get_data(modem);
+ const char *data_dev;
+
+ data->reopen_source = 0;
+
+ data_dev = ofono_modem_get_string(modem, "DataDevice");
+
+ data->data_port = create_port(data_dev);
+ if (data->data_port == NULL)
+ return FALSE;
+
+ if (getenv("OFONO_AT_DEBUG"))
+ g_at_chat_set_debug(data->data_port, mbm_debug, "Data: ");
+
+ g_at_chat_set_disconnect_function(data->data_port,
+ mbm_disconnect, modem);
+
+ ofono_info("Reopened GPRS context channel");
+
+ data->gc = ofono_gprs_context_create(modem, 0,
+ "atmodem", data->data_port);
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
+
+ return FALSE;
+}
+
+static void mbm_disconnect(gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct mbm_data *data = ofono_modem_get_data(modem);
+
+ DBG("");
+
+ if (data->gc)
+ ofono_gprs_context_remove(data->gc);
+
+ g_at_chat_unref(data->data_port);
+ data->data_port = NULL;
+
+ /* Waiting for the +CGEV: ME DEACT might also work */
+ data->reopen_source = g_timeout_add_seconds(1, reopen_callback, modem);
+}
+
static int mbm_enable(struct ofono_modem *modem)
{
struct mbm_data *data = ofono_modem_get_data(modem);
@@ -328,6 +380,9 @@ static int mbm_enable(struct ofono_modem *modem)
if (getenv("OFONO_AT_DEBUG"))
g_at_chat_set_debug(data->data_port, mbm_debug, "Data: ");
+ g_at_chat_set_disconnect_function(data->data_port,
+ mbm_disconnect, modem);
+
g_at_chat_register(data->modem_port, "*EMRDY:", emrdy_notifier,
FALSE, modem, NULL);
@@ -367,6 +422,11 @@ static int mbm_disable(struct ofono_modem *modem)
DBG("%p", modem);
+ if (data->reopen_source > 0) {
+ g_source_remove(data->reopen_source);
+ data->reopen_source = 0;
+ }
+
if (!data->modem_port)
return 0;
@@ -438,7 +498,6 @@ static void mbm_post_sim(struct ofono_modem *modem)
static void mbm_post_online(struct ofono_modem *modem)
{
struct mbm_data *data = ofono_modem_get_data(modem);
- struct ofono_gprs *gprs;
struct ofono_gprs_context *gc;
DBG("%p", modem);
@@ -459,20 +518,20 @@ static void mbm_post_online(struct ofono_modem *modem)
ofono_ussd_create(modem, 0, "atmodem", data->modem_port);
- gprs = ofono_gprs_create(modem, OFONO_VENDOR_MBM,
+ data->gprs = ofono_gprs_create(modem, OFONO_VENDOR_MBM,
"atmodem", data->modem_port);
- if (!gprs)
+ if (!data->gprs)
return;
gc = ofono_gprs_context_create(modem, 0,
"mbmmodem", data->modem_port);
if (gc)
- ofono_gprs_add_context(gprs, gc);
+ ofono_gprs_add_context(data->gprs, gc);
- gc = ofono_gprs_context_create(modem, 0,
+ data->gc = ofono_gprs_context_create(modem, 0,
"atmodem", data->data_port);
- if (gc)
- ofono_gprs_add_context(gprs, gc);
+ if (data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
}
static struct ofono_modem_driver mbm_driver = {