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 /src | |
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.
Diffstat (limited to 'src')
-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); |