diff options
author | Prakash Pabba <quic_ppabba@quicinc.com> | 2022-02-24 16:04:07 +0530 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-05-18 22:16:41 +0000 |
commit | 2788c6c5f61c6e314e65ad1057ae5361b5812e83 (patch) | |
tree | ed27ac7e2bf801d2382dbf2074a9a8038800c05d /src | |
parent | 5fbe7c0c82fb225d001c4aa0ceaacbc3fd30c986 (diff) |
mm-broadband-modem-qmi: Update access technology based on "NAS system info" or "NAS serving system"
For NR5G NSA, both LTE and NR5G should be set in access technology.
Use NAS "system info" or "serving system", instead of NAS "signal info"
or "signal strength", for deciding access technology based on current
registration state.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 151 |
1 files changed, 64 insertions, 87 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 91d3a8fd..62420684 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -1359,18 +1359,15 @@ common_signal_info_get_quality (MMBroadbandModemQmi *self, gint16 nr5g_rsrp, gint16 nr5g_snr, gint16 nr5g_rsrq, - guint8 *out_quality, - MMModemAccessTechnology *out_act) + guint8 *out_quality) { gint8 rssi_max = -125; gint8 signal_quality = -1; /* Valid nr5g signal quality will be in percentage [0,100]. * It is minimum of (rsrp, snr, rsrq) signal quality for 5G. */ guint8 nr5g_signal_quality_min = 101; - QmiNasRadioInterface signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_UNKNOWN; g_assert (out_quality != NULL); - g_assert (out_act != NULL); /* We do not report per-technology signal quality, so just get the highest * one of the ones reported. TODO: When several technologies are in use, if @@ -1380,63 +1377,50 @@ common_signal_info_get_quality (MMBroadbandModemQmi *self, if (cdma1x_rssi < 0) { mm_obj_dbg (self, "RSSI (CDMA): %d dBm", cdma1x_rssi); - if (qmi_dbm_valid (cdma1x_rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1X)) { + if (qmi_dbm_valid (cdma1x_rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1X)) rssi_max = MAX (cdma1x_rssi, rssi_max); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_CDMA_1X; - } } if (evdo_rssi < 0) { mm_obj_dbg (self, "RSSI (HDR): %d dBm", evdo_rssi); - if (qmi_dbm_valid (evdo_rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO)) { + if (qmi_dbm_valid (evdo_rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO)) rssi_max = MAX (evdo_rssi, rssi_max); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO; - } } if (gsm_rssi < 0) { mm_obj_dbg (self, "RSSI (GSM): %d dBm", gsm_rssi); - if (qmi_dbm_valid (gsm_rssi, QMI_NAS_RADIO_INTERFACE_GSM)) { + if (qmi_dbm_valid (gsm_rssi, QMI_NAS_RADIO_INTERFACE_GSM)) rssi_max = MAX (gsm_rssi, rssi_max); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_GSM; - } } if (wcdma_rssi < 0) { mm_obj_dbg (self, "RSSI (WCDMA): %d dBm", wcdma_rssi); - if (qmi_dbm_valid (wcdma_rssi, QMI_NAS_RADIO_INTERFACE_UMTS)) { + if (qmi_dbm_valid (wcdma_rssi, QMI_NAS_RADIO_INTERFACE_UMTS)) rssi_max = MAX (wcdma_rssi, rssi_max); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_UMTS; - } } if (lte_rssi < 0) { mm_obj_dbg (self, "RSSI (LTE): %d dBm", lte_rssi); - if (qmi_dbm_valid (lte_rssi, QMI_NAS_RADIO_INTERFACE_LTE)) { + if (qmi_dbm_valid (lte_rssi, QMI_NAS_RADIO_INTERFACE_LTE)) rssi_max = MAX (lte_rssi, rssi_max); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_LTE; - } } if (nr5g_rsrp <= RSRP_MAX && nr5g_rsrp >= RSRP_MIN) { mm_obj_dbg (self, "RSRP (5G): %d dBm", nr5g_rsrp); nr5g_signal_quality_min = MIN (nr5g_signal_quality_min, (guint8)((nr5g_rsrp - RSRP_MIN) * 100 / (RSRP_MAX - RSRP_MIN))); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_5GNR; } if (nr5g_snr <= SNR_MAX && nr5g_snr >= SNR_MIN) { mm_obj_dbg (self, "SNR (5G): %d dB", nr5g_snr); nr5g_signal_quality_min = MIN (nr5g_signal_quality_min, (guint8)((nr5g_snr - SNR_MIN) * 100 / (SNR_MAX - SNR_MIN))); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_5GNR; } if (nr5g_rsrq <= RSRQ_MAX && nr5g_rsrq >= RSRQ_MIN) { mm_obj_dbg (self, "RSRQ (5G): %d dB", nr5g_rsrq); nr5g_signal_quality_min = MIN (nr5g_signal_quality_min, (guint8)((nr5g_rsrq - RSRQ_MIN) * 100 / (RSRQ_MAX - RSRQ_MIN))); - signal_info_radio_interface = QMI_NAS_RADIO_INTERFACE_5GNR; } if (rssi_max < 0 && rssi_max > -125) { @@ -1452,7 +1436,6 @@ common_signal_info_get_quality (MMBroadbandModemQmi *self, if (signal_quality >= 0) { *out_quality = signal_quality; - *out_act = mm_modem_access_technology_from_qmi_radio_interface (signal_info_radio_interface); return TRUE; } @@ -1462,8 +1445,7 @@ common_signal_info_get_quality (MMBroadbandModemQmi *self, static gboolean signal_info_get_quality (MMBroadbandModemQmi *self, QmiMessageNasGetSignalInfoOutput *output, - guint8 *out_quality, - MMModemAccessTechnology *out_act) + guint8 *out_quality) { gint8 cdma1x_rssi = 0; gint8 evdo_rssi = 0; @@ -1496,20 +1478,17 @@ signal_info_get_quality (MMBroadbandModemQmi *self, nr5g_rsrp, nr5g_snr, nr5g_rsrq, - out_quality, - out_act); + out_quality); } static gboolean -signal_strength_get_quality_and_access_tech (MMBroadbandModemQmi *self, - QmiMessageNasGetSignalStrengthOutput *output, - guint8 *o_quality, - MMModemAccessTechnology *o_act) +signal_strength_get_quality (MMBroadbandModemQmi *self, + QmiMessageNasGetSignalStrengthOutput *output, + guint8 *o_quality) { GArray *array = NULL; gint8 signal_max = 0; QmiNasRadioInterface main_interface; - MMModemAccessTechnology act; /* We do not report per-technology signal quality, so just get the highest * one of the ones reported. */ @@ -1524,8 +1503,6 @@ signal_strength_get_quality_and_access_tech (MMBroadbandModemQmi *self, if (!qmi_dbm_valid (signal_max, main_interface)) return FALSE; - act = mm_modem_access_technology_from_qmi_radio_interface (main_interface); - /* On multimode devices we may get more */ if (qmi_message_nas_get_signal_strength_output_get_strength_list (output, &array, NULL)) { guint i; @@ -1541,7 +1518,6 @@ signal_strength_get_quality_and_access_tech (MMBroadbandModemQmi *self, if (qmi_dbm_valid (element->strength, element->radio_interface)) { signal_max = MAX (element->strength, signal_max); - act |= mm_modem_access_technology_from_qmi_radio_interface (element->radio_interface); } } } @@ -1549,7 +1525,6 @@ signal_strength_get_quality_and_access_tech (MMBroadbandModemQmi *self, if (signal_max < 0) { /* This signal strength comes as negative dBms */ *o_quality = MM_RSSI_TO_QUALITY (signal_max); - *o_act = act; mm_obj_dbg (self, "signal strength: %d dBm --> %u%%", signal_max, *o_quality); } @@ -1566,7 +1541,6 @@ get_signal_strength_ready (QmiClientNas *client, QmiMessageNasGetSignalStrengthOutput *output; GError *error = NULL; guint8 quality = 0; - MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; output = qmi_client_nas_get_signal_strength_finish (client, res, &error); if (!output) { @@ -1584,7 +1558,7 @@ get_signal_strength_ready (QmiClientNas *client, self = g_task_get_source_object (task); - if (!signal_strength_get_quality_and_access_tech (self, output, &quality, &act)) { + if (!signal_strength_get_quality (self, output, &quality)) { qmi_message_nas_get_signal_strength_output_unref (output); g_task_return_new_error (task, MM_CORE_ERROR, @@ -1594,13 +1568,6 @@ get_signal_strength_ready (QmiClientNas *client, return; } - /* We update the access technologies directly here when loading signal - * quality. It goes a bit out of context, but we can do it nicely */ - mm_iface_modem_update_access_technologies ( - MM_IFACE_MODEM (self), - act, - (MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK | MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK)); - g_task_return_int (task, quality); g_object_unref (task); @@ -1616,7 +1583,6 @@ get_signal_info_ready (QmiClientNas *client, QmiMessageNasGetSignalInfoOutput *output; GError *error = NULL; guint8 quality = 0; - MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; self = g_task_get_source_object (task); @@ -1658,7 +1624,7 @@ get_signal_info_ready (QmiClientNas *client, return; } - if (!signal_info_get_quality (self, output, &quality, &act)) { + if (!signal_info_get_quality (self, output, &quality)) { qmi_message_nas_get_signal_info_output_unref (output); g_task_return_new_error (task, MM_CORE_ERROR, @@ -1668,13 +1634,6 @@ get_signal_info_ready (QmiClientNas *client, return; } - /* We update the access technologies directly here when loading signal - * quality. It goes a bit out of context, but we can do it nicely */ - mm_iface_modem_update_access_technologies ( - MM_IFACE_MODEM (self), - act, - (MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK | MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK)); - g_task_return_int (task, quality); g_object_unref (task); @@ -3259,7 +3218,7 @@ common_process_serving_system_3gpp (MMBroadbandModemQmi *self, mm_iface_modem_3gpp_update_5gs_registration_state (MM_IFACE_MODEM_3GPP (self), (mm_access_technologies & MM_MODEM_ACCESS_TECHNOLOGY_5GNR) ? mm_ps_registration_state : MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN); - + mm_iface_modem_3gpp_update_access_technologies (MM_IFACE_MODEM_3GPP (self), mm_access_technologies); /* Get 3GPP location LAC/TAC and CI */ lac = 0; @@ -3282,9 +3241,6 @@ common_process_serving_system_3gpp (MMBroadbandModemQmi *self, * operator name and code is propagated to the DBus interface */ if (operator_updated) mm_iface_modem_3gpp_reload_current_registration_info (MM_IFACE_MODEM_3GPP (self), NULL, NULL); - - /* Note: don't update access technologies with the ones retrieved here; they - * are not really the 'current' access technologies */ } static void @@ -3418,7 +3374,8 @@ process_gsm_info (MMBroadbandModemQmi *self, MMModem3gppRegistrationState *mm_ps_registration_state, guint16 *mm_lac, guint32 *mm_cid, - gchar **mm_operator_id) + gchar **mm_operator_id, + MMModemAccessTechnology *mm_act) { QmiNasServiceStatus service_status; gboolean domain_valid; @@ -3511,6 +3468,8 @@ process_gsm_info (MMBroadbandModemQmi *self, return FALSE; } + *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_GSM; + return TRUE; } @@ -3522,7 +3481,8 @@ process_wcdma_info (MMBroadbandModemQmi *self, MMModem3gppRegistrationState *mm_ps_registration_state, guint16 *mm_lac, guint32 *mm_cid, - gchar **mm_operator_id) + gchar **mm_operator_id, + MMModemAccessTechnology *mm_act) { QmiNasServiceStatus service_status; gboolean domain_valid; @@ -3619,6 +3579,8 @@ process_wcdma_info (MMBroadbandModemQmi *self, return FALSE; } + *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_UMTS; + return TRUE; } @@ -3631,7 +3593,8 @@ process_lte_info (MMBroadbandModemQmi *self, guint16 *mm_lac, guint16 *mm_tac, guint32 *mm_cid, - gchar **mm_operator_id) + gchar **mm_operator_id, + MMModemAccessTechnology *mm_act) { QmiNasServiceStatus service_status; gboolean domain_valid; @@ -3649,6 +3612,7 @@ process_lte_info (MMBroadbandModemQmi *self, gboolean network_id_valid; const gchar *mcc; const gchar *mnc; + gboolean endc_available; g_assert ((response_output != NULL && indication_output == NULL) || (response_output == NULL && indication_output != NULL)); @@ -3683,6 +3647,11 @@ process_lte_info (MMBroadbandModemQmi *self, 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, @@ -3705,6 +3674,11 @@ process_lte_info (MMBroadbandModemQmi *self, 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, @@ -3725,19 +3699,24 @@ process_lte_info (MMBroadbandModemQmi *self, 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) + 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; @@ -3831,6 +3810,8 @@ process_nr5g_info (MMBroadbandModemQmi *self, return FALSE; } + *mm_act |= MM_MODEM_ACCESS_TECHNOLOGY_5GNR; + return TRUE; } @@ -3841,6 +3822,7 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, { MMModem3gppRegistrationState cs_registration_state; MMModem3gppRegistrationState ps_registration_state; + MMModemAccessTechnology act; guint16 lac; guint16 tac; guint32 cid; @@ -3850,6 +3832,7 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, 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; @@ -3865,26 +3848,30 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, &lac, &tac, &cid, - &operator_id)) && + &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)) && + &operator_id, + &act)) && !process_wcdma_info (self, response_output, indication_output, &cs_registration_state, &ps_registration_state, &lac, &cid, - &operator_id) && + &operator_id, + &act) && !process_gsm_info (self, response_output, indication_output, &cs_registration_state, &ps_registration_state, &lac, &cid, - &operator_id)) { + &operator_id, + &act)) { mm_obj_dbg (self, "no service (GSM, WCDMA, LTE or NR5G) reported"); } @@ -3903,6 +3890,7 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self, 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_access_technologies (MM_IFACE_MODEM_3GPP (self), act); mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), lac, tac, cid); } @@ -4337,9 +4325,8 @@ common_process_serving_system_cdma (MMBroadbandModemQmi *self, nid); mm_iface_modem_cdma_update_evdo_registration_state (MM_IFACE_MODEM_CDMA (self), mm_evdo_registration_state); - - /* Note: don't update access technologies with the ones retrieved here; they - * are not really the 'current' access technologies */ + mm_iface_modem_cdma_update_access_technologies (MM_IFACE_MODEM_CDMA (self), + mm_access_technologies); /* Longitude and latitude given in units of 0.25 secs * Note that multiplying by 0.25 is like dividing by 4, so 60*60*4=14400 */ @@ -5756,10 +5743,6 @@ nas_event_report_indication_cb (QmiClientNas *client, quality); mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality); - mm_iface_modem_update_access_technologies ( - MM_IFACE_MODEM (self), - mm_modem_access_technology_from_qmi_radio_interface (signal_strength_radio_interface), - (MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK | MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK)); } else { mm_obj_dbg (self, "ignoring invalid signal strength (%s): %d dBm", qmi_nas_radio_interface_get_string (signal_strength_radio_interface), @@ -5784,7 +5767,6 @@ nas_signal_info_indication_cb (QmiClientNas *client, gint16 nr5g_snr = 10 * SNR_MAX + 10; gint16 nr5g_rsrq = RSRQ_MAX + 1; guint8 quality; - MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; qmi_indication_nas_signal_info_output_get_cdma_signal_strength (output, &cdma1x_rssi, NULL, NULL); qmi_indication_nas_signal_info_output_get_hdr_signal_strength (output, &evdo_rssi, NULL, NULL, NULL, NULL); @@ -5806,13 +5788,8 @@ nas_signal_info_indication_cb (QmiClientNas *client, nr5g_rsrp, nr5g_snr, nr5g_rsrq, - &quality, - &act)) { + &quality)) { mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality); - mm_iface_modem_update_access_technologies ( - MM_IFACE_MODEM (self), - act, - (MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK | MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK)); } } |