summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2011-07-25 03:43:07 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-07-25 03:43:07 +0200
commita1baf7aa824c3e44f0880c110c1cdf7637368afe (patch)
tree91d2b4727562f8ea3c4e1a28d0c83023e7148c36 /plugins
parent1d303e3d38f12c1dcf310c9e1aa0541e35b72066 (diff)
downloadofono-a1baf7aa824c3e44f0880c110c1cdf7637368afe.tar.bz2
nokia: Use AT&C0 to disable data carrier detect
When the DCD is disabled the modem does not hangup anymore after the data connection. This allows for simpler connection handling and it allows to remove all TTY hangup work-arounds.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/nokia.c60
1 files changed, 20 insertions, 40 deletions
diff --git a/plugins/nokia.c b/plugins/nokia.c
index 6f857943..889f28ef 100644
--- a/plugins/nokia.c
+++ b/plugins/nokia.c
@@ -51,8 +51,6 @@ static const char *none_prefix[] = { NULL };
struct nokia_data {
GAtChat *modem;
GAtChat *control;
- struct ofono_gprs *gprs;
- struct ofono_gprs_context *gc;
};
static int nokia_probe(struct ofono_modem *modem)
@@ -78,9 +76,6 @@ static void nokia_remove(struct ofono_modem *modem)
ofono_modem_set_data(modem, NULL);
- g_at_chat_unref(data->modem);
- g_at_chat_unref(data->control);
-
g_free(data);
}
@@ -123,39 +118,20 @@ static GAtChat *open_device(struct ofono_modem *modem,
return chat;
}
-static void nokia_disconnect(gpointer user_data)
+static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct nokia_data *data = ofono_modem_get_data(modem);
DBG("");
- if (data->gc)
- ofono_gprs_context_remove(data->gc);
-
- g_at_chat_unref(data->modem);
- data->modem = NULL;
-
- data->modem = open_device(modem, "Modem", "Modem: ");
- if (data->modem == NULL)
- return;
-
- g_at_chat_set_disconnect_function(data->modem,
- nokia_disconnect, 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 void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
-{
- struct ofono_modem *modem = user_data;
+ if (!ok) {
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
- DBG("");
+ g_at_chat_unref(data->control);
+ data->control = NULL;
+ }
ofono_modem_set_powered(modem, ok);
}
@@ -170,9 +146,6 @@ static int nokia_enable(struct ofono_modem *modem)
if (data->modem == NULL)
return -EINVAL;
- g_at_chat_set_disconnect_function(data->modem,
- nokia_disconnect, modem);
-
data->control = open_device(modem, "Control", "Control: ");
if (data->control == NULL) {
g_at_chat_unref(data->modem);
@@ -180,7 +153,10 @@ static int nokia_enable(struct ofono_modem *modem)
return -EIO;
}
- g_at_chat_send(data->control, "ATE0 +CMEE=1", none_prefix,
+ g_at_chat_send(data->modem, "ATE0 &C0 +CMEE=1", NULL,
+ NULL, NULL, NULL);
+
+ g_at_chat_send(data->control, "ATE0 &C0 +CMEE=1", NULL,
NULL, NULL, NULL);
g_at_chat_send(data->control, "AT+CFUN=1", none_prefix,
@@ -196,6 +172,9 @@ static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
DBG("");
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
+
g_at_chat_unref(data->control);
data->control = NULL;
@@ -244,6 +223,8 @@ static void nokia_pre_sim(struct ofono_modem *modem)
static void nokia_post_sim(struct ofono_modem *modem)
{
struct nokia_data *data = ofono_modem_get_data(modem);
+ struct ofono_gprs *gprs;
+ struct ofono_gprs_context *gc;
DBG("%p", modem);
@@ -256,13 +237,12 @@ static void nokia_post_sim(struct ofono_modem *modem)
"atmodem", data->control);
ofono_phonebook_create(modem, 0, "atmodem", data->control);
- data->gprs = ofono_gprs_create(modem, OFONO_VENDOR_NOKIA,
+ gprs = ofono_gprs_create(modem, OFONO_VENDOR_NOKIA,
"atmodem", data->control);
+ gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
- data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
-
- if (data->gprs && data->gc)
- ofono_gprs_add_context(data->gprs, data->gc);
+ if (gprs && gc)
+ ofono_gprs_add_context(gprs, gc);
}
static struct ofono_modem_driver nokia_driver = {