diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-06-06 13:12:37 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-06-06 13:12:37 -0700 |
commit | 45bf4cf396ddfdfde356159d03e887ffea705eaa (patch) | |
tree | 4dcc6d510c1aab68ca950737911a33ebe4aa2171 | |
parent | 197d2c08bde4c7ac6c9ca39cd073028bc2ba1caf (diff) | |
download | ofono-45bf4cf396ddfdfde356159d03e887ffea705eaa.tar.bz2 |
Add support for handling CNTI=0 request with Novatel devices
-rw-r--r-- | drivers/atmodem/gprs.c | 11 | ||||
-rw-r--r-- | drivers/atmodem/network-registration.c | 61 |
2 files changed, 61 insertions, 11 deletions
diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c index 052417a5..bf82d066 100644 --- a/drivers/atmodem/gprs.c +++ b/drivers/atmodem/gprs.c @@ -120,6 +120,17 @@ static void at_gprs_registration_status(struct ofono_gprs *gprs, cbd->user = gd; + switch (gd->vendor) { + case OFONO_VENDOR_NOVATEL: + /* + * Send $CNTI=0 to find out the current tech, it will be + * intercepted in nw_cnti_notify in network registration + */ + g_at_chat_send(gd->chat, "AT$CNTI=0", none_prefix, + NULL, NULL, NULL); + break; + } + if (g_at_chat_send(gd->chat, "AT+CGREG?", cgreg_prefix, at_cgreg_cb, cbd, g_free) > 0) return; diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c index dc84e98b..af9ef4cb 100644 --- a/drivers/atmodem/network-registration.c +++ b/drivers/atmodem/network-registration.c @@ -108,13 +108,24 @@ static void at_registration_status(struct ofono_netreg *netreg, cbd->user = nd; - /* - * Send *ERINFO to find out the current tech, it will be intercepted - * in mbm_erinfo_notify - */ - if (nd->vendor == OFONO_VENDOR_MBM) + switch (nd->vendor) { + case OFONO_VENDOR_MBM: + /* + * Send *ERINFO to find out the current tech, it will be + * intercepted in mbm_erinfo_notify + */ g_at_chat_send(nd->chat, "AT*ERINFO?", none_prefix, NULL, NULL, NULL); + break; + case OFONO_VENDOR_NOVATEL: + /* + * Send $CNTI=0 to find out the current tech, it will be + * intercepted in nw_cnti_notify + */ + g_at_chat_send(nd->chat, "AT$CNTI=0", none_prefix, + NULL, NULL, NULL); + break; + } if (g_at_chat_send(nd->chat, "AT+CREG?", creg_prefix, at_creg_cb, cbd, g_free) > 0) @@ -744,6 +755,31 @@ static void mbm_erinfo_notify(GAtResult *result, gpointer user_data) } } +static void nw_cnti_notify(GAtResult *result, gpointer user_data) +{ + //struct ofono_netreg *netreg = user_data; + //struct netreg_data *nd = ofono_netreg_get_data(netreg); + GAtResultIter iter; + const char *tech; + int option; + + g_at_result_iter_init(&iter, result); + + if (g_at_result_iter_next(&iter, "$CNTI:") == FALSE) + return; + + if (g_at_result_iter_next_number(&iter, &option) == FALSE) + return; + + if (option != 0) + return; + + if (g_at_result_iter_next_unquoted_string(&iter, &tech) == FALSE) + return; + + ofono_info("CNTI: %s", tech); +} + static void creg_notify(GAtResult *result, gpointer user_data) { struct ofono_netreg *netreg = user_data; @@ -847,12 +883,6 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_chat_register(nd->chat, "%CSQ:", calypso_csq_notify, FALSE, netreg, NULL); break; - case OFONO_VENDOR_NOVATEL: - g_at_chat_send(nd->chat, "AT$NWCSQ", none_prefix, - NULL, NULL, NULL); - g_at_chat_send(nd->chat, "AT$CNTI=0", none_prefix, - NULL, NULL, NULL); - break; case OFONO_VENDOR_OPTION_HSO: g_at_chat_send(nd->chat, "AT_OSSYS=1", none_prefix, NULL, NULL, NULL); @@ -905,6 +935,15 @@ static void at_creg_set_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_chat_send(nd->chat, "AT+CIND=?", cind_prefix, cind_support_cb, netreg, NULL); return; + case OFONO_VENDOR_NOVATEL: + /* + * Novatel doesn't support unsolicited notifications + * of technology changes, but register a handle for + * CNTI so we get notified by any query. + */ + g_at_chat_register(nd->chat, "$CNTI:", nw_cnti_notify, + FALSE, netreg, NULL); + break; case OFONO_VENDOR_HUAWEI: /* * Huawei doesn't support CIND, signal strength reported |