diff options
author | Michal Mazur <mkm@semihalf.com> | 2021-08-19 17:34:21 +0200 |
---|---|---|
committer | Michal Mazur <mkm@semihalf.com> | 2021-09-21 14:28:01 +0200 |
commit | 5828af115c300045dd8d70ed04578032b5ecabee (patch) | |
tree | adc2735366a7eabdaa2e688decc6b765a8a7628b | |
parent | d5c2ea931e1eb6152ca3de970188b744b873240e (diff) | |
download | ModemManager-5828af115c300045dd8d70ed04578032b5ecabee.tar.gz |
modem-mbim: enter LOCKED state when SIM is incompatible
According to MBIM specification, the subscriber state is INITIALIZED
when SIM card is incompatible with enabled modem personalization lock.
This patch introduce additional check for enabled PIN lock in such case
and fixes depersonalization of one lock if several are enabled.
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 376e8d46c..dd6131ac6 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -1225,7 +1225,8 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device, } /* Initialized but locked? */ - if (ready_state == MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED) { + if (ready_state == MBIM_SUBSCRIBER_READY_STATE_DEVICE_LOCKED || + ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED) { MbimMessage *message; /* Query which lock is to unlock */ @@ -1240,13 +1241,6 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device, goto out; } - /* Initialized! */ - if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED) { - g_task_return_boolean (task, TRUE); - g_object_unref (task); - goto out; - } - g_assert_not_reached (); out: @@ -2662,6 +2656,11 @@ modem_3gpp_load_enabled_facility_locks (MMIfaceModem3gpp *self, /*****************************************************************************/ /* Facility locks disabling (3GPP interface) */ +typedef struct _DisableFacilityLockContext DisableFacilityLockContext; +struct _DisableFacilityLockContext { + MbimPinType pin_type; +}; + static gboolean modem_3gpp_disable_facility_lock_finish (MMIfaceModem3gpp *self, GAsyncResult *res, @@ -2675,12 +2674,15 @@ disable_facility_lock_ready (MbimDevice *device, GAsyncResult *res, GTask *task) { + DisableFacilityLockContext *ctx; MbimMessage *response = NULL; guint32 remaining_attempts; MbimPinState pin_state; MbimPinType pin_type; GError *error = NULL; + ctx = g_task_get_task_data (task); + response = mbim_device_command_finish (device, res, &error); if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, @@ -2692,7 +2694,8 @@ disable_facility_lock_ready (MbimDevice *device, &remaining_attempts, &error)) { g_task_return_error (task, error); - } else if (pin_state == MBIM_PIN_STATE_LOCKED) { + } else if (pin_type == ctx->pin_type && + pin_state == MBIM_PIN_STATE_LOCKED) { g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, @@ -2715,6 +2718,7 @@ modem_3gpp_disable_facility_lock (MMIfaceModem3gpp *self, GAsyncReadyCallback callback, gpointer user_data) { + DisableFacilityLockContext *ctx; MbimMessage *message; MbimPinType pin_type; MbimDevice *device; @@ -2737,6 +2741,10 @@ modem_3gpp_disable_facility_lock (MMIfaceModem3gpp *self, mm_obj_dbg (self, "Trying to disable %s lock using key: %s", mbim_pin_type_get_string (pin_type), key); + ctx = g_new0 (DisableFacilityLockContext, 1); + ctx->pin_type = pin_type; + g_task_set_task_data (task, ctx, g_free); + message = mbim_message_pin_set_new (pin_type, MBIM_PIN_OPERATION_DISABLE, key, |