gprs: data bearer for telit with PSNT
authorAugust Mayer <august.mayer@hale.at>
Thu, 16 Aug 2012 08:11:16 +0000 (10:11 +0200)
committerDenis Kenzior <denkenz@gmail.com>
Thu, 16 Aug 2012 06:10:56 +0000 (01:10 -0500)
Telit neither supports '+CPSB' nor reports the data bearer through
'+CGREG'. It has its own +PSNT command.

drivers/atmodem/gprs.c

index 65a8b7b..3005867 100644 (file)
@@ -247,6 +247,41 @@ static void huawei_mode_notify(GAtResult *result, gpointer user_data)
        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;
+
+       switch (nt) {
+       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;
+       }
+
+       ofono_gprs_bearer_notify(gprs, bearer);
+}
+
 static void cpsb_notify(GAtResult *result, gpointer user_data)
 {
        struct ofono_gprs *gprs = user_data;
@@ -281,6 +316,11 @@ 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);
        default:
                g_at_chat_register(gd->chat, "+CPSB:", cpsb_notify,
                                                FALSE, gprs, NULL);