diff options
author | Andrzej Zaborowski <andrew.zaborowski@intel.com> | 2009-11-10 07:29:56 +0100 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-11-10 12:40:21 -0600 |
commit | 49c2f7b2e738b417a22e46bfac0aac103a9889ca (patch) | |
tree | c07e0ffe46ddd654de19a42000eb524e431968b1 /drivers/atmodem/network-registration.c | |
parent | 53654ea528ba44bd9a26fe383335f74501f0376e (diff) | |
download | ofono-49c2f7b2e738b417a22e46bfac0aac103a9889ca.tar.bz2 |
Fix: Don't bail if CREG/CGREG mode=2 is unsupported
Diffstat (limited to 'drivers/atmodem/network-registration.c')
-rw-r--r-- | drivers/atmodem/network-registration.c | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/drivers/atmodem/network-registration.c b/drivers/atmodem/network-registration.c index d129861b..1b67ad81 100644 --- a/drivers/atmodem/network-registration.c +++ b/drivers/atmodem/network-registration.c @@ -637,6 +637,56 @@ static void at_network_registration_initialized(gboolean ok, GAtResult *result, ofono_netreg_register(netreg); } +static void at_creg_test_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_netreg *netreg = user_data; + struct netreg_data *nd = ofono_netreg_get_data(netreg); + gint range[2]; + GAtResultIter iter; + int creg1 = 0; + int creg2 = 0; + + dump_response("creg_read_cb", ok, result); + + if (!ok) + goto error; + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CREG:")) + goto error; + + if (!g_at_result_iter_open_list(&iter)) + goto error; + + while (g_at_result_iter_next_range(&iter, &range[0], &range[1])) { + if (1 >= range[0] && 1 <= range[1]) + creg1 = 1; + if (2 >= range[0] && 2 <= range[1]) + creg2 = 1; + } + + g_at_result_iter_close_list(&iter); + + if (creg2) { + g_at_chat_send(nd->chat, "AT+CREG=2", none_prefix, + at_network_registration_initialized, + netreg, NULL); + return; + } + + if (creg1) { + g_at_chat_send(nd->chat, "AT+CREG=1", none_prefix, + at_network_registration_initialized, + netreg, NULL); + return; + } + +error: + ofono_error("Unable to initialize Network Registration"); + ofono_netreg_remove(netreg); +} + static int at_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor, void *data) { @@ -652,9 +702,9 @@ static int at_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor, if (nd->vendor == OFONO_VENDOR_CALYPSO) g_at_chat_send(chat, "AT%CSQ=1", NULL, NULL, NULL, NULL); - g_at_chat_send(chat, "AT+CREG=2", NULL, - at_network_registration_initialized, - netreg, NULL); + g_at_chat_send(chat, "AT+CREG=?", creg_prefix, + at_creg_test_cb, netreg, NULL); + return 0; } |