UPSTREAM: sim-mbim: continue preload retry if previous attempt(s) fails Before the change, preload is attempted once regardless of its results. When the first attempt fails, it got stuck and can not get valid SIM info. (cherry picked from commit 9ec1d25607b91b376ae67ce16c1bc82aa8db5d7c) BUG=b:439769765 TEST=switch from esim to psim (the issue scenario) and verify that SIM info is loaded correctly. Change-Id: Ic46e138c9ba35887553ad390d058505f373777b9 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/modemmanager-next/+/6961914 Commit-Queue: Rukun Mao <rmao@google.com> Tested-by: Rukun Mao <rmao@google.com> Commit-Queue: ChromeOS Auto Runner <chromeos-auto-runner@chromeos-bot.iam.gserviceaccount.com> Reviewed-by: Aleksander Morgado <aleksandermj@google.com>
diff --git a/src/mm-sim-mbim.c b/src/mm-sim-mbim.c index 525b329..f44ce9e 100644 --- a/src/mm-sim-mbim.c +++ b/src/mm-sim-mbim.c
@@ -262,6 +262,7 @@ g_autoptr(MbimMessage) response = NULL; g_autofree gchar *raw_iccid = NULL; g_autoptr(GError) error = NULL; + MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED; self = g_task_get_source_object (task); @@ -282,7 +283,6 @@ if (response && mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error)) { if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { MbimSubscriberReadyStatusFlag flags = MBIM_SUBSCRIBER_READY_STATUS_FLAG_NONE; - MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED; if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse ( response, @@ -322,7 +322,7 @@ } else { if (!mbim_message_subscriber_ready_status_response_parse ( response, - NULL, /* ready_state */ + &ready_state, &self->priv->imsi, &raw_iccid, NULL, /* ready_info */ @@ -338,6 +338,17 @@ self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error); } + if (self->priv->preload_error || ready_state == MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED) { + self->priv->preload = FALSE; + if (self->priv->preload_error) + g_task_return_error (task, g_steal_pointer (&self->priv->preload_error)); + else + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_SIM_STATE, + "SIM is not ready: NotInitialized"); + + g_object_unref (task); + return; + } /* Go on to preload next contents */ uicc_application_list (task, device); } @@ -372,8 +383,9 @@ cancellable = g_cancellable_new (); task = g_task_new (self, cancellable, callback, user_data); - /* only preload one single time; the info of the SIM should not - * change during runtime, unless we're handling hotplug events */ + /* when preloading is successful, only preload one single time; + * the info of the SIM should not change during runtime, unless + * we're handling hotplug events */ if (self->priv->preload) { g_task_return_boolean (task, TRUE); g_object_unref (task);