aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorEric Caruso <ejcaruso@chromium.org>2017-12-13 10:17:33 -0800
committerAleksander Morgado <aleksander@aleksander.es>2017-12-18 10:16:18 +0100
commitc44b928206c1147bd760b4aef48294d7dda28e24 (patch)
tree2e88cc80c3268efa1c560e523105dcdff7bc6c5d /plugins
parent66dce6dacc440d8bfe4270562ef5a840c87e5a04 (diff)
mm-iface-modem: add check_for_sim_swap method and enable steps
When in low-power mode, some modems will not dispatch unsolicited notifications, such as for SIM hot swapping. There is code in MMBroadbandModemTelit to handle this by checking the SIM identifier during modem power up against the identifier cached in the SIM D-Bus object. If they're different, the SIM has likely been swapped while we were powered down. We can move this code out to MMBroadbandModem because it doesn't actually rely on any Telit-specific details, and invoke it from MMIfaceModem via a new method.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/telit/mm-broadband-modem-telit.c128
1 files changed, 6 insertions, 122 deletions
diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c
index 995ae6a9..08917ca4 100644
--- a/plugins/telit/mm-broadband-modem-telit.c
+++ b/plugins/telit/mm-broadband-modem-telit.c
@@ -911,20 +911,6 @@ modem_load_unlock_retries (MMIfaceModem *self,
/*****************************************************************************/
/* Modem after power up (Modem interface) */
-typedef enum {
- AFTER_POWER_UP_STEP_FIRST,
- AFTER_POWER_UP_STEP_GET_SIM_IDENTIFIER,
- AFTER_POWER_UP_STEP_ENABLE_QSS_PARSING,
- AFTER_POWER_UP_STEP_LAST
-} ModemAfterPowerUpStep;
-
-typedef struct {
- gboolean has_sim_changed;
- guint retries;
- ModemAfterPowerUpStep step;
-} AfterPowerUpContext;
-
-static void after_power_up_step (GTask *task);
static gboolean
modem_after_power_up_finish (MMIfaceModem *self,
@@ -935,122 +921,20 @@ modem_after_power_up_finish (MMIfaceModem *self,
}
static void
-load_sim_identifier_ready (MMBaseSim *sim,
- GAsyncResult *res,
- GTask *task)
-{
- AfterPowerUpContext *ctx;
- GError *error = NULL;
- gchar *current_simid;
- const gchar *cached_simid;
-
- ctx = g_task_get_task_data (task);
-
- cached_simid = (gchar *)mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (sim));
- current_simid = mm_base_sim_load_sim_identifier_finish (sim, res, &error);
-
- if (error) {
- if (g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) {
- mm_warn ("could not load SIM identifier: %s", error->message);
- g_clear_error (&error);
- goto out;
- }
-
- if (ctx->retries-- > 0) {
- mm_warn ("could not load SIM identifier: %s (%d retries left)",
- error->message, ctx->retries);
- g_clear_error (&error);
- g_timeout_add_seconds (1, (GSourceFunc) after_power_up_step, task);
- return;
- }
-
- mm_warn ("could not load SIM identifier: %s", error->message);
- g_clear_error (&error);
- goto out;
- }
-
- if (g_strcmp0 (current_simid, cached_simid) != 0) {
- mm_warn ("sim identifier has changed: possible SIM swap during power down/low");
- ctx->has_sim_changed = TRUE;
- }
-
-out:
- g_free (current_simid);
- ctx->step++;
- after_power_up_step (task);
-}
-
-static void
-after_power_up_step (GTask *task)
-{
- AfterPowerUpContext *ctx;
- MMBroadbandModemTelit *self;
-
- ctx = g_task_get_task_data (task);
- self = g_task_get_source_object (task);
-
- switch (ctx->step) {
- case AFTER_POWER_UP_STEP_FIRST:
- /* Fall back on next step */
- ctx->step++;
-
- case AFTER_POWER_UP_STEP_GET_SIM_IDENTIFIER: {
- MMBaseSim *sim = NULL;
-
- g_object_get (MM_BROADBAND_MODEM_TELIT (self),
- MM_IFACE_MODEM_SIM, &sim,
- NULL);
- if (!sim) {
- g_task_return_new_error (task,
- MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "could not acquire sim object");
- g_object_unref (task);
- return;
- }
-
- mm_base_sim_load_sim_identifier (sim,
- (GAsyncReadyCallback)load_sim_identifier_ready,
- task);
- g_object_unref (sim);
- return;
- }
-
- case AFTER_POWER_UP_STEP_ENABLE_QSS_PARSING:
- mm_dbg ("Stop ignoring #QSS");
- self->priv->parse_qss = TRUE;
-
- /* Fall back on next step */
- ctx->step++;
- case AFTER_POWER_UP_STEP_LAST:
- if (ctx->has_sim_changed)
- mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
-
- g_task_return_boolean (task, TRUE);
- g_object_unref (task);
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
-static void
modem_after_power_up (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
- AfterPowerUpContext *ctx;
-
- ctx = g_new0 (AfterPowerUpContext, 1);
- ctx->step = AFTER_POWER_UP_STEP_FIRST;
- ctx->has_sim_changed = FALSE;
- ctx->retries = 3;
+ MMBroadbandModemTelit *modem = MM_BROADBAND_MODEM_TELIT (self);
task = g_task_new (self, NULL, callback, user_data);
- g_task_set_task_data (task, ctx, (GDestroyNotify) g_free);
- after_power_up_step (task);
+ mm_dbg ("Stop ignoring #QSS");
+ modem->priv->parse_qss = TRUE;
+
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
}
/*****************************************************************************/