diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-17 22:54:14 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-19 08:27:23 +0000 |
commit | c091860618b3150fc6bc4b24527408234a2f00ad (patch) | |
tree | 9547db95bffee1e7d0ee9a3039afd12b75e68d2d | |
parent | af7d488325c788814e27fbd1c5c6cadfeb04663e (diff) |
broadband-modem-mbim: sync current modes and registration requests
In MBIM we use the same "Register State Set Request" for 2 different
things: configuring the allowed modes, and selecting the operator to
use (manual/automatic).
We need to keep track of which were the last things requested by the
user so that we don't overwrite previous user actions when we process
newer ones.
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 2d3e6d63..bb804a9d 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -133,8 +133,10 @@ struct _MMBroadbandModemMbimPrivate { GList *pco_list; /* 3GPP registration helpers */ - gchar *current_operator_id; - gchar *current_operator_name; + gchar *current_operator_id; + gchar *current_operator_name; + gchar *requested_operator_id; + MbimDataClass requested_data_class; /* 0 for defaults/auto */ /* USSD helpers */ GTask *pending_ussd_action; @@ -1251,20 +1253,21 @@ modem_set_current_modes (MMIfaceModem *_self, if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { g_autoptr(MbimMessage) message = NULL; - MbimDataClass data_class; /* Limit ANY to the currently supported modes */ if (allowed == MM_MODEM_MODE_ANY) allowed = mm_modem_mode_from_mbim_data_class (self->priv->caps_data_class); - data_class = mm_mbim_data_class_from_modem_mode (allowed, - mm_iface_modem_is_3gpp (_self), - mm_iface_modem_is_cdma (_self)); - g_task_set_task_data (task, GUINT_TO_POINTER (data_class), NULL); + self->priv->requested_data_class = mm_mbim_data_class_from_modem_mode (allowed, + mm_iface_modem_is_3gpp (_self), + mm_iface_modem_is_cdma (_self)); + g_task_set_task_data (task, GUINT_TO_POINTER (self->priv->requested_data_class), NULL); + /* use the last requested operator id to determine whether the + * registration should be manual or automatic */ message = mbim_message_register_state_set_new ( - NULL, - MBIM_REGISTER_ACTION_AUTOMATIC, - data_class, + self->priv->requested_operator_id ? self->priv->requested_operator_id : "", + self->priv->requested_operator_id ? MBIM_REGISTER_ACTION_MANUAL : MBIM_REGISTER_ACTION_AUTOMATIC, + self->priv->requested_data_class, NULL); mbim_device_command (device, message, @@ -5004,23 +5007,24 @@ register_state_set_ready (MbimDevice *device, } static void -modem_3gpp_register_in_network (MMIfaceModem3gpp *self, +modem_3gpp_register_in_network (MMIfaceModem3gpp *_self, const gchar *operator_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - MbimDevice *device; - MbimMessage *message; - GTask *task; + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self); + MbimDevice *device; + GTask *task; + g_autoptr(MbimMessage) message = NULL; #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED /* data_class set to 0 in the MBIM register state set message ends up * selecting some "auto" mode that would overwrite whatever capabilities * and modes we had set. So, if we're using QMI-based capability and * mode switching, also use QMI-based network registration. */ - if (MM_BROADBAND_MODEM_MBIM (self)->priv->qmi_capability_and_mode_switching) { - mm_shared_qmi_3gpp_register_in_network (self, operator_id, cancellable, callback, user_data); + if (self->priv->qmi_capability_and_mode_switching) { + mm_shared_qmi_3gpp_register_in_network (_self, operator_id, cancellable, callback, user_data); return; } #endif @@ -5030,25 +5034,22 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *self, task = g_task_new (self, NULL, callback, user_data); + /* keep track of which operator id is selected */ + g_clear_pointer (&self->priv->requested_operator_id, g_free); if (operator_id && operator_id[0]) - message = (mbim_message_register_state_set_new ( - operator_id, - MBIM_REGISTER_ACTION_MANUAL, - 0, /* data_class, none preferred */ - NULL)); - else - message = (mbim_message_register_state_set_new ( - "", - MBIM_REGISTER_ACTION_AUTOMATIC, - 0, /* data_class, none preferred */ - NULL)); + self->priv->requested_operator_id = g_strdup (operator_id); + + message = (mbim_message_register_state_set_new ( + self->priv->requested_operator_id ? self->priv->requested_operator_id : "", + self->priv->requested_operator_id ? MBIM_REGISTER_ACTION_MANUAL : MBIM_REGISTER_ACTION_AUTOMATIC, + self->priv->requested_data_class, + NULL)); mbim_device_command (device, message, 60, NULL, (GAsyncReadyCallback)register_state_set_ready, task); - mbim_message_unref (message); } /*****************************************************************************/ @@ -7560,6 +7561,7 @@ finalize (GObject *object) g_free (self->priv->caps_hardware_info); g_free (self->priv->current_operator_id); g_free (self->priv->current_operator_name); + g_free (self->priv->requested_operator_id); g_list_free_full (self->priv->pco_list, g_object_unref); G_OBJECT_CLASS (mm_broadband_modem_mbim_parent_class)->finalize (object); |