diff options
-rw-r--r-- | src/mm-iface-modem-3gpp.c | 72 |
1 files changed, 50 insertions, 22 deletions
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c index a919e33f..06bf9825 100644 --- a/src/mm-iface-modem-3gpp.c +++ b/src/mm-iface-modem-3gpp.c @@ -129,46 +129,64 @@ reg_state_is_registered (MMModem3gppRegistrationState state) static MMModem3gppRegistrationState get_consolidated_reg_state (RegistrationStateContext *ctx) { + MMModem3gppRegistrationState consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + /* Some devices (Blackberries for example) will respond to +CGREG, but * return ERROR for +CREG, probably because their firmware is just stupid. * So here we prefer the +CREG response, but if we never got a successful * +CREG response, we'll take +CGREG instead. */ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || - ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) - return ctx->cs; + ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) { + consolidated = ctx->cs; + goto out; + } if (ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || - ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) - return ctx->ps; + ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) { + consolidated = ctx->ps; + goto out; + } if (ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) - return ctx->eps; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) { + consolidated = ctx->eps; + goto out; + } /* Searching? */ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING || ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING || - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING) - return MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING) { + consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; + goto out; + } - /* If one state is DENIED and the others are UNKNOWN, use DENIED */ + /* If one state is DENIED and the others are UNKNOWN or IDLE, use DENIED */ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED && ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN && - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN) - return ctx->cs; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN) { + consolidated = ctx->cs; + goto out; + } if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN && ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED && - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN) - return ctx->ps; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN) { + consolidated = ctx->ps; + goto out; + } if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN && ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN && - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED) - return ctx->eps; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED) { + consolidated = ctx->eps; + goto out; + } /* Emergency services? */ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY || ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY || - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY) - return MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY) { + consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY; + goto out; + } /* Support for additional registration states reported when on LTE. * @@ -188,17 +206,27 @@ get_consolidated_reg_state (RegistrationStateContext *ctx) ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) { mm_warn ("3GPP CSFB registration state is consolidated: %s", mm_modem_3gpp_registration_state_get_string (ctx->cs)); - return ctx->cs; + consolidated = ctx->cs; + goto out; } /* Idle? */ if (ctx->cs == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE || ctx->ps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE || - ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE) - return MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + ctx->eps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE) { + consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + goto out; + } + + + out: + mm_dbg ("building consolidated registration state: cs '%s', ps '%s', eps '%s' --> '%s'", + mm_modem_3gpp_registration_state_get_string (ctx->cs), + mm_modem_3gpp_registration_state_get_string (ctx->ps), + mm_modem_3gpp_registration_state_get_string (ctx->eps), + mm_modem_3gpp_registration_state_get_string (consolidated)); - /* Just unknown at this point */ - return MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + return consolidated; } /*****************************************************************************/ |