diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-10-27 02:02:41 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-10-27 02:02:41 +0200 |
commit | 23f2706dd009e263c7ccf73b5a6c0efedc787e9d (patch) | |
tree | bc0ffb65526e905435633e55fa652c888cbc1406 /plugins/mbm.c | |
parent | 3c2d59978b6bdc0b0c0115c81acbbbbac1b9e61a (diff) | |
download | ofono-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.c | 73 |
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 = { |