summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniele Palmas <dnlplm@gmail.com>2022-12-28 16:10:54 +0100
committerAleksander Morgado <aleksandermj@chromium.org>2023-02-24 13:29:56 +0000
commit9e0df55712bc4e4fe44eeb5fa9b78fff4754d1c3 (patch)
tree6a28490092084b20bd0e01ee40aedf8a8091a20d
parentaf9799dfa8e38a892c9a061a425ef0f05ca515be (diff)
downloadModemManager-9e0df55712bc4e4fe44eeb5fa9b78fff4754d1c3.tar.gz
telit: fallback to AT commands in case of MBIM loading revision failure
Some firmware versions return an empty string for the revision when using the device caps MBIM request, so use AT commands as a fallback in case this happens. (cherry picked from commit 6748fb7c2c3e1935c581eb0a0f50e2f30fd6235e)
-rw-r--r--plugins/telit/mm-broadband-modem-mbim-telit.c28
-rw-r--r--plugins/telit/tests/test-mm-modem-helpers-telit.c1
2 files changed, 27 insertions, 2 deletions
diff --git a/plugins/telit/mm-broadband-modem-mbim-telit.c b/plugins/telit/mm-broadband-modem-mbim-telit.c
index 8437c8417..d14dd94a5 100644
--- a/plugins/telit/mm-broadband-modem-mbim-telit.c
+++ b/plugins/telit/mm-broadband-modem-mbim-telit.c
@@ -141,15 +141,16 @@ load_revision_finish (MMIfaceModem *self,
}
static void
-parent_load_revision_ready (MMIfaceModem *self,
+load_revision_ready_shared (MMIfaceModem *self,
GAsyncResult *res,
GTask *task)
{
GError *error = NULL;
gchar *revision = NULL;
- revision = iface_modem_parent->load_revision_finish (self, res, &error);
+ revision = mm_shared_telit_modem_load_revision_finish (self, res, &error);
if (!revision) {
+ /* give up */
g_task_return_error (task, error);
g_object_unref (task);
return;
@@ -160,6 +161,29 @@ parent_load_revision_ready (MMIfaceModem *self,
}
static void
+parent_load_revision_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ gchar *revision = NULL;
+
+ revision = iface_modem_parent->load_revision_finish (self, res, NULL);
+ if (!revision || !strlen (revision)) {
+ /* Some firmware versions do not properly populate the revision in the
+ * MBIM response, so try using the AT ports */
+ g_free (revision);
+ mm_shared_telit_modem_load_revision (
+ self,
+ (GAsyncReadyCallback)load_revision_ready_shared,
+ task);
+ return;
+ }
+ mm_shared_telit_store_revision (MM_SHARED_TELIT (self), revision);
+ g_task_return_pointer (task, revision, g_free);
+ g_object_unref (task);
+}
+
+static void
load_revision (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
diff --git a/plugins/telit/tests/test-mm-modem-helpers-telit.c b/plugins/telit/tests/test-mm-modem-helpers-telit.c
index e14ba6bad..b17a01f74 100644
--- a/plugins/telit/tests/test-mm-modem-helpers-telit.c
+++ b/plugins/telit/tests/test-mm-modem-helpers-telit.c
@@ -633,6 +633,7 @@ test_telit_parse_swpkgv_response (void)
{"\r\n16.38.571-P0F.224700\r\nM0F.223004-B001\r\nP0F.224700\r\nA0F.223004-B001\r\n\r\nOK\r\n", "16.38.571-P0F.224700"},
/* real example from LE910C1-EUX */
{"\r\n25.30.224-B001-P0F.224700\r\nM0F.223004-B001\r\nP0F.224700\r\nA0F.223004-B001\r\n\r\nOK\r\n", "25.30.224-B001-P0F.224700"},
+ {"\r\n45.00.010-B022-P0R.001600\r\nM0R.010000-B022\r\nP0R.001600\r\nA0R.000000-B022\r\n\r\nOK\r\n", "45.00.010-B022-P0R.001600"},
};
guint i;