zte: 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.
This commit is contained in:
Marcel Holtmann 2011-07-26 13:14:29 +02:00
parent d81ca13097
commit 60736a6e06
1 changed files with 29 additions and 61 deletions

View File

@ -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 zte_data {
GAtChat *modem;
GAtChat *aux;
struct ofono_gprs *gprs;
struct ofono_gprs_context *gc;
};
static int zte_probe(struct ofono_modem *modem)
@ -80,9 +77,6 @@ static void zte_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 zte_disconnect(gpointer user_data)
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct zte_data *data = ofono_modem_get_data(modem);
DBG("");
ofono_gprs_context_remove(data->gc);
if (!ok) {
g_at_chat_unref(data->modem);
data->modem = NULL;
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,
zte_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;
DBG("");
g_at_chat_unref(data->aux);
data->aux = NULL;
}
ofono_modem_set_powered(modem, ok);
}
@ -171,9 +148,6 @@ static int zte_enable(struct ofono_modem *modem)
if (data->modem == NULL)
return -EINVAL;
g_at_chat_set_disconnect_function(data->modem,
zte_disconnect, modem);
data->aux = open_device(modem, "Aux", "Aux: ");
if (data->aux == NULL) {
g_at_chat_unref(data->modem);
@ -181,11 +155,11 @@ static int zte_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);
/* Direct transition 0 -> 4 leaves SIM hosed */
g_at_chat_send(data->aux, "AT+CFUN=1;+CFUN=4", none_prefix,
g_at_chat_send(data->aux, "AT+CFUN=1;+CFUN=4", NULL,
cfun_enable, modem, NULL);
return -EINPROGRESS;
@ -211,19 +185,16 @@ static int zte_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;
@ -243,22 +214,18 @@ static void zte_set_online(struct ofono_modem *modem, ofono_bool_t online,
ofono_modem_online_cb_t cb, void *user_data)
{
struct zte_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 zte_pre_sim(struct ofono_modem *modem)
@ -270,7 +237,7 @@ static void zte_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);
@ -279,6 +246,8 @@ static void zte_pre_sim(struct ofono_modem *modem)
static void zte_post_sim(struct ofono_modem *modem)
{
struct zte_data *data = ofono_modem_get_data(modem);
struct ofono_gprs *gprs;
struct ofono_gprs_context *gc;
DBG("%p", modem);
@ -287,12 +256,11 @@ static void zte_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);
gprs = ofono_gprs_create(modem, 0, "atmodem", data->aux);
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 void zte_post_online(struct ofono_modem *modem)