From 2d868fac1f30a0e18104311a289ac4845370200d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20R=C3=B6jfors?= Date: Tue, 3 Sep 2019 16:06:11 +0200 Subject: [PATCH] ublox: gprs: React on context deactivation In case a context get deactivated when a AT+CGACT=0 is not issued, indicate that to gprs core. This can happen if the device has an auto activated LTE context and modem switches over to for instance UTRAN. --- drivers/ubloxmodem/gprs-context.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/ubloxmodem/gprs-context.c b/drivers/ubloxmodem/gprs-context.c index ff78a42a..188c2c62 100644 --- a/drivers/ubloxmodem/gprs-context.c +++ b/drivers/ubloxmodem/gprs-context.c @@ -40,6 +40,8 @@ #include "ubloxmodem.h" +#define UBLOX_FLAG_DEACTIVATING 0x01 + static const char *none_prefix[] = { NULL }; static const char *cgcontrdp_prefix[] = { "+CGCONTRDP:", NULL }; static const char *uipaddr_prefix[] = { "+UIPADDR:", NULL }; @@ -57,6 +59,7 @@ struct gprs_context_data { ofono_gprs_context_cb_t cb; void *cb_data; enum netmode networking_mode; + int flags; }; static void uipaddr_cb(gboolean ok, GAtResult *result, gpointer user_data) @@ -426,6 +429,8 @@ static void cgact_disable_cb(gboolean ok, GAtResult *result, gpointer user_data) DBG("ok %d", ok); + gcd->flags &= ~UBLOX_FLAG_DEACTIVATING; + if (!ok) { CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data); return; @@ -448,6 +453,8 @@ static void ublox_gprs_deactivate_primary(struct ofono_gprs_context *gc, gcd->cb = cb; gcd->cb_data = data; + gcd->flags |= UBLOX_FLAG_DEACTIVATING; + snprintf(buf, sizeof(buf), "AT+CGACT=0,%u", gcd->active_context); g_at_chat_send(gcd->chat, buf, none_prefix, cgact_disable_cb, gc, NULL); @@ -473,10 +480,16 @@ static void cgev_notify(GAtResult *result, gpointer user_data) sscanf(event, "%*s %*s %*s %u", &cid); else if (g_str_has_prefix(event, "NW DEACT")) sscanf(event, "%*s %*s %u", &cid); + else if (!(gcd->flags & UBLOX_FLAG_DEACTIVATING) && + g_str_has_prefix(event, "ME PDN DEACT")) + /* The modem might consider the ME deactivating without + * an explicit CGACT=0 beeing sent + */ + sscanf(event, "%*s %*s %*s %u", &cid); else return; - DBG("cid %d", cid); + DBG("cid %d, active cid: %d", cid, gcd->active_context); if ((unsigned int) cid != gcd->active_context) return;