aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem-mbim.c114
-rw-r--r--src/mm-modem-helpers-mbim.c62
-rw-r--r--src/mm-modem-helpers-mbim.h10
3 files changed, 139 insertions, 47 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 6b88f16c..8b61f1d2 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -2153,7 +2153,15 @@ signal_state_query_ready (MbimDevice *device,
g_autoptr(MbimRsrpSnrInfoArray) rsrp_snr = NULL;
guint32 rsrp_snr_count = 0;
guint32 rssi;
+ guint32 error_rate = 99;
guint quality;
+ MbimDataClass data_class;
+ g_autoptr(MMSignal) cdma = NULL;
+ g_autoptr(MMSignal) evdo = NULL;
+ g_autoptr(MMSignal) gsm = NULL;
+ g_autoptr(MMSignal) umts = NULL;
+ g_autoptr(MMSignal) lte = NULL;
+ g_autoptr(MMSignal) nr5g = NULL;
self = g_task_get_source_object (task);
@@ -2168,7 +2176,7 @@ signal_state_query_ready (MbimDevice *device,
if (!mbim_message_ms_basic_connect_v2_signal_state_response_parse (
response,
&rssi,
- NULL, /* error_rate */
+ &error_rate,
NULL, /* signal_strength_interval */
NULL, /* rssi_threshold */
NULL, /* error_rate_threshold */
@@ -2182,7 +2190,7 @@ signal_state_query_ready (MbimDevice *device,
if (!mbim_message_signal_state_response_parse (
response,
&rssi,
- NULL, /* error_rate */
+ &error_rate,
NULL, /* signal_strength_interval */
NULL, /* rssi_threshold */
NULL, /* error_rate_threshold */
@@ -2195,6 +2203,14 @@ signal_state_query_ready (MbimDevice *device,
if (error)
g_task_return_error (task, error);
else {
+ /* Best guess of current data class */
+ data_class = self->priv->highest_available_data_class;
+ if (data_class == 0)
+ data_class = self->priv->available_data_classes;
+ if (mm_signal_from_mbim_signal_state (data_class, rssi, error_rate, rsrp_snr, rsrp_snr_count,
+ self, &cdma, &evdo, &gsm, &umts, &lte, &nr5g))
+ mm_iface_modem_signal_update (MM_IFACE_MODEM_SIGNAL (self), cdma, evdo, gsm, umts, lte, nr5g);
+
quality = mm_signal_quality_from_mbim_signal_state (rssi, rsrp_snr, rsrp_snr_count, self);
g_task_return_int (task, quality);
}
@@ -4438,6 +4454,41 @@ modem_3gpp_set_nr5g_registration_settings (MMIfaceModem3gpp *_self,
/* Signal state updates */
static void
+atds_signal_query_after_indication_ready (MbimDevice *device,
+ GAsyncResult *res,
+ MMBroadbandModemMbim *_self) /* full reference! */
+{
+ g_autoptr(MMBroadbandModemMbim) self = _self;
+ g_autoptr(MbimMessage) response = NULL;
+ g_autoptr(MMSignal) gsm = NULL;
+ g_autoptr(MMSignal) umts = NULL;
+ g_autoptr(MMSignal) lte = NULL;
+ g_autoptr(GError) error = NULL;
+ guint32 rssi;
+ guint32 error_rate;
+ guint32 rscp;
+ guint32 ecno;
+ guint32 rsrq;
+ guint32 rsrp;
+ guint32 snr;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response ||
+ !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) ||
+ !mbim_message_atds_signal_response_parse (response, &rssi, &error_rate, &rscp, &ecno, &rsrq, &rsrp, &snr, &error)) {
+ mm_obj_warn (self, "ATDS signal query failed: %s", error->message);
+ return;
+ }
+
+ if (!mm_signal_from_atds_signal_response (rssi, rscp, ecno, rsrq, rsrp, snr, &gsm, &umts, &lte)) {
+ mm_obj_warn (self, "No signal details given");
+ return;
+ }
+
+ mm_iface_modem_signal_update (MM_IFACE_MODEM_SIGNAL (self), NULL, NULL, gsm, umts, lte, NULL);
+}
+
+static void
basic_connect_notification_signal_state (MMBroadbandModemMbim *self,
MbimDevice *device,
MbimMessage *notification)
@@ -4446,7 +4497,7 @@ basic_connect_notification_signal_state (MMBroadbandModemMbim *self,
g_autoptr(MbimRsrpSnrInfoArray) rsrp_snr = NULL;
guint32 rsrp_snr_count = 0;
guint32 coded_rssi;
- guint32 coded_error_rate;
+ guint32 coded_error_rate = 99;
guint32 quality;
MbimDataClass data_class;
g_autoptr(MMSignal) cdma = NULL;
@@ -4484,6 +4535,18 @@ basic_connect_notification_signal_state (MMBroadbandModemMbim *self,
return;
}
mm_obj_dbg (self, "processed signal state indication");
+ if (self->priv->is_atds_signal_supported) {
+ g_autoptr(MbimMessage) message = NULL;
+
+ mm_obj_dbg (self, "triggering ATDS signal query");
+ message = mbim_message_atds_signal_query_new (NULL);
+ mbim_device_command (device,
+ message,
+ 5,
+ NULL,
+ (GAsyncReadyCallback)atds_signal_query_after_indication_ready,
+ g_object_ref (self));
+ }
}
quality = mm_signal_quality_from_mbim_signal_state (coded_rssi, rsrp_snr, rsrp_snr_count, self);
@@ -6566,50 +6629,7 @@ atds_signal_query_ready (MbimDevice *device,
result = g_slice_new0 (SignalLoadValuesResult);
- if (rscp <= 96) {
- result->umts = mm_signal_new ();
- mm_signal_set_rscp (result->umts, -120.0 + rscp);
- }
-
- if (ecno <= 49) {
- if (!result->umts)
- result->umts = mm_signal_new ();
- mm_signal_set_ecio (result->umts, -24.0 + ((gdouble) ecno / 2));
- }
-
- if (rsrq <= 34) {
- result->lte = mm_signal_new ();
- mm_signal_set_rsrq (result->lte, -19.5 + ((gdouble) rsrq / 2));
- }
-
- if (rsrp <= 97) {
- if (!result->lte)
- result->lte = mm_signal_new ();
- mm_signal_set_rsrp (result->lte, -140.0 + rsrp);
- }
-
- if (snr <= 35) {
- if (!result->lte)
- result->lte = mm_signal_new ();
- mm_signal_set_snr (result->lte, -5.0 + snr);
- }
-
- /* RSSI may be given for all 2G, 3G or 4G so we detect to which one applies */
- if (rssi <= 31) {
- gdouble value;
-
- value = -113.0 + (2 * rssi);
- if (result->lte)
- mm_signal_set_rssi (result->lte, value);
- else if (result->umts)
- mm_signal_set_rssi (result->umts, value);
- else {
- result->gsm = mm_signal_new ();
- mm_signal_set_rssi (result->gsm, value);
- }
- }
-
- if (!result->gsm && !result->umts && !result->lte) {
+ if (!mm_signal_from_atds_signal_response (rssi, rscp, ecno, rsrq, rsrp, snr, &result->gsm, &result->umts, &result->lte)) {
signal_load_values_result_free (result);
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"No signal details given");
diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c
index 7db91e5c..2c19f7bd 100644
--- a/src/mm-modem-helpers-mbim.c
+++ b/src/mm-modem-helpers-mbim.c
@@ -1247,6 +1247,68 @@ mm_signal_from_mbim_signal_state (MbimDataClass data_class,
return TRUE;
}
+gboolean
+mm_signal_from_atds_signal_response (guint32 rssi,
+ guint32 rscp,
+ guint32 ecno,
+ guint32 rsrq,
+ guint32 rsrp,
+ guint32 snr,
+ MMSignal **out_gsm,
+ MMSignal **out_umts,
+ MMSignal **out_lte)
+{
+
+ if (rscp <= 96) {
+ *out_umts = mm_signal_new ();
+ mm_signal_set_rscp (*out_umts, -120.0 + rscp);
+ }
+
+ if (ecno <= 49) {
+ if (!*out_umts)
+ *out_umts = mm_signal_new ();
+ mm_signal_set_ecio (*out_umts, -24.0 + ((gdouble) ecno / 2));
+ }
+
+ if (rsrq <= 34) {
+ *out_lte = mm_signal_new ();
+ mm_signal_set_rsrq (*out_lte, -19.5 + ((gdouble) rsrq / 2));
+ }
+
+ if (rsrp <= 97) {
+ if (!*out_lte)
+ *out_lte = mm_signal_new ();
+ mm_signal_set_rsrp (*out_lte, -140.0 + rsrp);
+ }
+
+ if (snr <= 35) {
+ if (!*out_lte)
+ *out_lte = mm_signal_new ();
+ mm_signal_set_snr (*out_lte, -5.0 + snr);
+ }
+
+ /* RSSI may be given for all 2G, 3G or 4G so we detect to which one applies */
+ if (rssi <= 31) {
+ gdouble value;
+
+ value = -113.0 + (2 * rssi);
+ if (*out_lte)
+ mm_signal_set_rssi (*out_lte, value);
+ else if (*out_umts)
+ mm_signal_set_rssi (*out_umts, value);
+ else {
+ *out_gsm = mm_signal_new ();
+ mm_signal_set_rssi (*out_gsm, value);
+ }
+ }
+
+ if (!out_gsm && !out_umts && !out_lte) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/*****************************************************************************/
void
diff --git a/src/mm-modem-helpers-mbim.h b/src/mm-modem-helpers-mbim.h
index e07cff62..95501a60 100644
--- a/src/mm-modem-helpers-mbim.h
+++ b/src/mm-modem-helpers-mbim.h
@@ -144,6 +144,16 @@ gboolean mm_signal_from_mbim_signal_state (MbimDataClass data_class,
MMSignal **out_lte,
MMSignal **out_nr5g);
+gboolean mm_signal_from_atds_signal_response (guint32 rssi,
+ guint32 rscp,
+ guint32 ecno,
+ guint32 rsrq,
+ guint32 rsrp,
+ guint32 snr,
+ MMSignal **out_gsm,
+ MMSignal **out_umts,
+ MMSignal **out_lte);
+
/*****************************************************************************/
/* RF utilities */
/*****************************************************************************/