diff options
author | Dan Williams <dcbw@redhat.com> | 2015-09-24 14:54:45 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2015-09-24 14:54:45 -0500 |
commit | 7cb3b3faad7043374b01c96e875ba10694b40517 (patch) | |
tree | 4d4abcf96501b23e1f9282decf23b92025a5020d | |
parent | a8666bd98f4cdd4c4cad7e40ef48e9980717705f (diff) |
broadband-modem-qmi: update access technology from signal info for newest QMI commands
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 171 |
1 files changed, 96 insertions, 75 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 4816df3b..4c721ae0 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -2224,54 +2224,97 @@ load_signal_quality_finish (MMIfaceModem *self, #if defined WITH_NEWEST_QMI_COMMANDS static gboolean -signal_info_get_quality (MMBroadbandModemQmi *self, - QmiMessageNasGetSignalInfoOutput *output, - gint8 *out_quality) +common_signal_info_get_quality (gint8 cdma1x_rssi, + gint8 evdo_rssi, + gint8 gsm_rssi, + gint8 wcdma_rssi, + gint8 lte_rssi, + gint8 *out_quality, + MMModemAccessTechnology *out_act) { gint8 rssi_max = -125; - gint8 rssi; + 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. */ + * one of the ones reported. TODO: When several technologies are in use, if + * the indication only contains the data of the one which passed a threshold + * value, we'll need to have an internal cache of per-technology values, in + * order to report always the one with the maximum value. */ + + if (cdma1x_rssi < 0) { + mm_dbg ("RSSI (CDMA): %d dBm", cdma1x_rssi); + 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 (qmi_message_nas_get_signal_info_output_get_cdma_signal_strength (output, &rssi, NULL, NULL)) { - mm_dbg ("RSSI (CDMA): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1X)) - rssi_max = MAX (rssi, rssi_max); + if (evdo_rssi < 0) { + mm_dbg ("RSSI (HDR): %d dBm", evdo_rssi); + 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 (qmi_message_nas_get_signal_info_output_get_hdr_signal_strength (output, &rssi, NULL, NULL, NULL, NULL)) { - mm_dbg ("RSSI (HDR): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO)) - rssi_max = MAX (rssi, rssi_max); + if (gsm_rssi < 0) { + mm_dbg ("RSSI (GSM): %d dBm", gsm_rssi); + 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 (qmi_message_nas_get_signal_info_output_get_gsm_signal_strength (output, &rssi, NULL)) { - mm_dbg ("RSSI (GSM): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_GSM)) - rssi_max = MAX (rssi, rssi_max); + if (wcdma_rssi < 0) { + mm_dbg ("RSSI (WCDMA): %d dBm", wcdma_rssi); + 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 (qmi_message_nas_get_signal_info_output_get_wcdma_signal_strength (output, &rssi, NULL, NULL)) { - mm_dbg ("RSSI (WCDMA): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_UMTS)) - rssi_max = MAX (rssi, rssi_max); + if (lte_rssi < 0) { + mm_dbg ("RSSI (LTE): %d dBm", lte_rssi); + 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 (qmi_message_nas_get_signal_info_output_get_lte_signal_strength (output, &rssi, NULL, NULL, NULL, NULL)) { - mm_dbg ("RSSI (LTE): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_LTE)) - rssi_max = MAX (rssi, rssi_max); + if (rssi_max < 0 && rssi_max > -125) { + /* This RSSI comes as negative dBms */ + *out_quality = STRENGTH_TO_QUALITY (rssi_max); + *out_act = mm_modem_access_technology_from_qmi_radio_interface (signal_info_radio_interface); + + mm_dbg ("RSSI: %d dBm --> %u%%", rssi_max, *out_quality); + return TRUE; } - /* This RSSI comes as negative dBms */ - *out_quality = STRENGTH_TO_QUALITY (rssi_max); + return FALSE; +} + +static gboolean +signal_info_get_quality (MMBroadbandModemQmi *self, + QmiMessageNasGetSignalInfoOutput *output, + gint8 *out_quality, + MMModemAccessTechnology *out_act) +{ + gint8 cdma1x_rssi = 0; + gint8 evdo_rssi = 0; + gint8 gsm_rssi = 0; + gint8 umts_rssi = 0; + gint8 lte_rssi = 0; - mm_dbg ("RSSI: %d dBm --> %u%%", rssi_max, *out_quality); + qmi_message_nas_get_signal_info_output_get_cdma_signal_strength (output, &cdma1x_rssi, NULL, NULL); + qmi_message_nas_get_signal_info_output_get_hdr_signal_strength (output, &evdo_rssi, NULL, NULL, NULL, NULL); + qmi_message_nas_get_signal_info_output_get_gsm_signal_strength (output, &gsm_rssi, NULL); + qmi_message_nas_get_signal_info_output_get_wcdma_signal_strength (output, &wcdma_rssi, NULL, NULL); + qmi_message_nas_get_signal_info_output_get_lte_signal_strength (output, <e_rssi, NULL, NULL, NULL, NULL); - return (rssi_max > -125); + return common_signal_info_get_quality (cdma1x_rssi, evdo_rssi, gsm_rssi, wcdma_rssi, lte_rssi, out_quality, out_act); } static void @@ -6498,55 +6541,33 @@ signal_info_indication_cb (QmiClientNas *client, QmiIndicationNasSignalInfoOutput *output, MMBroadbandModemQmi *self) { - gint8 rssi_max = -125; - gint8 rssi; + gint8 cdma1x_rssi = 0; + gint8 evdo_rssi = 0; + gint8 gsm_rssi = 0; + gint8 umts_rssi = 0; + gint8 lte_rssi = 0; guint8 quality; + MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; - /* 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 - * the indication only contains the data of the one which passed a threshold - * value, we'll need to have an internal cache of per-technology values, in - * order to report always the one with the maximum value. */ - - if (qmi_indication_nas_signal_info_output_get_cdma_signal_strength (output, &rssi, NULL, NULL)) { - mm_dbg ("RSSI (CDMA): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1X)) - rssi_max = MAX (rssi, rssi_max); - } - - if (qmi_indication_nas_signal_info_output_get_hdr_signal_strength (output, &rssi, NULL, NULL, NULL, NULL)) { - mm_dbg ("RSSI (HDR): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO)) - rssi_max = MAX (rssi, rssi_max); - } - - if (qmi_indication_nas_signal_info_output_get_gsm_signal_strength (output, &rssi, NULL)) { - mm_dbg ("RSSI (GSM): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_GSM)) - rssi_max = MAX (rssi, rssi_max); - } - - if (qmi_indication_nas_signal_info_output_get_wcdma_signal_strength (output, &rssi, NULL, NULL)) { - mm_dbg ("RSSI (WCDMA): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_UMTS)) - rssi_max = MAX (rssi, rssi_max); - } - - if (qmi_indication_nas_signal_info_output_get_lte_signal_strength (output, &rssi, NULL, NULL, NULL, NULL)) { - mm_dbg ("RSSI (LTE): %d dBm", rssi); - if (qmi_dbm_valid (rssi, QMI_NAS_RADIO_INTERFACE_LTE)) - rssi_max = MAX (rssi, rssi_max); - } - - if (rssi_max < 0) { - /* This RSSI comes as negative dBms */ - quality = STRENGTH_TO_QUALITY (rssi_max); - - mm_dbg ("RSSI: %d dBm --> %u%%", rssi_max, quality); - + 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); + qmi_indication_nas_signal_info_output_get_gsm_signal_strength (output, &gsm_rssi, NULL); + qmi_indication_nas_signal_info_output_get_wcdma_signal_strength (output, &wcdma_rssi, NULL, NULL); + qmi_indication_nas_signal_info_output_get_lte_signal_strength (output, <e_rssi, NULL, NULL, NULL, NULL); + + if (common_signal_info_get_quality (cdma1x_rssi, + evdo_rssi, + gsm_rssi, + wcdma_rssi, + lte_rssi, + &quality, + &access_technology)) { mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality); - } else - mm_dbg ("Ignoring invalid signal strength: %d dBm", rssi_max); + mm_iface_modem_update_access_technologies ( + MM_IFACE_MODEM (self), + access_technology, + (MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK | MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK)); + } } #endif /* WITH_NEWEST_QMI_COMMANDS */ |