atmodem: packet switch bearer support
authorRémi Denis-Courmont <remi.denis-courmont@nokia.com>
Thu, 20 Jan 2011 08:37:52 +0000 (10:37 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 20 Jan 2011 11:10:32 +0000 (12:10 +0100)
drivers/atmodem/gprs.c

index defb154..daa3933 100644 (file)
@@ -200,6 +200,37 @@ static void xdatastat_notify(GAtResult *result, gpointer user_data)
        }
 }
 
+static void cpsb_notify(GAtResult *result, gpointer user_data)
+{
+       struct ofono_gprs *gprs = user_data;
+       GAtResultIter iter;
+       gint bearer;
+
+       g_at_result_iter_init(&iter, result);
+
+       if (!g_at_result_iter_next(&iter, "+CPSB:"))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, NULL))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, &bearer))
+               return;
+
+       ofono_gprs_bearer_notify(gprs, bearer);
+}
+
+static void cpsb_set_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       struct ofono_gprs *gprs = user_data;
+       struct gprs_data *gd = ofono_gprs_get_data(gprs);
+
+       if (!ok)
+               return;
+
+       g_at_chat_register(gd->chat, "+CPSB:", cpsb_notify, FALSE, gprs, NULL);
+}
+
 static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
 {
        struct ofono_gprs *gprs = user_data;
@@ -208,6 +239,8 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
        g_at_chat_register(gd->chat, "+CGEV:", cgev_notify, FALSE, gprs, NULL);
        g_at_chat_register(gd->chat, "+CGREG:", cgreg_notify,
                                        FALSE, gprs, NULL);
+       g_at_chat_send(gd->chat, "AT+CPSB=1", none_prefix,
+               cpsb_set_cb, gprs, NULL);
 
        switch (gd->vendor) {
        case OFONO_VENDOR_IFX: