diff options
author | Nagi Marupaka <nmarupaka@google.com> | 2023-02-28 16:28:36 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2023-02-28 17:32:58 +0000 |
commit | 3a76cb29ef57b85d0243298bfeb926f6400af81a (patch) | |
tree | d935936d30ffe0128423003d4ea8bfac31e7253c /src/mm-modem-helpers-mbim.c | |
parent | dee307d2cf9b80b2ec8f1769c83e20ce7bcc4c8b (diff) |
broadband-modem-mbim: add support for setting up thresholds on v1 MBIM modems
On MBIM modems that do not support mbimex v2, extra steps are required
to retrieve 3G/4G signal quality markers from the modem when using
thresholds to trigger signal quality indications.
Diffstat (limited to 'src/mm-modem-helpers-mbim.c')
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 62 |
1 files changed, 62 insertions, 0 deletions
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 |