diff options
author | Prakash Pabba <quic_ppabba@quicinc.com> | 2021-08-31 17:26:31 +0530 |
---|---|---|
committer | Prakash Pabba <quic_ppabba@quicinc.com> | 2021-11-14 20:19:37 +0530 |
commit | 07512ef2a46e65808564ba92e307f45fb72b98fa (patch) | |
tree | 3dde0885af78943e2a5fb06bd6bc828ed7de2350 /src | |
parent | 0936204eb514e3f1b811019fe1b59aa4671be5b3 (diff) |
broadband-modem-qmi: Process System Info for NR5G
MM was not processing NR5G service info for QMI system info
response/indication message. This led to NR5G-only modems never
having 'registered' status.
Process NR5G system info and accordingly update the 5gs
registration status for qmi modems.
This commit also removes some stale comments.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 152 |
1 files changed, 131 insertions, 21 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 52c80a6e..72b34687 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -12,6 +12,7 @@ * * Copyright (C) 2012 Google Inc. * Copyright (C) 2014 Aleksander Morgado <aleksander@aleksander.es> + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <config.h> @@ -3199,7 +3200,6 @@ process_gsm_info (MMBroadbandModemQmi *self, NULL, NULL, /* dtm_support */ NULL)) { mm_obj_dbg (self, "no GSM service reported"); - /* No GSM service */ return FALSE; } } else { @@ -3223,7 +3223,6 @@ process_gsm_info (MMBroadbandModemQmi *self, NULL, NULL, /* dtm_support */ NULL)) { mm_obj_dbg (self, "no GSM service reported"); - /* No GSM service */ return FALSE; } } @@ -3308,7 +3307,6 @@ process_wcdma_info (MMBroadbandModemQmi *self, NULL, NULL, /* primary_scrambling_code */ NULL)) { mm_obj_dbg (self, "no WCDMA service reported"); - /* No GSM service */ return FALSE; } } else { @@ -3333,7 +3331,6 @@ process_wcdma_info (MMBroadbandModemQmi *self, NULL, NULL, /* primary_scrambling_code */ NULL)) { mm_obj_dbg (self, "no WCDMA service reported"); - /* No GSM service */ return FALSE; } } @@ -3418,7 +3415,6 @@ process_lte_info (MMBroadbandModemQmi *self, &tac_valid, &tac, NULL)) { mm_obj_dbg (self, "no LTE service reported"); - /* No GSM service */ return FALSE; } } else { @@ -3441,7 +3437,6 @@ process_lte_info (MMBroadbandModemQmi *self, &tac_valid, &tac, NULL)) { mm_obj_dbg (self, "no LTE service reported"); - /* No GSM service */ return FALSE; } } @@ -3467,6 +3462,112 @@ process_lte_info (MMBroadbandModemQmi *self, 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) +{ + 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; + } + + return TRUE; +} + static void common_process_system_info_3gpp (MMBroadbandModemQmi *self, QmiMessageNasGetSystemInfoOutput *response_output, @@ -3478,7 +3579,8 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, guint16 tac; guint32 cid; gchar *operator_id; - gboolean has_lte_info; + 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; @@ -3488,17 +3590,23 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, operator_id = NULL; /* Process infos, with the following priority: - * LTE > WCDMA > GSM + * NR5G > LTE > WCDMA > GSM * The first one giving results will be the one reported. */ - has_lte_info = process_lte_info (self, response_output, indication_output, - &cs_registration_state, - &ps_registration_state, - &lac, - &tac, - &cid, - &operator_id); - if (!has_lte_info && + if (!(has_nr5g_info = process_nr5g_info (self, response_output, indication_output, + &cs_registration_state, + &ps_registration_state, + &lac, + &tac, + &cid, + &operator_id)) && + !(has_lte_info = process_lte_info (self, response_output, indication_output, + &cs_registration_state, + &ps_registration_state, + &lac, + &tac, + &cid, + &operator_id)) && !process_wcdma_info (self, response_output, indication_output, &cs_registration_state, &ps_registration_state, @@ -3511,7 +3619,7 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, &lac, &cid, &operator_id)) { - mm_obj_dbg (self, "no service (GSM, WCDMA or LTE) reported"); + mm_obj_dbg (self, "no service (GSM, WCDMA, LTE or NR5G) reported"); } /* Cache current operator ID */ @@ -3523,10 +3631,12 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, /* Report new registration states */ mm_iface_modem_3gpp_update_cs_registration_state (MM_IFACE_MODEM_3GPP (self), cs_registration_state); mm_iface_modem_3gpp_update_ps_registration_state (MM_IFACE_MODEM_3GPP (self), ps_registration_state); - if (has_lte_info) - mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), ps_registration_state); - else - mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN); + mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), + has_lte_info ? + ps_registration_state : MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN); + mm_iface_modem_3gpp_update_5gs_registration_state (MM_IFACE_MODEM_3GPP (self), + has_nr5g_info ? + ps_registration_state : MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN); mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), lac, tac, cid); } |