summaryrefslogtreecommitdiffstats
path: root/plugins/speedup.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2011-07-26 13:32:46 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-07-26 13:32:46 +0200
commitc6e25f65fc76fb67c5fa7911dad0d50662918dfd (patch)
treebe3581d8b68cf11258251d8ebe37dc9728b36b27 /plugins/speedup.c
parentb7e8db6dab7c838a8d2ac9578b1e583ac98f4358 (diff)
downloadofono-c6e25f65fc76fb67c5fa7911dad0d50662918dfd.tar.bz2
speedup: Use AT&C0 to disable data carrier detect
When the DCD is disabled the modem does not hangup anymore after the data connection. So all workarounds due to TTY hangup can be removed.
Diffstat (limited to 'plugins/speedup.c')
-rw-r--r--plugins/speedup.c94
1 files changed, 31 insertions, 63 deletions
diff --git a/plugins/speedup.c b/plugins/speedup.c
index 7e89b6f1..7f42b55c 100644
--- a/plugins/speedup.c
+++ b/plugins/speedup.c
@@ -23,7 +23,6 @@
#include <config.h>
#endif
-#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
@@ -53,8 +52,6 @@ static const char *none_prefix[] = { NULL };
struct speedup_data {
GAtChat *modem;
GAtChat *aux;
- struct ofono_gprs *gprs;
- struct ofono_gprs_context *gc;
};
static int speedup_probe(struct ofono_modem *modem)
@@ -80,9 +77,6 @@ static void speedup_remove(struct ofono_modem *modem)
ofono_modem_set_data(modem, NULL);
- g_at_chat_unref(data->modem);
- g_at_chat_unref(data->aux);
-
g_free(data);
}
@@ -97,8 +91,8 @@ static GAtChat *open_device(struct ofono_modem *modem,
const char *key, char *debug)
{
const char *device;
- GAtSyntax *syntax;
GIOChannel *channel;
+ GAtSyntax *syntax;
GAtChat *chat;
device = ofono_modem_get_string(modem, key);
@@ -114,6 +108,7 @@ static GAtChat *open_device(struct ofono_modem *modem,
syntax = g_at_syntax_new_gsm_permissive();
chat = g_at_chat_new(channel, syntax);
g_at_syntax_unref(syntax);
+
g_io_channel_unref(channel);
if (chat == NULL)
@@ -125,38 +120,20 @@ static GAtChat *open_device(struct ofono_modem *modem,
return chat;
}
-static void speedup_disconnect(gpointer user_data)
+static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct speedup_data *data = ofono_modem_get_data(modem);
DBG("");
- 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,
- speedup_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->aux);
+ data->aux = NULL;
+ }
ofono_modem_set_powered(modem, ok);
}
@@ -171,9 +148,6 @@ static int speedup_enable(struct ofono_modem *modem)
if (data->modem == NULL)
return -EINVAL;
- g_at_chat_set_disconnect_function(data->modem,
- speedup_disconnect, modem);
-
data->aux = open_device(modem, "Aux", "Aux: ");
if (data->aux == NULL) {
g_at_chat_unref(data->modem);
@@ -181,10 +155,10 @@ static int speedup_enable(struct ofono_modem *modem)
return -EIO;
}
- g_at_chat_send(data->aux, "ATE0 +CMEE=1", none_prefix,
- NULL, NULL, NULL);
+ g_at_chat_send(data->modem, "ATE0 &C0 +CMEE=1", NULL, NULL, NULL, NULL);
+ g_at_chat_send(data->aux, "ATE0 &C0 +CMEE=1", NULL, NULL, NULL, NULL);
- g_at_chat_send(data->aux, "AT+CFUN=1", none_prefix,
+ g_at_chat_send(data->aux, "AT+CFUN=1", NULL,
cfun_enable, modem, NULL);
return -EINPROGRESS;
@@ -210,19 +184,16 @@ static int speedup_disable(struct ofono_modem *modem)
DBG("%p", modem);
- if (data->modem) {
- g_at_chat_cancel_all(data->modem);
- g_at_chat_unregister_all(data->modem);
- g_at_chat_unref(data->modem);
- data->modem = NULL;
- }
+ g_at_chat_cancel_all(data->modem);
+ g_at_chat_unregister_all(data->modem);
- if (data->aux == NULL)
- return 0;
+ g_at_chat_unref(data->modem);
+ data->modem = NULL;
g_at_chat_cancel_all(data->aux);
g_at_chat_unregister_all(data->aux);
- g_at_chat_send(data->aux, "AT+CFUN=0", none_prefix,
+
+ g_at_chat_send(data->aux, "AT+CFUN=0", NULL,
cfun_disable, modem, NULL);
return -EINPROGRESS;
@@ -242,22 +213,18 @@ static void speedup_set_online(struct ofono_modem *modem, ofono_bool_t online,
ofono_modem_online_cb_t cb, void *user_data)
{
struct speedup_data *data = ofono_modem_get_data(modem);
- GAtChat *chat = data->aux;
struct cb_data *cbd = cb_data_new(cb, user_data);
char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4";
DBG("modem %p %s", modem, online ? "online" : "offline");
- if (chat == NULL)
- goto error;
-
- if (g_at_chat_send(chat, command, NULL, set_online_cb, cbd, g_free))
+ if (g_at_chat_send(data->aux, command, none_prefix,
+ set_online_cb, cbd, g_free) > 0)
return;
-error:
- g_free(cbd);
-
CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+ g_free(cbd);
}
static void speedup_pre_sim(struct ofono_modem *modem)
@@ -269,7 +236,7 @@ static void speedup_pre_sim(struct ofono_modem *modem)
ofono_devinfo_create(modem, 0, "atmodem", data->aux);
sim = ofono_sim_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
- "atmodem", data->aux);
+ "atmodem", data->aux);
if (sim)
ofono_sim_inserted_notify(sim, TRUE);
@@ -278,6 +245,8 @@ static void speedup_pre_sim(struct ofono_modem *modem)
static void speedup_post_sim(struct ofono_modem *modem)
{
struct speedup_data *data = ofono_modem_get_data(modem);
+ struct ofono_gprs *gprs;
+ struct ofono_gprs_context *gc;
DBG("%p", modem);
@@ -286,12 +255,11 @@ static void speedup_post_sim(struct ofono_modem *modem)
ofono_sms_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
"atmodem", data->aux);
- data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->aux);
-
- data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+ gprs = ofono_gprs_create(modem, 0, "atmodem", data->aux);
+ 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 void speedup_post_online(struct ofono_modem *modem)
@@ -300,7 +268,7 @@ static void speedup_post_online(struct ofono_modem *modem)
DBG("%p", modem);
- ofono_netreg_create(modem, OFONO_VENDOR_ZTE, "atmodem", data->aux);
+ ofono_netreg_create(modem, 0, "atmodem", data->aux);
ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
"atmodem", data->aux);
@@ -330,5 +298,5 @@ static void speedup_exit(void)
ofono_modem_driver_unregister(&speedup_driver);
}
-OFONO_PLUGIN_DEFINE(speedup, "SpeedUp modem driver", VERSION,
+OFONO_PLUGIN_DEFINE(speedup, "Speed Up modem driver", VERSION,
OFONO_PLUGIN_PRIORITY_DEFAULT, speedup_init, speedup_exit)