summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem/gprs.c
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2009-11-10 07:29:56 +0100
committerDenis Kenzior <denkenz@gmail.com>2009-11-10 12:40:21 -0600
commit49c2f7b2e738b417a22e46bfac0aac103a9889ca (patch)
treec07e0ffe46ddd654de19a42000eb524e431968b1 /drivers/atmodem/gprs.c
parent53654ea528ba44bd9a26fe383335f74501f0376e (diff)
downloadofono-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.c57
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;