summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem/gprs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/atmodem/gprs.c')
-rw-r--r--drivers/atmodem/gprs.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c
index 7aaa51a8..7af66f12 100644
--- a/drivers/atmodem/gprs.c
+++ b/drivers/atmodem/gprs.c
@@ -89,6 +89,7 @@ static void at_cgreg_cb(gboolean ok, GAtResult *result, gpointer user_data)
ofono_gprs_status_cb_t cb = cbd->cb;
int status;
const char *str;
+ int mode;
int lac = -1, ci = -1, tech = -1;
struct ofono_error error;
@@ -102,32 +103,33 @@ static void at_cgreg_cb(gboolean ok, GAtResult *result, gpointer user_data)
g_at_result_iter_init(&iter, result);
- if (!g_at_result_iter_next(&iter, "+CGREG:")) {
- CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data);
- return;
- }
+ while (g_at_result_iter_next(&iter, "+CGREG:")) {
+ g_at_result_iter_next_number(&iter, &mode);
- /* Skip <n> the unsolicited result code */
- g_at_result_iter_skip_next(&iter);
+ /* Sometimes we get an unsolicited CGREG here, skip it */
+ if (g_at_result_iter_next_number(&iter, &status) == FALSE)
+ continue;
- g_at_result_iter_next_number(&iter, &status);
+ if (g_at_result_iter_next_string(&iter, &str) == TRUE)
+ lac = strtol(str, NULL, 16);
+ else
+ goto out;
- if (g_at_result_iter_next_string(&iter, &str) == TRUE)
- lac = strtol(str, NULL, 16);
- else
- goto out;
+ if (g_at_result_iter_next_string(&iter, &str) == TRUE)
+ ci = strtol(str, NULL, 16);
+ else
+ goto out;
- if (g_at_result_iter_next_string(&iter, &str) == TRUE)
- ci = strtol(str, NULL, 16);
- else
- goto out;
-
- g_at_result_iter_next_number(&iter, &tech);
+ g_at_result_iter_next_number(&iter, &tech);
out:
- ofono_debug("cgreg_cb: %d, %d, %d, %d", status, lac, ci, tech);
+ ofono_debug("cgreg_cb: %d, %d, %d, %d", status, lac, ci, tech);
+
+ cb(&error, status, lac, ci, tech, cbd->data);
+ return;
+ }
- cb(&error, status, lac, ci, tech, cbd->data);
+ CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data);
}
static void at_gprs_registration_status(struct ofono_gprs *gprs,