diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2022-10-21 13:42:59 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2022-11-10 10:57:54 +0000 |
commit | 55796d58246f0e62dbce2a773d19ca233b893ef5 (patch) | |
tree | b4fc18fe8c538d57d32806e1aea396452503e172 /src | |
parent | ea160e3a3c6b4d33bb8d34728ddbfd725094809d (diff) |
broadband-modem-qmi: use new system info processor helper
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 763 |
1 files changed, 92 insertions, 671 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 7c4a96d2..898d2467 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -178,7 +178,10 @@ struct _MMBroadbandModemQmiPrivate { * (not applicable when using NAS Serving System) */ gboolean dsd_supported; gboolean dsd_data_rat_available; - MMModem3gppRegistrationState system_info_ps_registration_state; + MMModem3gppRegistrationState system_info_registration_state_cs; + MMModem3gppRegistrationState system_info_registration_state_ps; + MMModem3gppRegistrationState system_info_registration_state_eps; + MMModem3gppRegistrationState system_info_registration_state_5gs; MMModemAccessTechnology access_tech; guint16 location_area_code; guint16 tracking_area_code; @@ -3330,631 +3333,72 @@ get_serving_system_3gpp_ready (QmiClientNas *client, qmi_message_nas_get_serving_system_output_unref (output); } -static gboolean -process_common_info (QmiNasServiceStatus service_status, - gboolean domain_valid, - QmiNasNetworkServiceDomain domain, - gboolean roaming_status_valid, - QmiNasRoamingStatus roaming_status, - gboolean forbidden_valid, - gboolean forbidden, - gboolean lac_valid, - guint16 lac, - gboolean tac_valid, - guint16 tac, - gboolean cid_valid, - guint32 cid, - gboolean network_id_valid, - const gchar *mcc, - const gchar *mnc, - MMModem3gppRegistrationState *mm_cs_registration_state, - MMModem3gppRegistrationState *mm_ps_registration_state, - guint16 *mm_lac, - guint16 *mm_tac, - guint32 *mm_cid, - gchar **mm_operator_id) -{ - MMModem3gppRegistrationState tmp_registration_state; - gboolean apply_cs = TRUE; - gboolean apply_ps = TRUE; - - if (service_status != QMI_NAS_SERVICE_STATUS_LIMITED && - service_status != QMI_NAS_SERVICE_STATUS_AVAILABLE && - service_status != QMI_NAS_SERVICE_STATUS_LIMITED_REGIONAL) - return FALSE; - - /* If we don't have domain, unknown */ - if (!domain_valid) - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_NONE) - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING; - else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN) - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - else { - /* If we have CS or PS service domain, assume registered for now */ - if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS) - apply_ps = FALSE; - else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_PS) - apply_cs = FALSE; - else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS_PS) { - /* both apply */ ; - } - - /* Check if we really are roaming or forbidden */ - if (forbidden_valid && forbidden) - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_DENIED; - else { - if (roaming_status_valid && roaming_status == QMI_NAS_ROAMING_STATUS_ON) - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING; - else - tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_HOME; - - /* If we're registered either at home or roaming, try to get LAC/CID */ - if (lac_valid) - *mm_lac = lac; - if (tac_valid) - *mm_tac = tac; - if (cid_valid) - *mm_cid = cid; - } - } - - if (apply_cs) - *mm_cs_registration_state = tmp_registration_state; - if (apply_ps) - *mm_ps_registration_state = tmp_registration_state; - - if (network_id_valid) { - *mm_operator_id = g_malloc (7); - memcpy (*mm_operator_id, mcc, 3); - if ((guint8)mnc[2] == 0xFF) { - memcpy (&((*mm_operator_id)[3]), mnc, 2); - (*mm_operator_id)[5] = '\0'; - } else { - memcpy (&((*mm_operator_id)[3]), mnc, 3); - (*mm_operator_id)[6] = '\0'; - } - } - - return TRUE; -} - -static gboolean -process_gsm_info (MMBroadbandModemQmi *self, - QmiMessageNasGetSystemInfoOutput *response_output, - QmiIndicationNasSystemInfoOutput *indication_output, - MMModem3gppRegistrationState *mm_cs_registration_state, - MMModem3gppRegistrationState *mm_ps_registration_state, - guint16 *mm_lac, - guint32 *mm_cid, - gchar **mm_operator_id, - MMModemAccessTechnology *mm_act) -{ - QmiNasServiceStatus service_status; - gboolean domain_valid; - QmiNasNetworkServiceDomain domain; - gboolean roaming_status_valid; - QmiNasRoamingStatus roaming_status; - gboolean forbidden_valid; - gboolean forbidden; - gboolean lac_valid; - guint16 lac; - gboolean cid_valid; - guint32 cid; - gboolean network_id_valid; - const gchar *mcc; - const gchar *mnc; - - g_assert ((response_output != NULL && indication_output == NULL) || - (response_output == NULL && indication_output != NULL)); - - *mm_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_lac = 0; - *mm_cid = 0; - g_free (*mm_operator_id); - *mm_operator_id = NULL; - - if (response_output) { - if (!qmi_message_nas_get_system_info_output_get_gsm_service_status ( - response_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_message_nas_get_system_info_output_get_gsm_system_info_v2 ( - response_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - NULL, NULL, /* egprs support */ - NULL, NULL, /* dtm_support */ - NULL)) { - mm_obj_dbg (self, "no GSM service reported"); - return FALSE; - } - } else { - if (!qmi_indication_nas_system_info_output_get_gsm_service_status ( - indication_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_indication_nas_system_info_output_get_gsm_system_info_v2 ( - indication_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - NULL, NULL, /* egprs support */ - NULL, NULL, /* dtm_support */ - NULL)) { - mm_obj_dbg (self, "no GSM service reported"); - return FALSE; - } - } - - if (!process_common_info (service_status, - domain_valid, domain, - roaming_status_valid, roaming_status, - forbidden_valid, forbidden, - lac_valid, lac, - FALSE, 0, - cid_valid, cid, - network_id_valid, mcc, mnc, - mm_cs_registration_state, - mm_ps_registration_state, - mm_lac, - NULL, - mm_cid, - mm_operator_id)) { - mm_obj_dbg (self, "no GSM service registered"); - return FALSE; - } - - *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_GSM; - - return TRUE; -} - -static gboolean -process_wcdma_info (MMBroadbandModemQmi *self, - QmiMessageNasGetSystemInfoOutput *response_output, - QmiIndicationNasSystemInfoOutput *indication_output, - MMModem3gppRegistrationState *mm_cs_registration_state, - MMModem3gppRegistrationState *mm_ps_registration_state, - guint16 *mm_lac, - guint32 *mm_cid, - gchar **mm_operator_id, - MMModemAccessTechnology *mm_act) -{ - QmiNasServiceStatus service_status; - gboolean domain_valid; - QmiNasNetworkServiceDomain domain; - gboolean roaming_status_valid; - QmiNasRoamingStatus roaming_status; - gboolean forbidden_valid; - gboolean forbidden; - gboolean lac_valid; - guint16 lac; - gboolean cid_valid; - guint32 cid; - gboolean network_id_valid; - const gchar *mcc; - const gchar *mnc; - gboolean hs_service_valid; - QmiNasWcdmaHsService hs_service; - - g_assert ((response_output != NULL && indication_output == NULL) || - (response_output == NULL && indication_output != NULL)); - - *mm_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_lac = 0; - *mm_cid = 0; - g_free (*mm_operator_id); - *mm_operator_id = NULL; - - if (response_output) { - if (!qmi_message_nas_get_system_info_output_get_wcdma_service_status ( - response_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_message_nas_get_system_info_output_get_wcdma_system_info_v2 ( - response_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - NULL, NULL, /* hs_call_status */ - &hs_service_valid, &hs_service, - NULL, NULL, /* primary_scrambling_code */ - NULL)) { - mm_obj_dbg (self, "no WCDMA service reported"); - return FALSE; - } - } else { - if (!qmi_indication_nas_system_info_output_get_wcdma_service_status ( - indication_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_indication_nas_system_info_output_get_wcdma_system_info_v2 ( - indication_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - NULL, NULL, /* hs_call_status */ - &hs_service_valid, &hs_service, - NULL, NULL, /* primary_scrambling_code */ - NULL)) { - mm_obj_dbg (self, "no WCDMA service reported"); - return FALSE; - } - } - - if (!process_common_info (service_status, - domain_valid, domain, - roaming_status_valid, roaming_status, - forbidden_valid, forbidden, - lac_valid, lac, - FALSE, 0, - cid_valid, cid, - network_id_valid, mcc, mnc, - mm_cs_registration_state, - mm_ps_registration_state, - mm_lac, - NULL, - mm_cid, - mm_operator_id)) { - mm_obj_dbg (self, "no WCDMA service registered"); - return FALSE; - } - - *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_UMTS; - - return TRUE; -} - -static gboolean -process_lte_info (MMBroadbandModemQmi *self, - QmiMessageNasGetSystemInfoOutput *response_output, - QmiIndicationNasSystemInfoOutput *indication_output, - MMModem3gppRegistrationState *mm_cs_registration_state, - MMModem3gppRegistrationState *mm_ps_registration_state, - guint16 *mm_lac, - guint16 *mm_tac, - guint32 *mm_cid, - gchar **mm_operator_id, - MMModemAccessTechnology *mm_act) -{ - QmiNasServiceStatus service_status; - gboolean domain_valid; - QmiNasNetworkServiceDomain domain; - gboolean roaming_status_valid; - QmiNasRoamingStatus roaming_status; - gboolean forbidden_valid; - gboolean forbidden; - gboolean lac_valid; - guint16 lac; - gboolean tac_valid; - guint16 tac; - gboolean cid_valid; - guint32 cid; - gboolean network_id_valid; - const gchar *mcc; - const gchar *mnc; - gboolean endc_available = FALSE; - - g_assert ((response_output != NULL && indication_output == NULL) || - (response_output == NULL && indication_output != NULL)); - - *mm_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_lac = 0; - *mm_tac = 0; - *mm_cid = 0; - g_free (*mm_operator_id); - *mm_operator_id = NULL; - - if (response_output) { - if (!qmi_message_nas_get_system_info_output_get_lte_service_status ( - response_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_message_nas_get_system_info_output_get_lte_system_info_v2 ( - response_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - &tac_valid, &tac, - NULL)) { - mm_obj_dbg (self, "no LTE service reported"); - return FALSE; - } - - qmi_message_nas_get_system_info_output_get_eutra_with_nr5g_availability ( - response_output, - &endc_available, - NULL); - } else { - if (!qmi_indication_nas_system_info_output_get_lte_service_status ( - indication_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_indication_nas_system_info_output_get_lte_system_info_v2 ( - indication_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - &tac_valid, &tac, - NULL)) { - mm_obj_dbg (self, "no LTE service reported"); - return FALSE; - } - - qmi_indication_nas_system_info_output_get_eutra_with_nr5g_availability ( - indication_output, - &endc_available, - NULL); - } - - if (!process_common_info (service_status, - domain_valid, domain, - roaming_status_valid, roaming_status, - forbidden_valid, forbidden, - lac_valid, lac, - tac_valid, tac, - cid_valid, cid, - network_id_valid, mcc, mnc, - mm_cs_registration_state, - mm_ps_registration_state, - mm_lac, - mm_tac, - mm_cid, - mm_operator_id)) { - mm_obj_dbg (self, "no LTE service registered"); - return FALSE; - } - - *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_LTE; - if (endc_available) - *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_5GNR; - - return TRUE; -} - -static gboolean -process_nr5g_info (MMBroadbandModemQmi *self, - QmiMessageNasGetSystemInfoOutput *response_output, - QmiIndicationNasSystemInfoOutput *indication_output, - MMModem3gppRegistrationState *mm_cs_registration_state, - MMModem3gppRegistrationState *mm_ps_registration_state, - guint16 *mm_lac, - guint16 *mm_tac, - guint32 *mm_cid, - gchar **mm_operator_id, - MMModemAccessTechnology *mm_act) -{ - QmiNasServiceStatus service_status; - gboolean domain_valid; - QmiNasNetworkServiceDomain domain; - gboolean roaming_status_valid; - QmiNasRoamingStatus roaming_status; - gboolean forbidden_valid; - gboolean forbidden; - gboolean lac_valid; - guint16 lac; - gboolean tac_valid; - guint16 tac; - gboolean cid_valid; - guint32 cid; - gboolean network_id_valid; - const gchar *mcc; - const gchar *mnc; - - g_assert ((response_output != NULL && indication_output == NULL) || - (response_output == NULL && indication_output != NULL)); - - *mm_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - *mm_lac = 0; - *mm_tac = 0; - *mm_cid = 0; - g_free (*mm_operator_id); - *mm_operator_id = NULL; - - if (response_output) { - if (!qmi_message_nas_get_system_info_output_get_nr5g_service_status_info ( - response_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_message_nas_get_system_info_output_get_nr5g_system_info ( - response_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - &tac_valid, &tac, - NULL)) { - mm_obj_dbg (self, "no NR5G service reported"); - return FALSE; - } - } else { - if (!qmi_indication_nas_system_info_output_get_nr5g_service_status_info ( - indication_output, - &service_status, - NULL, /* true_service_status */ - NULL, /* preferred_data_path */ - NULL) || - !qmi_indication_nas_system_info_output_get_nr5g_system_info ( - indication_output, - &domain_valid, &domain, - NULL, NULL, /* service_capability */ - &roaming_status_valid, &roaming_status, - &forbidden_valid, &forbidden, - &lac_valid, &lac, - &cid_valid, &cid, - NULL, NULL, NULL, /* registration_reject_info */ - &network_id_valid, &mcc, &mnc, - &tac_valid, &tac, - NULL)) { - mm_obj_dbg (self, "no NR5G service reported"); - return FALSE; - } - } - - if (!process_common_info (service_status, - domain_valid, domain, - roaming_status_valid, roaming_status, - forbidden_valid, forbidden, - lac_valid, lac, - tac_valid, tac, - cid_valid, cid, - network_id_valid, mcc, mnc, - mm_cs_registration_state, - mm_ps_registration_state, - mm_lac, - mm_tac, - mm_cid, - mm_operator_id)) { - mm_obj_dbg (self, "no NR5G service registered"); - return FALSE; - } - - *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_5GNR; - - return TRUE; -} - static void -consolidated_update_ps_registration_state (MMBroadbandModemQmi *self, - gboolean is_eps, - gboolean is_5gs) +consolidated_update_registration_state (MMBroadbandModemQmi *self) { MMModem3gppRegistrationState state_ps; + MMModem3gppRegistrationState state_eps; + MMModem3gppRegistrationState state_5gs; - state_ps = self->priv->system_info_ps_registration_state; + /* CS state unaffected by DSD state */ + mm_iface_modem_3gpp_update_cs_registration_state (MM_IFACE_MODEM_3GPP (self), self->priv->system_info_registration_state_cs, TRUE); /* If DSD supported but data RAT not set, no transition to HOME/ROAMING, force IDLE */ - if ((state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)) { - if (self->priv->dsd_supported && !self->priv->dsd_data_rat_available) { + state_ps = self->priv->system_info_registration_state_ps; + state_eps = self->priv->system_info_registration_state_eps; + state_5gs = self->priv->system_info_registration_state_5gs; + if (self->priv->dsd_supported && !self->priv->dsd_data_rat_available) { + if ((state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)) { mm_obj_dbg (self, "fallback PS registration state to idle: DSD data RAT unavailable"); state_ps = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; - } else if (!self->priv->dsd_supported) - mm_obj_dbg (self, "updating PS registration state: DSD unsupported"); - else if (self->priv->dsd_data_rat_available) - mm_obj_dbg (self, "updating PS registration state: DSD data RAT available"); - else - g_assert_not_reached (); - } - + } + if ((state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)) { + mm_obj_dbg (self, "fallback EPS registration state to idle: DSD data RAT unavailable"); + state_eps = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + } + if ((state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)) { + mm_obj_dbg (self, "fallback 5GS registration state to idle: DSD data RAT unavailable"); + state_5gs = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + } + } else if (!self->priv->dsd_supported) + mm_obj_dbg (self, "updating PS/EPS/5GS registration state: DSD unsupported"); + else if (self->priv->dsd_data_rat_available) + mm_obj_dbg (self, "updating PS/EPS/5GS registration state: DSD data RAT available"); + else + g_assert_not_reached (); mm_iface_modem_3gpp_update_ps_registration_state (MM_IFACE_MODEM_3GPP (self), state_ps, TRUE); - mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), is_eps ? state_ps : MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN, TRUE); - mm_iface_modem_3gpp_update_5gs_registration_state (MM_IFACE_MODEM_3GPP (self), is_5gs ? state_ps : MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN, TRUE); + mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), state_eps, TRUE); + mm_iface_modem_3gpp_update_5gs_registration_state (MM_IFACE_MODEM_3GPP (self), state_5gs, TRUE); mm_iface_modem_3gpp_apply_deferred_registration_state (MM_IFACE_MODEM_3GPP (self)); } static void -common_process_system_info_3gpp (MMBroadbandModemQmi *self, +common_process_system_info_3gpp (MMBroadbandModemQmi *self, QmiMessageNasGetSystemInfoOutput *response_output, QmiIndicationNasSystemInfoOutput *indication_output) { - MMModem3gppRegistrationState cs_registration_state; - MMModem3gppRegistrationState ps_registration_state; - MMModemAccessTechnology act; - guint16 lac; - guint16 tac; - guint32 cid; - gchar *operator_id; - gboolean has_nr5g_info = FALSE; - gboolean has_lte_info = FALSE; - - ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; - act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; - lac = 0; - tac = 0; - cid = 0; - operator_id = NULL; - - /* Process infos, with the following priority: - * NR5G > LTE > WCDMA > GSM - * The first one giving results will be the one reported. - */ - if (!(has_nr5g_info = process_nr5g_info (self, response_output, indication_output, - &cs_registration_state, - &ps_registration_state, - &lac, - &tac, - &cid, - &operator_id, - &act)) && - !(has_lte_info = process_lte_info (self, response_output, indication_output, - &cs_registration_state, - &ps_registration_state, - &lac, - &tac, - &cid, - &operator_id, - &act)) && - !process_wcdma_info (self, response_output, indication_output, - &cs_registration_state, - &ps_registration_state, - &lac, - &cid, - &operator_id, - &act) && - !process_gsm_info (self, response_output, indication_output, - &cs_registration_state, - &ps_registration_state, - &lac, - &cid, - &operator_id, - &act)) { - mm_obj_dbg (self, "no service (GSM, WCDMA, LTE or NR5G) reported"); - } + MMModem3gppRegistrationState registration_state_cs = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + MMModem3gppRegistrationState registration_state_ps = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + MMModem3gppRegistrationState registration_state_eps = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + MMModem3gppRegistrationState registration_state_5gs = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; + guint16 lac = 0; + guint16 tac = 0; + guint32 cid = 0; + gchar *operator_id = NULL; + + mm_modem_registration_state_from_qmi_system_info (response_output, + indication_output, + ®istration_state_cs, + ®istration_state_ps, + ®istration_state_eps, + ®istration_state_5gs, + &lac, + &tac, + &cid, + &operator_id, + &act, + self); /* Cache current operator ID */ if (operator_id) { @@ -3962,13 +3406,14 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, self->priv->current_operator_id = operator_id; } - /* Report new registration states. - * Note: consolidated_update_ps_registration_state() calls apply_deferred_registration_state() always */ - mm_iface_modem_3gpp_update_cs_registration_state (MM_IFACE_MODEM_3GPP (self), cs_registration_state, TRUE); - /* Store PS system reg state and update PS/EPS/5GS states accordingly */ - self->priv->system_info_ps_registration_state = ps_registration_state; - consolidated_update_ps_registration_state (self, has_lte_info, has_nr5g_info); + /* Store latest registration states and update them */ + self->priv->system_info_registration_state_cs = registration_state_cs; + self->priv->system_info_registration_state_ps = registration_state_ps; + self->priv->system_info_registration_state_eps = registration_state_eps; + self->priv->system_info_registration_state_5gs = registration_state_5gs; + consolidated_update_registration_state (self); + /* Store act and location info and update them */ self->priv->access_tech = act; self->priv->location_area_code = lac; self->priv->tracking_area_code = tac; @@ -3977,15 +3422,34 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), lac, tac, cid); } +static gboolean +get_3gpp_rat_data_available (QmiDsdRadioAccessTechnology rat) +{ + switch (rat) { + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WCDMA: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_TDSCDMA: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_GERAN: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_LTE: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_5G: + return TRUE; + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WLAN: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_1X: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_HRPD: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_EHRPD: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_WLAN: + case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_UNKNOWN: + default: + return FALSE; + } +} + static void -common_process_system_status_3gpp (MMBroadbandModemQmi *self, +common_process_system_status_3gpp (MMBroadbandModemQmi *self, QmiMessageDsdGetSystemStatusOutput *response_output, QmiIndicationDsdSystemStatusOutput *indication_output) { GArray *available_systems = NULL; gboolean data_rat_available = FALSE; - gboolean is_lte = FALSE; - gboolean is_nr5g = FALSE; if (response_output) { qmi_message_dsd_get_system_status_output_get_available_systems (response_output, &available_systems, NULL); @@ -3995,31 +3459,8 @@ common_process_system_status_3gpp (MMBroadbandModemQmi *self, system = &g_array_index (available_systems, QmiMessageDsdGetSystemStatusOutputAvailableSystemsSystem, 0); - if (system->technology == QMI_DSD_DATA_SYSTEM_NETWORK_TYPE_3GPP) { - switch (system->rat) { - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WCDMA: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_TDSCDMA: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_GERAN: - data_rat_available = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_LTE: - data_rat_available = TRUE; - is_lte = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_5G: - data_rat_available = TRUE; - is_nr5g = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WLAN: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_1X: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_HRPD: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_EHRPD: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_WLAN: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_UNKNOWN: - default: - break; - } - } + if (system->technology == QMI_DSD_DATA_SYSTEM_NETWORK_TYPE_3GPP) + data_rat_available = get_3gpp_rat_data_available (system->rat); } } else { qmi_indication_dsd_system_status_output_get_available_systems (indication_output, &available_systems, NULL); @@ -4029,37 +3470,14 @@ common_process_system_status_3gpp (MMBroadbandModemQmi *self, system = &g_array_index (available_systems, QmiIndicationDsdSystemStatusOutputAvailableSystemsSystem, 0); - if (system->technology == QMI_DSD_DATA_SYSTEM_NETWORK_TYPE_3GPP) { - switch (system->rat) { - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WCDMA: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_TDSCDMA: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_GERAN: - data_rat_available = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_LTE: - data_rat_available = TRUE; - is_lte = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_5G: - data_rat_available = TRUE; - is_nr5g = TRUE; - break; - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP_WLAN: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_1X: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_HRPD: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_EHRPD: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_3GPP2_WLAN: - case QMI_DSD_RADIO_ACCESS_TECHNOLOGY_UNKNOWN: - default: - break; - } - } + if (system->technology == QMI_DSD_DATA_SYSTEM_NETWORK_TYPE_3GPP) + data_rat_available = get_3gpp_rat_data_available (system->rat); } } /* Store DSD data RAT availability and update PS/EPS/5GS states accordingly */ self->priv->dsd_data_rat_available = data_rat_available; - consolidated_update_ps_registration_state (self, is_lte, is_nr5g); + consolidated_update_registration_state (self); mm_iface_modem_3gpp_update_access_technologies (MM_IFACE_MODEM_3GPP (self), self->priv->access_tech); mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), self->priv->location_area_code, self->priv->tracking_area_code, self->priv->cell_id); } @@ -13530,7 +12948,10 @@ mm_broadband_modem_qmi_init (MMBroadbandModemQmi *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_BROADBAND_MODEM_QMI, MMBroadbandModemQmiPrivate); - self->priv->system_info_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + self->priv->system_info_registration_state_cs = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + self->priv->system_info_registration_state_ps = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + self->priv->system_info_registration_state_eps = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; + self->priv->system_info_registration_state_5gs = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; self->priv->access_tech = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; } |