aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-mbim.c117
1 files changed, 81 insertions, 36 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 81faca61..218cf597 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -1694,34 +1694,59 @@ modem_load_signal_quality_finish (MMIfaceModem *self,
}
static void
-signal_state_query_ready (MbimDevice *device,
+signal_state_query_ready (MbimDevice *device,
GAsyncResult *res,
- GTask *task)
+ GTask *task)
{
- MbimMessage *response;
- GError *error = NULL;
- guint32 rssi;
+ g_autoptr(MbimMessage) response = NULL;
+ MMBroadbandModemMbim *self;
+ GError *error = NULL;
+ guint32 rssi;
+
+ 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) &&
- mbim_message_signal_state_response_parse (
- response,
- &rssi,
- NULL, /* error_rate */
- NULL, /* signal_strength_interval */
- NULL, /* rssi_threshold */
- NULL, /* error_rate_threshold */
- &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)) {
+ if (!mbim_message_ms_basic_connect_v2_signal_state_response_parse (
+ response,
+ &rssi,
+ NULL, /* error_rate */
+ NULL, /* signal_strength_interval */
+ NULL, /* rssi_threshold */
+ NULL, /* error_rate_threshold */
+ NULL, /* rsrp_snr_count */
+ NULL, /* rsrp_snr */
+ &error))
+ g_prefix_error (&error, "Failed processing MBIMEx v2.0 signal state response: ");
+ else
+ mm_obj_dbg (self, "proccessed MBIMEx v2.0 signal state response");
+ } else {
+ if (!mbim_message_signal_state_response_parse (
+ response,
+ &rssi,
+ NULL, /* error_rate */
+ NULL, /* signal_strength_interval */
+ NULL, /* rssi_threshold */
+ NULL, /* error_rate_threshold */
+ &error))
+ g_prefix_error (&error, "Failed processing signal state response: ");
+ else
+ mm_obj_dbg (self, "proccessed signal state response");
+ }
+
+ if (error)
+ g_task_return_error (task, error);
+ else
/* Normalize the quality. 99 means unknown, we default it to 0 */
g_task_return_int (task, MM_CLAMP_HIGH (rssi == 99 ? 0 : rssi, 31) * 100 / 31);
- } else
- g_task_return_error (task, error);
g_object_unref (task);
-
- if (response)
- mbim_message_unref (response);
}
static void
@@ -3225,24 +3250,44 @@ basic_connect_notification_signal_state (MMBroadbandModemMbim *self,
MbimDevice *device,
MbimMessage *notification)
{
- guint32 rssi;
-
- if (mbim_message_signal_state_notification_parse (
- notification,
- &rssi,
- NULL, /* error_rate */
- NULL, /* signal_strength_interval */
- NULL, /* rssi_threshold */
- NULL, /* error_rate_threshold */
- NULL)) {
- guint32 quality;
-
- /* Normalize the quality. 99 means unknown, we default it to 0 */
- quality = MM_CLAMP_HIGH (rssi == 99 ? 0 : rssi, 31) * 100 / 31;
+ g_autoptr(GError) error = NULL;
+ guint32 rssi;
+ guint32 quality;
- mm_obj_dbg (self, "signal state indication: %u --> %u%%", rssi, quality);
- mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
+ if (mbim_device_check_ms_mbimex_version (device, 2, 0)) {
+ if (!mbim_message_ms_basic_connect_v2_signal_state_notification_parse (
+ notification,
+ &rssi,
+ NULL, /* error_rate */
+ NULL, /* signal_strength_interval */
+ NULL, /* rssi_threshold */
+ NULL, /* error_rate_threshold */
+ NULL, /* rsrp_snr_count */
+ NULL, /* rsrp_snr */
+ &error)) {
+ mm_obj_warn (self, "failed processing MBIMEx v2.0 signal state indication: %s", error->message);
+ return;
+ }
+ mm_obj_dbg (self, "proccessed MBIMEx v2.0 signal state indication");
+ } else {
+ if (!mbim_message_signal_state_notification_parse (
+ notification,
+ &rssi,
+ NULL, /* error_rate */
+ NULL, /* signal_strength_interval */
+ NULL, /* rssi_threshold */
+ NULL, /* error_rate_threshold */
+ &error)) {
+ mm_obj_warn (self, "failed processing signal state indication: %s", error->message);
+ return;
+ }
+ mm_obj_dbg (self, "proccessed signal state indication");
}
+
+ /* 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 (self, "signal state indication: %u --> %u%%", rssi, quality);
+ mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
}
static void