aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem-helpers-mbim.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-10-17 22:27:49 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-10-18 00:04:59 +0200
commitd6aa72736610865729625e295ff39128c7dd4b17 (patch)
tree0d8c96d6fd2698c22b890a5e11d537fe7cc147e5 /src/mm-modem-helpers-mbim.c
parentc01f22804e0e4ac35216208e4a38da02cc56290c (diff)
broadband-modem-mbim: fix signal quality reporting with MBIMEx v2.0
When we enable MBIMEx v2.0, the "Signal State" responses and indications no longer report a valid RSSI value; and instead, they report per access technology RSRP/RSRQ values. >>>>>> Header: >>>>>> length = 116 >>>>>> type = indicate-status (0x80000007) >>>>>> transaction = 0 >>>>>> Fragment header: >>>>>> total = 1 >>>>>> current = 0 >>>>>> Contents: >>>>>> service = 'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df) >>>>>> cid = 'signal-state' (0x0000000b) >>>>>> Fields: >>>>>> Rssi = '99' >>>>>> ErrorRate = '99' >>>>>> SignalStrengthInterval = '5' >>>>>> RssiThreshold = '2' >>>>>> ErrorRateThreshold = '4294967295' >>>>>> RsrpSnr = '{ >>>>>> [0] = { >>>>>> Rsrp = '0' >>>>>> Snr = '0' >>>>>> RsrpThreshold = '4294967295' >>>>>> SnrThreshold = '4294967295' >>>>>> SystemType = '5g-nsa' >>>>>> }, >>>>>> [1] = { >>>>>> Rsrp = '49' >>>>>> Snr = '45' >>>>>> RsrpThreshold = '4294967295' >>>>>> SnrThreshold = '4294967295' >>>>>> SystemType = 'lte' >>>>>> }, >>>>>> }'
Diffstat (limited to 'src/mm-modem-helpers-mbim.c')
-rw-r--r--src/mm-modem-helpers-mbim.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c
index a1debd00..8d05227a 100644
--- a/src/mm-modem-helpers-mbim.c
+++ b/src/mm-modem-helpers-mbim.c
@@ -503,3 +503,44 @@ mm_sms_state_from_mbim_message_status (MbimSmsStatus status)
return MM_SMS_STATE_UNKNOWN;
}
+/*****************************************************************************/
+
+guint
+mm_signal_quality_from_mbim_signal_state (guint rssi,
+ MbimRsrpSnrInfoArray *rsrp_snr,
+ guint32 rsrp_snr_count,
+ gpointer log_object)
+{
+ guint quality;
+
+ /* When MBIMEx is enabled we may get RSSI unset, but per access technology
+ * RSRP available. When more than one access technology in use (e.g. 4G+5G in
+ * 5G NSA), take the highest RSRP value reported. */
+ if (rssi == 99 && rsrp_snr && rsrp_snr_count) {
+ guint i;
+ gint max_rsrp = G_MININT;
+
+ for (i = 0; i < rsrp_snr_count; i++) {
+ MbimRsrpSnrInfo *info;
+
+ info = rsrp_snr[i];
+ /* scale the value to dBm */
+ if (info->rsrp < 127) {
+ gint rsrp;
+
+ rsrp = -157 + info->rsrp;
+ if (rsrp > max_rsrp)
+ max_rsrp = rsrp;
+ }
+ }
+ quality = MM_RSRP_TO_QUALITY (max_rsrp);
+ mm_obj_dbg (log_object, "signal state update: %ddBm --> %u%%", max_rsrp, quality);
+ } else {
+ /* Normalize the quality. 99 means unknown, we default it to 0 */
+ quality = MM_CLAMP_HIGH (rssi == 99 ? 0 : rssi, 31) * 100 / 31;
+ mm_obj_dbg (log_object, "signal state update: %u --> %u%%", rssi, quality);
+ }
+
+ return quality;
+}
+