diff options
-rw-r--r-- | plugins/cinterion/mm-broadband-modem-cinterion.c | 27 | ||||
-rw-r--r-- | plugins/quectel/mm-broadband-modem-qmi-quectel.c | 1 | ||||
-rw-r--r-- | plugins/quectel/mm-broadband-modem-quectel.c | 1 | ||||
-rw-r--r-- | plugins/quectel/mm-shared-quectel.c | 23 | ||||
-rw-r--r-- | plugins/quectel/mm-shared-quectel.h | 14 | ||||
-rw-r--r-- | plugins/telit/mm-broadband-modem-telit.c | 23 | ||||
-rw-r--r-- | plugins/ublox/mm-broadband-modem-ublox.c | 27 | ||||
-rw-r--r-- | src/mm-base-modem.c | 22 | ||||
-rw-r--r-- | src/mm-base-modem.h | 2 | ||||
-rw-r--r-- | src/mm-base-sim.c | 4 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 7 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 111 | ||||
-rw-r--r-- | src/mm-broadband-modem.h | 4 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 36 | ||||
-rw-r--r-- | src/mm-iface-modem.h | 19 | ||||
-rw-r--r-- | src/mm-shared-qmi.c | 2 |
16 files changed, 185 insertions, 138 deletions
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c index 7e483170..3be8da8b 100644 --- a/plugins/cinterion/mm-broadband-modem-cinterion.c +++ b/plugins/cinterion/mm-broadband-modem-cinterion.c @@ -2639,7 +2639,7 @@ cinterion_scks_unsolicited_handler (MMPortSerialAt *port, break; } - mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } static gboolean @@ -2651,18 +2651,18 @@ modem_setup_sim_hot_swap_finish (MMIfaceModem *self, } static void -cinterion_hot_swap_init_ready (MMBaseModem *_self, +cinterion_hot_swap_init_ready (MMBaseModem *_self, GAsyncResult *res, - GTask *task) + GTask *task) { MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self); - GError *error = NULL; - MMPortSerialAt *primary; - MMPortSerialAt *secondary; + g_autoptr(GError) error = NULL; + MMPortSerialAt *primary; + MMPortSerialAt *secondary; if (!mm_base_modem_at_command_finish (_self, res, &error)) { g_prefix_error (&error, "Could not enable SCKS: "); - g_task_return_error (task, error); + g_task_return_error (task, g_steal_pointer (&error)); g_object_unref (task); return; } @@ -2686,6 +2686,9 @@ cinterion_hot_swap_init_ready (MMBaseModem *_self, self, NULL); + if (!mm_broadband_modem_sim_hot_swap_ports_context_init (MM_BROADBAND_MODEM (self), &error)) + mm_obj_warn (self, "failed to initialize SIM hot swap ports context: %s", error->message); + g_task_return_boolean (task, TRUE); g_object_unref (task); } @@ -2710,6 +2713,15 @@ modem_setup_sim_hot_swap (MMIfaceModem *self, } /*****************************************************************************/ +/* SIM hot swap cleanup (Modem interface) */ + +static void +modem_cleanup_sim_hot_swap (MMIfaceModem *self) +{ + mm_broadband_modem_sim_hot_swap_ports_context_reset (MM_BROADBAND_MODEM (self)); +} + +/*****************************************************************************/ /* Create Bearer (Modem interface) */ static MMBaseBearer * @@ -2972,6 +2984,7 @@ iface_modem_init (MMIfaceModem *iface) iface->modem_power_off_finish = modem_power_off_finish; iface->setup_sim_hot_swap = modem_setup_sim_hot_swap; iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish; + iface->cleanup_sim_hot_swap = modem_cleanup_sim_hot_swap; } static MMIfaceModem * diff --git a/plugins/quectel/mm-broadband-modem-qmi-quectel.c b/plugins/quectel/mm-broadband-modem-qmi-quectel.c index 1e8ec7be..a4ccbfc9 100644 --- a/plugins/quectel/mm-broadband-modem-qmi-quectel.c +++ b/plugins/quectel/mm-broadband-modem-qmi-quectel.c @@ -73,6 +73,7 @@ iface_modem_init (MMIfaceModem *iface) iface->setup_sim_hot_swap = mm_shared_quectel_setup_sim_hot_swap; iface->setup_sim_hot_swap_finish = mm_shared_quectel_setup_sim_hot_swap_finish; + iface->cleanup_sim_hot_swap = mm_shared_quectel_cleanup_sim_hot_swap; } static MMIfaceModem * diff --git a/plugins/quectel/mm-broadband-modem-quectel.c b/plugins/quectel/mm-broadband-modem-quectel.c index 23654305..ad66b783 100644 --- a/plugins/quectel/mm-broadband-modem-quectel.c +++ b/plugins/quectel/mm-broadband-modem-quectel.c @@ -71,6 +71,7 @@ iface_modem_init (MMIfaceModem *iface) iface->setup_sim_hot_swap = mm_shared_quectel_setup_sim_hot_swap; iface->setup_sim_hot_swap_finish = mm_shared_quectel_setup_sim_hot_swap_finish; + iface->cleanup_sim_hot_swap = mm_shared_quectel_cleanup_sim_hot_swap; } static MMIfaceModem * diff --git a/plugins/quectel/mm-shared-quectel.c b/plugins/quectel/mm-shared-quectel.c index 547775bd..13834e83 100644 --- a/plugins/quectel/mm-shared-quectel.c +++ b/plugins/quectel/mm-shared-quectel.c @@ -435,11 +435,12 @@ mm_shared_quectel_setup_sim_hot_swap (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data) { - Private *priv; - MMPortSerialAt *ports[2]; - GTask *task; - GRegex *pattern; - guint i; + Private *priv; + MMPortSerialAt *ports[2]; + GTask *task; + GRegex *pattern; + guint i; + g_autoptr(GError) error = NULL; priv = get_private (MM_SHARED_QUECTEL (self)); @@ -464,6 +465,9 @@ mm_shared_quectel_setup_sim_hot_swap (MMIfaceModem *self, g_regex_unref (pattern); mm_obj_dbg (self, "+QUSIM detection set up"); + if (!mm_broadband_modem_sim_hot_swap_ports_context_init (MM_BROADBAND_MODEM (self), &error)) + mm_obj_warn (self, "failed to initialize SIM hot swap ports context: %s", error->message); + /* Now, if available, setup parent logic */ if (priv->iface_modem_parent->setup_sim_hot_swap && priv->iface_modem_parent->setup_sim_hot_swap_finish) { @@ -479,6 +483,15 @@ mm_shared_quectel_setup_sim_hot_swap (MMIfaceModem *self, } /*****************************************************************************/ +/* SIM hot swap cleanup (Modem interface) */ + +void +mm_shared_quectel_cleanup_sim_hot_swap (MMIfaceModem *self) +{ + mm_broadband_modem_sim_hot_swap_ports_context_reset (MM_BROADBAND_MODEM (self)); +} + +/*****************************************************************************/ /* GPS trace received */ static void diff --git a/plugins/quectel/mm-shared-quectel.h b/plugins/quectel/mm-shared-quectel.h index f9266c06..0dfcbde4 100644 --- a/plugins/quectel/mm-shared-quectel.h +++ b/plugins/quectel/mm-shared-quectel.h @@ -54,13 +54,13 @@ MMFirmwareUpdateSettings *mm_shared_quectel_firmware_load_update_settings_finish GAsyncResult *res, GError **error); -void mm_shared_quectel_setup_sim_hot_swap (MMIfaceModem *self, - GAsyncReadyCallback callback, - gpointer user_data); - -gboolean mm_shared_quectel_setup_sim_hot_swap_finish (MMIfaceModem *self, - GAsyncResult *res, - GError **error); +void mm_shared_quectel_setup_sim_hot_swap (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_shared_quectel_setup_sim_hot_swap_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); +void mm_shared_quectel_cleanup_sim_hot_swap (MMIfaceModem *self); void mm_shared_quectel_location_load_capabilities (MMIfaceModemLocation *self, GAsyncReadyCallback callback, diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c index 6228d697..49e48247 100644 --- a/plugins/telit/mm-broadband-modem-telit.c +++ b/plugins/telit/mm-broadband-modem-telit.c @@ -474,7 +474,7 @@ telit_qss_unsolicited_handler (MMPortSerialAt *port, if ((prev_qss_status == QSS_STATUS_SIM_REMOVED && cur_qss_status != QSS_STATUS_SIM_REMOVED) || (prev_qss_status > QSS_STATUS_SIM_REMOVED && cur_qss_status == QSS_STATUS_SIM_REMOVED)) { mm_obj_info (self, "QSS handler: SIM swap detected"); - mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } } @@ -649,14 +649,19 @@ qss_setup_step (GTask *task) case QSS_SETUP_STEP_LAST: /* If all enabling actions failed (either both, or only primary if * there is no secondary), then we return an error */ - if (ctx->primary_error && - (ctx->secondary_error || !ctx->secondary)) + if (ctx->primary_error && (ctx->secondary_error || !ctx->secondary)) { g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "QSS: couldn't enable unsolicited"); - else + } else { + g_autoptr(GError) error = NULL; + + if (!mm_broadband_modem_sim_hot_swap_ports_context_init (MM_BROADBAND_MODEM (self), &error)) + mm_obj_warn (self, "failed to initialize SIM hot swap ports context: %s", error->message); + g_task_return_boolean (task, TRUE); + } g_object_unref (task); break; @@ -685,6 +690,15 @@ modem_setup_sim_hot_swap (MMIfaceModem *self, } /*****************************************************************************/ +/* SIM hot swap cleanup (Modem interface) */ + +static void +modem_cleanup_sim_hot_swap (MMIfaceModem *self) +{ + mm_broadband_modem_sim_hot_swap_ports_context_reset (MM_BROADBAND_MODEM (self)); +} + +/*****************************************************************************/ /* Load unlock retries (Modem interface) * * NOTE: the logic must make sure that LOAD_UNLOCK_RETRIES_STEP_UNLOCK is always @@ -1408,6 +1422,7 @@ iface_modem_init (MMIfaceModem *iface) iface->set_current_modes_finish = mm_shared_telit_set_current_modes_finish; iface->setup_sim_hot_swap = modem_setup_sim_hot_swap; iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish; + iface->cleanup_sim_hot_swap = modem_cleanup_sim_hot_swap; } static void diff --git a/plugins/ublox/mm-broadband-modem-ublox.c b/plugins/ublox/mm-broadband-modem-ublox.c index 7a45e4ed..b5c2072d 100644 --- a/plugins/ublox/mm-broadband-modem-ublox.c +++ b/plugins/ublox/mm-broadband-modem-ublox.c @@ -1079,7 +1079,7 @@ common_voice_enable_disable_unsolicited_events (MMBroadbandModemUblox *self, } /*****************************************************************************/ -/* Hotplug configure (Modem interface) */ +/* SIM hot swap setup (Modem interface) */ typedef enum { CIEV_SIM_STATUS_UNKNOWN = -1, @@ -1110,7 +1110,7 @@ ublox_ciev_unsolicited_handler (MMPortSerialAt *port, mm_obj_info (self, "CIEV: sim hot swap detected '%d'", sim_insert_status); if (sim_insert_status == CIEV_SIM_STATUS_INSERTED || sim_insert_status == CIEV_SIM_STATUS_REMOVED) { - mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } else { mm_obj_warn (self, "(%s) CIEV: unable to determine sim insert status: %d", mm_port_get_device (MM_PORT (port)), @@ -1155,21 +1155,26 @@ ublox_setup_ciev_handler (MMIfaceModem *self, } static void -process_cind_verbosity_response (MMBaseModem *self, +process_cind_verbosity_response (MMBaseModem *self, GAsyncResult *res, - GTask *task) + GTask *task) { - GError *error = NULL; + g_autoptr(GError) error = NULL; mm_base_modem_at_command_finish (self, res, &error); if (error) { mm_obj_warn (self, "CIND: verbose mode is not configured: %s", error->message); - g_task_return_error (task, error); + g_task_return_error (task, g_steal_pointer (&error)); g_object_unref (task); return; } + mm_obj_info (self, "CIND unsolicited response codes processing verbosity configured successfully"); + + if (!mm_broadband_modem_sim_hot_swap_ports_context_init (MM_BROADBAND_MODEM (self), &error)) + mm_obj_warn (self, "failed to initialize SIM hot swap ports context: %s", error->message); + g_task_return_boolean (task, TRUE); g_object_unref (task); } @@ -1240,6 +1245,15 @@ modem_setup_sim_hot_swap (MMIfaceModem *self, } /*****************************************************************************/ +/* SIM hot swap cleanup (Modem interface) */ + +static void +modem_cleanup_sim_hot_swap (MMIfaceModem *self) +{ + mm_broadband_modem_sim_hot_swap_ports_context_reset (MM_BROADBAND_MODEM (self)); +} + +/*****************************************************************************/ /* Enabling unsolicited events (Voice interface) */ static gboolean @@ -2031,6 +2045,7 @@ iface_modem_init (MMIfaceModem *iface) iface->set_current_bands_finish = common_set_current_modes_bands_finish; iface->setup_sim_hot_swap = modem_setup_sim_hot_swap; iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish; + iface->cleanup_sim_hot_swap = modem_cleanup_sim_hot_swap; } static void diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 063cee6d..b8464414 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -1681,28 +1681,6 @@ mm_base_modem_get_product_id (MMBaseModem *self) /*****************************************************************************/ -static void -after_sim_switch_disable_ready (MMBaseModem *self, - GAsyncResult *res) -{ - g_autoptr(GError) error = NULL; - - mm_base_modem_disable_finish (self, res, &error); - if (error) - mm_obj_err (self, "failed to disable after SIM switch event: %s", error->message); - else - mm_base_modem_set_valid (self, FALSE); -} - -void -mm_base_modem_process_sim_event (MMBaseModem *self) -{ - mm_base_modem_set_reprobe (self, TRUE); - mm_base_modem_disable (self, (GAsyncReadyCallback) after_sim_switch_disable_ready, NULL); -} - -/*****************************************************************************/ - static gboolean base_modem_invalid_idle (MMBaseModem *self) { diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index 61e9e59a..e4254a0b 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -254,6 +254,4 @@ gboolean mm_base_modem_sync_finish (MMBaseModem *self, #endif -void mm_base_modem_process_sim_event (MMBaseModem *self); - #endif /* MM_BASE_MODEM_H */ diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 22b54ba1..7d3f3cf4 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -98,7 +98,7 @@ reprobe_if_puk_discovered (MMBaseSim *self, MM_MOBILE_EQUIPMENT_ERROR, MM_MOBILE_EQUIPMENT_ERROR_SIM_PUK)) { mm_obj_dbg (self, "Discovered PUK lock, discarding old modem..."); - mm_base_modem_process_sim_event (self->priv->modem); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self->priv->modem)); } } @@ -905,7 +905,7 @@ handle_send_puk_ready (MMBaseSim *self, if (sim_error) { mm_obj_info (self, "Received critical sim error. SIM might be permanently blocked. Reprobing..."); - mm_base_modem_process_sim_event (self->priv->modem); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self->priv->modem)); } handle_send_puk_context_free (ctx); diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 11f26efb..29b845b0 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -4712,7 +4712,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_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } if ((self->priv->last_ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED && @@ -4721,7 +4721,7 @@ 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_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } self->priv->last_ready_state = ready_state; @@ -5227,11 +5227,10 @@ 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_base_modem_process_sim_event (MM_BASE_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } else { /* Modifies SIM object at the given slot based on the reported state, * when the slot is not the active one. */ diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index f38e6b86..02fd0e2d 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -475,6 +475,37 @@ modem_create_sim (MMIfaceModem *self, } /*****************************************************************************/ +/* Helper to manage AT-based SIM hot swap ports context */ + +gboolean +mm_broadband_modem_sim_hot_swap_ports_context_init (MMBroadbandModem *self, + GError **error) +{ + PortsContext *ports; + + mm_obj_dbg (self, "creating serial ports context for SIM hot swap..."); + ports = ports_context_new (); + if (!ports_context_open (self, ports, FALSE, FALSE, FALSE, error)) { + ports_context_unref (ports); + return FALSE; + } + + g_assert (!self->priv->sim_hot_swap_ports_ctx); + self->priv->sim_hot_swap_ports_ctx = ports; + return TRUE; +} + +void +mm_broadband_modem_sim_hot_swap_ports_context_reset (MMBroadbandModem *self) +{ + if (self->priv->sim_hot_swap_ports_ctx) { + mm_obj_dbg (self, "releasing serial ports context for SIM hot swap"); + ports_context_unref (self->priv->sim_hot_swap_ports_ctx); + self->priv->sim_hot_swap_ports_ctx = NULL; + } +} + +/*****************************************************************************/ /* Capabilities loading (Modem interface) */ typedef struct { @@ -4156,7 +4187,7 @@ load_sim_identifier_ready (MMBaseSim *sim, if (g_strcmp0 (current_simid, cached_simid) != 0) { mm_obj_info (self, "sim identifier has changed: %s -> %s - possible SIM swap", cached_simid, current_simid); - mm_broadband_modem_sim_hot_swap_detected (self); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } g_task_return_boolean (task, TRUE); @@ -4208,7 +4239,7 @@ modem_check_for_sim_swap (MMIfaceModem *self, if (modem_state == MM_MODEM_STATE_FAILED) { mm_obj_info (self, "new SIM detected, handle as SIM hot-swap"); - mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); g_task_return_boolean (task, TRUE); } else { g_task_return_new_error (task, @@ -4230,7 +4261,7 @@ modem_check_for_sim_swap (MMIfaceModem *self, mm_obj_info (self, "detected ICCID change (%s -> %s), handle as SIM hot-swap", cached_simid ? cached_simid : "<none>", iccid); - mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); } else mm_obj_dbg (self, "ICCID not changed"); @@ -12268,7 +12299,6 @@ typedef enum { INITIALIZE_STEP_FALLBACK_LIMITED, INITIALIZE_STEP_IFACE_VOICE, INITIALIZE_STEP_IFACE_FIRMWARE, - INITIALIZE_STEP_SIM_HOT_SWAP, INITIALIZE_STEP_IFACE_SIMPLE, INITIALIZE_STEP_LAST, } InitializeStep; @@ -12625,37 +12655,6 @@ initialize_step (GTask *task) task); return; - case INITIALIZE_STEP_SIM_HOT_SWAP: - /* Create the SIM hot swap ports context only if not already done before - * (we may be re-running the initialization step after SIM-PIN unlock) */ - if (!ctx->self->priv->sim_hot_swap_ports_ctx) { - gboolean is_sim_hot_swap_supported = FALSE; - - g_object_get (ctx->self, - MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, &is_sim_hot_swap_supported, - NULL); - - if (is_sim_hot_swap_supported) { - PortsContext *ports; - g_autoptr(GError) error = NULL; - - mm_obj_dbg (ctx->self, "creating ports context for SIM hot swap"); - ports = ports_context_new (); - if (!ports_context_open (ctx->self, ports, FALSE, FALSE, FALSE, &error)) { - mm_obj_warn (ctx->self, "couldn't open ports during modem SIM hot swap enabling: %s", - error ? error->message : "unknown reason"); - } else { - ctx->self->priv->sim_hot_swap_ports_ctx = ports_context_ref (ports); - } - - ports_context_unref (ports); - } - } else - mm_obj_dbg (ctx->self, "ports context for SIM hot swap already available"); - - ctx->step++; - /* fall through */ - case INITIALIZE_STEP_IFACE_SIMPLE: if (ctx->self->priv->modem_state != MM_MODEM_STATE_FAILED) mm_iface_modem_simple_initialize (MM_IFACE_MODEM_SIMPLE (ctx->self)); @@ -12664,16 +12663,9 @@ initialize_step (GTask *task) case INITIALIZE_STEP_LAST: if (ctx->self->priv->modem_state == MM_MODEM_STATE_FAILED) { - GError *error; + GError *error = NULL; - if (!ctx->self->priv->modem_dbus_skeleton) { - /* Error setting up ports. Abort without even exporting the - * Modem interface */ - error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_ABORTED, - "Modem is unusable, " - "cannot fully initialize"); - } else { + if (ctx->self->priv->modem_dbus_skeleton) { /* Fatal SIM, firmware, or modem failure :-( */ gboolean is_sim_hot_swap_supported = FALSE; MMModemStateFailedReason reason; @@ -12687,25 +12679,17 @@ initialize_step (GTask *task) if (reason == MM_MODEM_STATE_FAILED_REASON_SIM_MISSING) { if (!is_sim_hot_swap_supported) { mm_obj_dbg (ctx->self, "SIM is missing, but this modem does not support SIM hot swap."); - } else if (!ctx->self->priv->sim_hot_swap_ports_ctx) { - mm_obj_err (ctx->self, "SIM is missing and SIM hot swap is configured, but ports are not opened."); } else { mm_obj_dbg (ctx->self, "SIM is missing, but SIM hot swap is enabled; waiting for SIM..."); error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Modem is unusable due to SIM missing, " "cannot fully initialize, waiting for SIM insertion."); - goto sim_hot_swap_enabled; } } - error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Modem is unusable, " - "cannot fully initialize"); -sim_hot_swap_enabled: - /* Ensure we only leave the Modem and Firmware interfaces - * around. A failure could be caused by firmware issues, which + /* Ensure we only leave the Modem, Voice and Firmware interfaces + * around. A failure could be caused by firmware issues, which * a firmware update, switch, or provisioning could fix. We also * leave the Voice interface around so that we can attempt * emergency voice calls. @@ -12721,6 +12705,11 @@ sim_hot_swap_enabled: mm_iface_modem_simple_shutdown (MM_IFACE_MODEM_SIMPLE (ctx->self)); } + if (!error) + error = g_error_new (MM_CORE_ERROR, + MM_CORE_ERROR_ABORTED, + "Modem is unusable, cannot fully initialize"); + g_task_return_error (task, error); g_object_unref (task); return; @@ -12873,20 +12862,6 @@ mm_broadband_modem_create_device_identifier (MMBroadbandModem *self, /*****************************************************************************/ -void -mm_broadband_modem_sim_hot_swap_detected (MMBroadbandModem *self) -{ - if (self->priv->sim_hot_swap_ports_ctx) { - mm_obj_dbg (self, "releasing SIM hot swap ports context"); - ports_context_unref (self->priv->sim_hot_swap_ports_ctx); - self->priv->sim_hot_swap_ports_ctx = NULL; - } - - mm_base_modem_process_sim_event (MM_BASE_MODEM (self)); -} - -/*****************************************************************************/ - MMBroadbandModem * mm_broadband_modem_new (const gchar *device, const gchar **drivers, diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h index 2ba05799..bb4e1f66 100644 --- a/src/mm-broadband-modem.h +++ b/src/mm-broadband-modem.h @@ -122,6 +122,8 @@ void mm_broadband_modem_unlock_sms_storages (MMBroadbandModem *self, gboolean mem1, gboolean mem2); /* Helper to update SIM hot swap */ -void mm_broadband_modem_sim_hot_swap_detected (MMBroadbandModem *self); +gboolean mm_broadband_modem_sim_hot_swap_ports_context_init (MMBroadbandModem *self, + GError **error); +void mm_broadband_modem_sim_hot_swap_ports_context_reset (MMBroadbandModem *self); #endif /* MM_BROADBAND_MODEM_H */ diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 517288e6..d019fd4b 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -209,6 +209,8 @@ mm_iface_modem_check_for_sim_swap (MMIfaceModem *self, g_object_unref (task); } +/*****************************************************************************/ + static void sim_slot_free (MMBaseSim *sim) { @@ -277,6 +279,34 @@ mm_iface_modem_modify_sim (MMIfaceModem *self, /*****************************************************************************/ +static void +after_sim_event_disable_ready (MMBaseModem *self, + GAsyncResult *res) +{ + g_autoptr(GError) error = NULL; + + mm_base_modem_disable_finish (self, res, &error); + if (error) + mm_obj_err (self, "failed to disable after SIM switch event: %s", error->message); + + /* set invalid either way, so that it's reprobed */ + mm_base_modem_set_valid (self, FALSE); +} + +void +mm_iface_modem_process_sim_event (MMIfaceModem *self) +{ + if (MM_IFACE_MODEM_GET_INTERFACE (self)->cleanup_sim_hot_swap) + MM_IFACE_MODEM_GET_INTERFACE (self)->cleanup_sim_hot_swap (self); + + mm_base_modem_set_reprobe (MM_BASE_MODEM (self), TRUE); + mm_base_modem_disable (MM_BASE_MODEM (self), + (GAsyncReadyCallback) after_sim_event_disable_ready, + NULL); +} + +/*****************************************************************************/ + void mm_iface_modem_bind_simple_status (MMIfaceModem *self, MMSimpleStatus *status) @@ -1234,7 +1264,7 @@ set_primary_sim_slot_ready (MMIfaceModem *self, /* Notify about the SIM swap, which will disable and reprobe the device. * There is no need to update the PrimarySimSlot property, as this value will be * reloaded automatically during the reprobe. */ - mm_base_modem_process_sim_event (MM_BASE_MODEM (self)); + mm_iface_modem_process_sim_event (self); } mm_gdbus_modem_complete_set_primary_sim_slot (ctx->skeleton, ctx->invocation); @@ -6109,6 +6139,10 @@ mm_iface_modem_shutdown (MMIfaceModem *self) /* Remove running restart initialization idle, if any */ restart_initialize_idle_disable (self); + /* Cleanup SIM hot swap, if any */ + if (MM_IFACE_MODEM_GET_INTERFACE (self)->cleanup_sim_hot_swap) + MM_IFACE_MODEM_GET_INTERFACE (self)->cleanup_sim_hot_swap (self); + /* Remove SIM object */ g_object_set (self, MM_IFACE_MODEM_SIM, NULL, diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h index bb79084c..43034dda 100644 --- a/src/mm-iface-modem.h +++ b/src/mm-iface-modem.h @@ -376,14 +376,14 @@ struct _MMIfaceModem { /* Create new bearer list object */ MMBearerList * (* create_bearer_list) (MMIfaceModem *self); - /* Setup SIM hot swap */ - void (*setup_sim_hot_swap) (MMIfaceModem *self, - GAsyncReadyCallback callback, - gpointer user_data); - - gboolean (*setup_sim_hot_swap_finish) (MMIfaceModem *self, - GAsyncResult *res, - GError **error); + /* Setup/cleanup SIM hot swap */ + void (* setup_sim_hot_swap) (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* setup_sim_hot_swap_finish) (MMIfaceModem *self, + GAsyncResult *res, + GError **error); + void (* cleanup_sim_hot_swap) (MMIfaceModem *self); /* Load carrier config */ void (* load_carrier_config) (MMIfaceModem *self, @@ -609,4 +609,7 @@ void mm_iface_modem_modify_sim (MMIfaceModem *self, guint slot_index, MMBaseSim *new_sim); +void mm_iface_modem_process_sim_event (MMIfaceModem *self); + + #endif /* MM_IFACE_MODEM_H */ diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c index 162c6227..0141d939 100644 --- a/src/mm-shared-qmi.c +++ b/src/mm-shared-qmi.c @@ -3817,7 +3817,7 @@ uim_slot_status_indication_cb (QmiClientUim *client, * active slot's status changed */ if (!slot_array_status_equal (priv->slots_status, new_slots_status, TRUE)) { mm_obj_dbg (self, "An active slot had a status change, will reprobe the modem"); - mm_base_modem_process_sim_event (MM_BASE_MODEM (self)); + mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self)); return; } |