diff --git a/src/gprs.c b/src/gprs.c index 9cb69d14..f7a2b739 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -1660,6 +1660,15 @@ static void gprs_netreg_removed(struct ofono_gprs *gprs) gprs_attached_update(gprs); } +static gboolean on_lte(struct ofono_gprs *gprs) +{ + if (ofono_netreg_get_technology(gprs->netreg) == + ACCESS_TECHNOLOGY_EUTRAN && have_read_settings(gprs)) + return TRUE; + + return FALSE; +} + static void gprs_netreg_update(struct ofono_gprs *gprs) { ofono_bool_t attach; @@ -1682,8 +1691,7 @@ static void gprs_netreg_update(struct ofono_gprs *gprs) DBG("attach: %u, driver_attached: %u", attach, gprs->driver_attached); - if (ofono_netreg_get_technology(gprs->netreg) == - ACCESS_TECHNOLOGY_EUTRAN && have_read_settings(gprs)) + if (on_lte(gprs)) /* * For LTE we set attached status only on successful * context activation. @@ -2560,7 +2568,16 @@ void ofono_gprs_status_notify(struct ofono_gprs *gprs, int status) if (status != NETWORK_REGISTRATION_STATUS_REGISTERED && status != NETWORK_REGISTRATION_STATUS_ROAMING) { - gprs_attached_update(gprs); + /* + * For LTE we attached status reflects successful context + * activation. + * Since we in gprs_netreg_update not even try to attach + * to GPRS if we are running on LTE, we can on some modems + * expect the gprs status to be unknown. That must not + * result in detaching... + */ + if (!on_lte(gprs)) + gprs_attached_update(gprs); return; }