---
 drivers/cdmamodem/connman.c |   45 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/drivers/cdmamodem/connman.c b/drivers/cdmamodem/connman.c
index ec17e96..b5f3d29 100644
--- a/drivers/cdmamodem/connman.c
+++ b/drivers/cdmamodem/connman.c
@@ -41,6 +41,7 @@
 #include "gatppp.h"
 
 #include "cdmamodem.h"
+#include "drivers/atmodem/vendor.h"
 
 #define TUN_SYSFS_DIR "/sys/devices/virtual/misc/tun"
 
@@ -66,6 +67,7 @@ struct connman_data {
                ofono_cdma_connman_up_cb_t up_cb;       /* Up callback */
        };
        void *cb_data;                                  /* Callback data */
+       unsigned int vendor;
 };
 
 static void ppp_debug(const char *str, void *data)
@@ -220,9 +222,42 @@ static void cdma_connman_deactivate(struct 
ofono_cdma_connman *cm,
        g_at_ppp_shutdown(cd->ppp);
 }
 
+static void huawei_mode_notify(GAtResult *result, gpointer user_data)
+{
+       struct ofono_cdma_connman *cm = user_data;
+       GAtResultIter iter;
+       int mode;
+       gint bearer;
+
+       g_at_result_iter_init(&iter, result);
+
+       if (!g_at_result_iter_next(&iter, "^MODE:"))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, &mode))
+               return;
+
+       switch (mode) {
+       case 2:
+               bearer = 1;     /* CDMA 1x mode */
+               break;
+       case 4:
+               bearer = 2;     /* CDMA EV-DO */
+               break;
+       case 8:
+               bearer = 3;     /* CDMA SVDO */
+       default:
+               bearer = 0;
+               break;
+       }
+
+       ofono_cdma_connman_bearer_notify(cm, bearer);
+}
+
 static void at_c0_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
        struct ofono_cdma_connman *cm = user_data;
+       struct connman_data *cd = ofono_cdma_connman_get_data(cm);
 
        DBG("ok %d", ok);
 
@@ -232,6 +267,15 @@ static void at_c0_cb(gboolean ok, GAtResult *result, 
gpointer user_data)
                return;
        }
 
+       switch (cd->vendor) {
+       case OFONO_VENDOR_HUAWEI:
+               g_at_chat_register(cd->chat, "^MODE:", huawei_mode_notify,
+                                               FALSE, cm, NULL);
+               break;
+       default:
+               break;
+       }
+
        ofono_cdma_connman_register(cm);
 }
 
@@ -254,6 +298,7 @@ static int cdma_connman_probe(struct ofono_cdma_connman *cm,
                return -ENOMEM;
 
        cd->chat = g_at_chat_clone(chat);
+       cd->vendor = vendor;
 
        ofono_cdma_connman_set_data(cm, cd);
 
-- 
1.7.1

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

Reply via email to