aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem-qmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-broadband-modem-qmi.c')
-rw-r--r--src/mm-broadband-modem-qmi.c151
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));
}
}