diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2023-05-11 11:18:56 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2023-05-11 11:18:56 +0000 |
commit | 470dff235c70683928ab0eb39c64151a8a4ceb7c (patch) | |
tree | 4021c981a1522d5638c7c54ed2c88f6bb82746c5 | |
parent | d3deb0ef0b0a2d3cb703212ca932f40addfcf269 (diff) | |
download | ModemManager-470dff235c70683928ab0eb39c64151a8a4ceb7c.tar.gz |
broadband-modem-mbim: use MBIMEx v2 signal loading explicitly if supported
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 6c6536f1b..293ecca63 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -6745,6 +6745,73 @@ parent_signal_load_values_ready (MMIfaceModemSignal *self, } static void +mbimexv2_signal_state_query_ready (MbimDevice *device, + GAsyncResult *res, + GTask *task) +{ + MMBroadbandModemMbim *self; + GError *error = NULL; + SignalLoadValuesResult *result; + g_autoptr(MbimMessage) response = NULL; + g_autoptr(MbimRsrpSnrInfoArray) rsrp_snr = NULL; + guint32 rsrp_snr_count = 0; + guint32 rssi; + guint32 error_rate = 99; + MbimDataClass data_class; + + self = g_task_get_source_object (task); + + response = mbim_device_command_finish (device, res, &error); + if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + if (!mbim_device_check_ms_mbimex_version (device, 2, 0)) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Failed MBIMEx v2.0 signal state response support check"); + g_object_unref (task); + return; + } + + if (!mbim_message_ms_basic_connect_v2_signal_state_response_parse ( + response, + &rssi, + &error_rate, + NULL, /* signal_strength_interval */ + NULL, /* rssi_threshold */ + NULL, /* error_rate_threshold */ + &rsrp_snr_count, + &rsrp_snr, + &error)) { + g_prefix_error (&error, "Failed processing MBIMEx v2.0 signal state response: "); + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + result = g_slice_new0 (SignalLoadValuesResult); + + /* Best guess of current data class */ + data_class = self->priv->enabled_cache.highest_available_data_class; + if (data_class == 0) + data_class = self->priv->enabled_cache.available_data_classes; + if (!mm_signal_from_mbim_signal_state ( + data_class, rssi, error_rate, rsrp_snr, rsrp_snr_count, self, + NULL, NULL, &result->gsm, &result->umts, &result->lte, &result->nr5g)) { + signal_load_values_result_free (result); + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "No signal details given"); + g_object_unref (task); + return; + } + + g_task_return_pointer (task, result, (GDestroyNotify) signal_load_values_result_free); + g_object_unref (task); +} + +static void modem_signal_load_values (MMIfaceModemSignal *self, GCancellable *cancellable, GAsyncReadyCallback callback, @@ -6759,6 +6826,18 @@ modem_signal_load_values (MMIfaceModemSignal *self, task = g_task_new (self, NULL, callback, user_data); + if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + message = mbim_message_signal_state_query_new (NULL); + mbim_device_command (device, + message, + 5, + NULL, + (GAsyncReadyCallback)mbimexv2_signal_state_query_ready, + task); + mbim_message_unref (message); + return; + } + if (MM_BROADBAND_MODEM_MBIM (self)->priv->is_atds_signal_supported) { message = mbim_message_atds_signal_query_new (NULL); mbim_device_command (device, |