diff options
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r-- | src/mm-broadband-modem.c | 94 |
1 files changed, 64 insertions, 30 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index d3d349e9..2d2f6509 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -116,6 +116,7 @@ enum { PROP_MODEM_VOICE_CALL_LIST, PROP_MODEM_SIMPLE_STATUS, PROP_MODEM_SIM_HOT_SWAP_SUPPORTED, + PROP_MODEM_SIM_HOT_SWAP_CONFIGURED, PROP_FLOW_CONTROL, PROP_LAST }; @@ -134,6 +135,7 @@ struct _MMBroadbandModemPrivate { PortsContext *sim_hot_swap_ports_ctx; gboolean modem_init_run; gboolean sim_hot_swap_supported; + gboolean sim_hot_swap_configured; /*<--- Modem interface --->*/ /* Properties */ @@ -10098,27 +10100,38 @@ initialize_step (GTask *task) * (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; + gboolean is_sim_hot_swap_configured = FALSE; g_object_get (ctx->self, MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, &is_sim_hot_swap_supported, NULL); + g_object_get (ctx->self, + MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, &is_sim_hot_swap_configured, + NULL); + if (is_sim_hot_swap_supported) { - PortsContext *ports; - GError *error = NULL; - mm_dbg ("Creating ports context for SIM hot swap"); + if (!is_sim_hot_swap_configured) { + mm_warn ("SIM hot swap supported but not configured. Skipping opening ports"); + } else { + PortsContext *ports; + GError *error = NULL; - ports = g_new0 (PortsContext, 1); - ports->ref_count = 1; + mm_dbg ("Creating ports context for SIM hot swap"); - if (!open_ports_enabling (ctx->self, ports, FALSE, &error)) { - mm_warn ("Couldn't open ports during Modem SIM hot swap enabling: %s", error? error->message : "unknown reason"); - g_error_free (error); - } else - ctx->self->priv->sim_hot_swap_ports_ctx = ports_context_ref (ports); + ports = g_new0 (PortsContext, 1); + ports->ref_count = 1; - ports_context_unref (ports); + if (!open_ports_enabling (ctx->self, ports, FALSE, &error)) { + mm_warn ("Couldn't open ports during Modem SIM hot swap enabling: %s", error? error->message : "unknown reason"); + g_error_free (error); + } else { + ctx->self->priv->sim_hot_swap_ports_ctx = ports_context_ref (ports); + } + + ports_context_unref (ports); + } } } else mm_dbg ("Ports context for SIM hot swap already available"); @@ -10146,32 +10159,44 @@ initialize_step (GTask *task) } else { /* Fatal SIM, firmware, or modem failure :-( */ gboolean is_sim_hot_swap_supported = FALSE; + gboolean is_sim_hot_swap_configured = FALSE; + MMModemStateFailedReason reason = mm_gdbus_modem_get_state_failed_reason ( (MmGdbusModem*)ctx->self->priv->modem_dbus_skeleton); g_object_get (ctx->self, - MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, - &is_sim_hot_swap_supported, - NULL); - - if (reason == MM_MODEM_STATE_FAILED_REASON_SIM_MISSING && - is_sim_hot_swap_supported && - ctx->self->priv->sim_hot_swap_ports_ctx) { - mm_info ("SIM is missing, but the modem supports SIM hot swap. 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."); - } else { - mm_dbg ("SIM is missing and Modem does not support SIM Hot Swap"); - error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_WRONG_STATE, - "Modem is unusable, " - "cannot fully initialize"); + MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, + &is_sim_hot_swap_supported, + NULL); + + g_object_get (ctx->self, + MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, + &is_sim_hot_swap_configured, + NULL); + + if (reason == MM_MODEM_STATE_FAILED_REASON_SIM_MISSING) { + if (!is_sim_hot_swap_supported) { + mm_dbg ("SIM is missing, but this modem does not support SIM hot swap."); + } else if (!is_sim_hot_swap_configured) { + mm_warn ("SIM is missing, but SIM hot swap could not be configured."); + } else if (!ctx->self->priv->sim_hot_swap_ports_ctx) { + mm_err ("SIM is missing and SIM hot swap is configured, but ports are not opened."); + } else { + mm_dbg ("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, OMA, and Firmware interfaces * around. A failure could be caused by firmware issues, which * a firmware update, switch, or provisioning could fix. @@ -10498,6 +10523,9 @@ set_property (GObject *object, case PROP_MODEM_SIM_HOT_SWAP_SUPPORTED: self->priv->sim_hot_swap_supported = g_value_get_boolean (value); break; + case PROP_MODEM_SIM_HOT_SWAP_CONFIGURED: + self->priv->sim_hot_swap_configured = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -10603,6 +10631,9 @@ get_property (GObject *object, case PROP_MODEM_SIM_HOT_SWAP_SUPPORTED: g_value_set_boolean (value, self->priv->sim_hot_swap_supported); break; + case PROP_MODEM_SIM_HOT_SWAP_CONFIGURED: + g_value_set_boolean (value, self->priv->sim_hot_swap_configured); + break; case PROP_FLOW_CONTROL: g_value_set_flags (value, self->priv->flow_control); break; @@ -11102,6 +11133,9 @@ mm_broadband_modem_class_init (MMBroadbandModemClass *klass) PROP_MODEM_SIM_HOT_SWAP_SUPPORTED, MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED); + g_object_class_override_property (object_class, + PROP_MODEM_SIM_HOT_SWAP_CONFIGURED, + MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED); properties[PROP_FLOW_CONTROL] = g_param_spec_flags (MM_BROADBAND_MODEM_FLOW_CONTROL, "Flow control", |