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/gprs.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/gprs.c')
-rw-r--r-- | drivers/atmodem/gprs.c | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c index 6f4933a7..242086c3 100644 --- a/drivers/atmodem/gprs.c +++ b/drivers/atmodem/gprs.c @@ -216,6 +216,57 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data) ofono_gprs_register(gprs); } +static void at_cgreg_test_cb(gboolean ok, GAtResult *result, + gpointer user_data) +{ + struct ofono_gprs *gprs = user_data; + struct gprs_data *gd = ofono_gprs_get_data(gprs); + gint range[2]; + GAtResultIter iter; + int cgreg1 = 0; + int cgreg2 = 0; + const char *cmd; + + dump_response("cgreg_read_cb", ok, result); + + if (!ok) + goto error; + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CGREG:")) + 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]) + cgreg1 = 1; + if (2 >= range[0] && 2 <= range[1]) + cgreg2 = 1; + } + + g_at_result_iter_close_list(&iter); + + if (cgreg2) + cmd = "AT+CGREG=2"; + else if (cgreg1) + cmd = "AT+CGREG=1"; + else + goto error; + + g_at_chat_send(gd->chat, cmd, none_prefix, NULL, NULL, NULL); + g_at_chat_send(gd->chat, "AT+CGAUTO=0", none_prefix, NULL, NULL, NULL); + g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix, + gprs_initialized, gprs, NULL); + return; + +error: + ofono_info("GPRS not supported on this device"); + ofono_gprs_remove(gprs); +} + static void at_cgdcont_test_cb(gboolean ok, GAtResult *result, gpointer user_data) { @@ -262,10 +313,8 @@ static void at_cgdcont_test_cb(gboolean ok, GAtResult *result, ofono_gprs_set_cid_range(gprs, min, max); - g_at_chat_send(gd->chat, "AT+CGREG=2", none_prefix, NULL, NULL, NULL); - g_at_chat_send(gd->chat, "AT+CGAUTO=0", none_prefix, NULL, NULL, NULL); - g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix, - gprs_initialized, gprs, NULL); + g_at_chat_send(gd->chat, "AT+CGREG=?", cgreg_prefix, + at_cgreg_test_cb, gprs, NULL); return; |