diff options
author | Eric Caruso <ejcaruso@chromium.org> | 2017-12-13 10:17:33 -0800 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-12-18 10:16:18 +0100 |
commit | c44b928206c1147bd760b4aef48294d7dda28e24 (patch) | |
tree | 2e88cc80c3268efa1c560e523105dcdff7bc6c5d /src/mm-iface-modem.c | |
parent | 66dce6dacc440d8bfe4270562ef5a840c87e5a04 (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 'src/mm-iface-modem.c')
-rw-r--r-- | src/mm-iface-modem.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index afb3be32..7236e30b 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -3557,6 +3557,7 @@ static void interface_enabling_step (GTask *task); typedef enum { ENABLING_STEP_FIRST, ENABLING_STEP_SET_POWER_STATE, + ENABLING_STEP_CHECK_FOR_SIM_SWAP, ENABLING_STEP_FLOW_CONTROL, ENABLING_STEP_SUPPORTED_CHARSETS, ENABLING_STEP_CHARSET, @@ -3607,6 +3608,25 @@ enabling_set_power_state_ready (MMIfaceModem *self, } static void +check_for_sim_swap_ready (MMIfaceModem *self, + GAsyncResult *res, + GTask *task) +{ + EnablingContext *ctx; + GError *error = NULL; + + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish (self, res, &error)) { + mm_warn ("Error checking if SIM was swapped: '%s'", error->message); + g_error_free (error); + } + + /* Go on to next step */ + ctx = g_task_get_task_data (task); + ctx->step++; + interface_enabling_step (task); +} + +static void setup_flow_control_ready (MMIfaceModem *self, GAsyncResult *res, GTask *task) @@ -3709,6 +3729,18 @@ interface_enabling_step (GTask *task) task); return; + case ENABLING_STEP_CHECK_FOR_SIM_SWAP: + if (MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap && + MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish) { + MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap ( + self, + (GAsyncReadyCallback)check_for_sim_swap_ready, + task); + return; + } + /* Fall down to next step */ + ctx->step++; + case ENABLING_STEP_FLOW_CONTROL: if (MM_IFACE_MODEM_GET_INTERFACE (self)->setup_flow_control && MM_IFACE_MODEM_GET_INTERFACE (self)->setup_flow_control_finish) { |