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);