summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2011-07-24 14:48:39 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-07-24 14:48:39 +0200
commit476fab4ea192aa9db2e0ead9d99df72a6a28d0e9 (patch)
tree6f4d47ca53625399b32535616f01276ac2a44665 /drivers
parent7ed56d6844f8131cbf981e482b7bded8b20db7ab (diff)
downloadofono-476fab4ea192aa9db2e0ead9d99df72a6a28d0e9.tar.bz2
atmodem: Add support for NW DEACT notifications on slave channel
Diffstat (limited to 'drivers')
-rw-r--r--drivers/atmodem/gprs-context.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c
index 9e3f9cbc..ae6f06ad 100644
--- a/drivers/atmodem/gprs-context.c
+++ b/drivers/atmodem/gprs-context.c
@@ -268,6 +268,40 @@ static void at_gprs_deactivate_primary(struct ofono_gprs_context *gc,
g_at_ppp_shutdown(gcd->ppp);
}
+static void cgev_notify(GAtResult *result, gpointer user_data)
+{
+ struct ofono_gprs_context *gc = user_data;
+ struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+ const char *event;
+ int cid;
+ GAtResultIter iter;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CGEV:"))
+ return;
+
+ if (!g_at_result_iter_next_unquoted_string(&iter, &event))
+ return;
+
+ if (g_str_has_prefix(event, "NW DEACT") == FALSE)
+ return;
+
+ if (!g_at_result_iter_skip_next(&iter))
+ return;
+
+ if (!g_at_result_iter_next_number(&iter, &cid))
+ return;
+
+ DBG("cid %d", cid);
+
+ if ((unsigned int) cid != gcd->active_context)
+ return;
+
+ if (gcd->state != STATE_IDLE && gcd->ppp)
+ g_at_ppp_shutdown(gcd->ppp);
+}
+
static int at_gprs_context_probe(struct ofono_gprs_context *gc,
unsigned int vendor, void *data)
{
@@ -290,6 +324,12 @@ static int at_gprs_context_probe(struct ofono_gprs_context *gc,
ofono_gprs_context_set_data(gc, gcd);
+ chat = g_at_chat_get_slave(gcd->chat);
+ if (chat == NULL)
+ return 0;
+
+ g_at_chat_register(chat, "+CGEV:", cgev_notify, FALSE, gc, NULL);
+
return 0;
}