broadband-modem-qmi: update access technology from signal info for newest QMI commands

This commit is contained in:
Dan Williams
2015-09-24 14:54:45 -05:00
parent a8666bd98f
commit 7cb3b3faad

View File

@@ -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 (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 (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_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 (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_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 (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_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 (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_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 (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 (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;
}
return (rssi_max > -125);
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;
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, &lte_rssi, NULL, NULL, NULL, NULL);
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, &lte_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 */