From: August Mayer <[email protected]>

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)
+{
+       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);
+               break;
        default:
                g_at_chat_register(gd->chat, "+CPSB:", cpsb_notify,
                                                FALSE, gprs, NULL);
-- 
1.7.7.6


--
Scanned by MailScanner.

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to