Hi Christopher, On 08/13/2012 08:23 AM, Christopher Vogl wrote: > From: August Mayer > > Telit neither supports '+CPSB' nor reports the data bearer through > '+CGREG'. It has its own +PSNT command. > --- > drivers/atmodem/gprs.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 76 insertions(+), 0 deletions(-) > > diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c > index f87548e..ffb8dfe 100644 > --- a/drivers/atmodem/gprs.c > +++ b/drivers/atmodem/gprs.c > @@ -44,6 +44,7 @@ > > static const char *cgreg_prefix[] = { "+CGREG:", NULL }; > static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL }; > +static const char *psnt_prefix[] = { "#PSNT:", NULL }; > static const char *none_prefix[] = { NULL }; > > struct gprs_data { > @@ -247,6 +248,73 @@ static void huawei_mode_notify(GAtResult *result, gpointer user_data) > ofono_gprs_bearer_notify(gprs, bearer); > } > > +static gint psnt_to_bearer(gint network_type) > +{ > + gint bearer; > + > + switch (network_type) { > + case 0: > + bearer = 1; /* GPRS */ > + break; > + case 1: > + bearer = 2; /* EDGE */ > + break; > + case 2: > + bearer = 3; /* UMTS */ > + break; > + case 3: > + bearer = 5; /* HSDPA */ > + break; > + default: > + bearer = 0; > + break; > + } > + > + return bearer; > +} > + > +static void at_psnt_test_cb(gboolean ok, GAtResult *result, > + gpointer user_data) Just a minor nitpick, but we usually call this '_query'. > +{ > + struct ofono_gprs *gprs = user_data; > + GAtResultIter iter; > + gint nt, bearer; > + > + g_at_result_iter_init(&iter, result); > + > + if (!g_at_result_iter_next(&iter, "#PSNT:")) > + return; > + > + if (!g_at_result_iter_next_number(&iter, NULL)) > + return; > + > + if (!g_at_result_iter_next_number(&iter,&nt)) > + return; > + > + bearer = psnt_to_bearer(nt); > + > + ofono_gprs_bearer_notify(gprs, bearer); > +} > + > +static void telit_mode_notify(GAtResult *result, gpointer user_data) > +{ > + struct ofono_gprs *gprs = user_data; > + GAtResultIter iter; > + gint nt, bearer; > + > + g_at_result_iter_init(&iter, result); > + > + if (!g_at_result_iter_next(&iter, "#PSNT:")) > + return; > + > + if (!g_at_result_iter_next_number(&iter,&nt)) > + return; > + > + bearer = psnt_to_bearer(nt); > + > + ofono_gprs_bearer_notify(gprs, bearer); > +} > + > static void cpsb_notify(GAtResult *result, gpointer user_data) > { > struct ofono_gprs *gprs = user_data; > @@ -281,6 +349,14 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data) > g_at_chat_register(gd->chat, "^MODE:", huawei_mode_notify, > FALSE, gprs, NULL); > break; > + case OFONO_VENDOR_TELIT: > + g_at_chat_register(gd->chat, "#PSNT:", telit_mode_notify, > + FALSE, gprs, NULL); > + g_at_chat_send(gd->chat, "AT#PSNT=1", none_prefix, > + NULL, NULL, NULL); > + g_at_chat_send(gd->chat, "AT#PSNT?", psnt_prefix, > + at_psnt_test_cb, gprs, NULL); Do you really need to query this? In theory if we are turning off auto-attach, we should never be in a state where the bearer should be queried. > + break; > default: > g_at_chat_register(gd->chat, "+CPSB:", cpsb_notify, > FALSE, gprs, NULL); Regards, -Denis