aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-mbim.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 29b845b0..b3137089 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -170,8 +170,9 @@ struct _MMBroadbandModemMbimPrivate {
gboolean intel_firmware_update_unsupported;
/* Multi-SIM support */
- guint32 executor_index;
- guint active_slot_index;
+ guint32 executor_index;
+ guint active_slot_index;
+ gboolean pending_sim_slot_switch_action;
MMUnlockRetries *unlock_retries;
};
@@ -4671,6 +4672,7 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
MbimSubscriberReadyState ready_state;
g_auto(GStrv) telephone_numbers = NULL;
g_autoptr(GError) error = NULL;
+ gboolean active_sim_event = FALSE;
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_notification_parse (
@@ -4712,7 +4714,7 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
ready_state != MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE)) {
/* eSIM profiles have been added or removed, re-probe to ensure correct interfaces are exposed */
mm_obj_dbg (self, "eSIM profile updates detected");
- mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
+ active_sim_event = TRUE;
}
if ((self->priv->last_ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
@@ -4721,10 +4723,17 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED)) {
/* SIM has been removed or reinserted, re-probe to ensure correct interfaces are exposed */
mm_obj_dbg (self, "SIM hot swap detected");
- mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
+ active_sim_event = TRUE;
}
self->priv->last_ready_state = ready_state;
+
+ if (active_sim_event) {
+ if (self->priv->pending_sim_slot_switch_action)
+ mm_obj_dbg (self, "ignoring slot status change");
+ else
+ mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
+ }
}
typedef struct {
@@ -5227,19 +5236,26 @@ ms_basic_connect_extensions_notification_slot_info_status (MMBroadbandModemMbim
return;
}
- if (self->priv->active_slot_index == slot_index + 1) {
- /* Major SIM event on the active slot, will request reprobing the
- * modem from scratch. */
- mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
- } else {
+ if (self->priv->pending_sim_slot_switch_action) {
+ mm_obj_dbg (self, "ignoring slot status change in SIM slot %d: %s", slot_index + 1, mbim_uicc_slot_state_get_string (slot_state));
+ return;
+ }
+
+ if (self->priv->active_slot_index != (slot_index + 1)) {
/* Modifies SIM object at the given slot based on the reported state,
* when the slot is not the active one. */
g_autoptr(MMBaseSim) sim = NULL;
- mm_obj_dbg (self, "Updating inactive sim at slot %d", slot_index + 1);
+ mm_obj_dbg (self, "processing slot status change in non-active SIM slot %d: %s", slot_index + 1, mbim_uicc_slot_state_get_string (slot_state));
sim = create_sim_from_slot_state (self, FALSE, slot_index, slot_state);
mm_iface_modem_modify_sim (MM_IFACE_MODEM (self), slot_index, sim);
+ return;
}
+
+ /* Major SIM event on the active slot, will request reprobing the
+ * modem from scratch. */
+ mm_obj_dbg (self, "processing slot status change in active SIM slot %d: %s", slot_index + 1, mbim_uicc_slot_state_get_string (slot_state));
+ mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
}
static void
@@ -8721,6 +8737,9 @@ set_device_slot_mappings_ready (MbimDevice *device,
self = g_task_get_source_object (task);
+ g_assert (self->priv->pending_sim_slot_switch_action);
+ self->priv->pending_sim_slot_switch_action = FALSE;
+
/* the slot index in MM starts at 1 */
slot_number = GPOINTER_TO_UINT (g_task_get_task_data (task)) - 1;
@@ -8752,7 +8771,7 @@ set_device_slot_mappings_ready (MbimDevice *device,
}
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_NOT_FOUND,
- "Can't find executor index '%u'", self->priv->executor_index);
+ "Can't find executor index '%u'", self->priv->executor_index);
g_object_unref (task);
}
@@ -8802,6 +8821,16 @@ before_set_query_device_slot_mappings_ready (MbimDevice *device,
}
}
+ /* Flag a pending SIM slot switch operation, so that we can ignore slot state updates
+ * during the process. */
+ if (self->priv->pending_sim_slot_switch_action) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_IN_PROGRESS,
+ "there is already an ongoing SIM slot switch operation");
+ g_object_unref (task);
+ return;
+ }
+ self->priv->pending_sim_slot_switch_action = TRUE;
+
for (i = 0; i < map_count; i++) {
if (i == self->priv->executor_index)
slot_mappings[i]->slot = slot_number;