diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-17 22:27:49 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-18 00:04:59 +0200 |
commit | d6aa72736610865729625e295ff39128c7dd4b17 (patch) | |
tree | 0d8c96d6fd2698c22b890a5e11d537fe7cc147e5 /src/mm-modem-helpers-mbim.c | |
parent | c01f22804e0e4ac35216208e4a38da02cc56290c (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.c | 41 |
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; +} + |