Blame SOURCES/0001-detect-smdpkt-rh1976886.patch

2dd08c
From 185856133af4d723b719a4ad5395e32153deb98b Mon Sep 17 00:00:00 2001
2dd08c
From: Aleksander Morgado <aleksander@aleksander.es>
2dd08c
Date: Fri, 18 Oct 2019 11:37:17 +0200
2dd08c
Subject: [PATCH 1/3] qmi-device: support and detect smdpkt managed QMI control
2dd08c
 ports
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/issues/20
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/merge_requests/72
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/merge_requests/101
2dd08c
2dd08c
(cherry picked from commit e3851c8d456f32553324beaab1b7c48bbffa2892)
2dd08c
(cherry picked from commit 6fc07ae25a7c3e2375f02f7ab65c92073303e8d0)
2dd08c
---
2dd08c
 .../libqmi-glib/libqmi-glib-common.sections   |  2 +
2dd08c
 src/libqmi-glib/qmi-device.c                  | 68 ++++++++---------
2dd08c
 src/libqmi-glib/qmi-utils.c                   | 73 ++++++++++++++++---
2dd08c
 src/libqmi-glib/qmi-utils.h                   | 11 ++-
2dd08c
 4 files changed, 107 insertions(+), 47 deletions(-)
2dd08c
2dd08c
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
2dd08c
index eb6cbeded2ba..75a13653416a 100644
2dd08c
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
2dd08c
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
2dd08c
@@ -1403,6 +1403,8 @@ QmiEndian
2dd08c
 <SUBSECTION Traces>
2dd08c
 qmi_utils_get_traces_enabled
2dd08c
 qmi_utils_set_traces_enabled
2dd08c
+<SUBSECTION Private>
2dd08c
+__QmiTransportType
2dd08c
 </SECTION>
2dd08c
 
2dd08c
 <SECTION>
2dd08c
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
2dd08c
index 1e7d8cd1a9d2..7af4f4cd43b6 100644
2dd08c
--- a/src/libqmi-glib/qmi-device.c
2dd08c
+++ b/src/libqmi-glib/qmi-device.c
2dd08c
@@ -1942,68 +1942,68 @@ device_create_endpoint (QmiDevice *self,
2dd08c
 }
2dd08c
 
2dd08c
 static gboolean
2dd08c
-device_setup_open_flags_by_driver (QmiDevice          *self,
2dd08c
-                                   DeviceOpenContext  *ctx,
2dd08c
-                                   GError            **error)
2dd08c
-{
2dd08c
-    gchar  *driver;
2dd08c
-    GError *inner_error = NULL;
2dd08c
-
2dd08c
-    driver = __qmi_utils_get_driver (qmi_file_get_path (self->priv->file), &inner_error);
2dd08c
-    if (driver)
2dd08c
-        g_debug ("[%s] loaded driver of cdc-wdm port: %s", qmi_file_get_path_display (self->priv->file), driver);
2dd08c
-    else if (!self->priv->no_file_check)
2dd08c
-        g_warning ("[%s] couldn't load driver of cdc-wdm port: %s", qmi_file_get_path_display (self->priv->file), inner_error->message);
2dd08c
+device_setup_open_flags_by_transport (QmiDevice          *self,
2dd08c
+                                      DeviceOpenContext  *ctx,
2dd08c
+                                      GError            **error)
2dd08c
+{
2dd08c
+    __QmiTransportType  transport;
2dd08c
+    GError             *inner_error = NULL;
2dd08c
+
2dd08c
+    transport = __qmi_utils_get_transport_type (qmi_file_get_path (self->priv->file), &inner_error);
2dd08c
+    if ((transport == __QMI_TRANSPORT_TYPE_UNKNOWN) && !self->priv->no_file_check)
2dd08c
+        g_warning ("[%s] couldn't detect transport type of port: %s", qmi_file_get_path_display (self->priv->file), inner_error->message);
2dd08c
     g_clear_error (&inner_error);
2dd08c
 
2dd08c
 #if defined MBIM_QMUX_ENABLED
2dd08c
 
2dd08c
     /* Auto mode requested? */
2dd08c
     if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_AUTO) {
2dd08c
-        if (!g_strcmp0 (driver, "cdc_mbim")) {
2dd08c
+        switch (transport) {
2dd08c
+        case __QMI_TRANSPORT_TYPE_MBIM:
2dd08c
             g_debug ("[%s] automatically selecting MBIM mode", qmi_file_get_path_display (self->priv->file));
2dd08c
             ctx->flags |= QMI_DEVICE_OPEN_FLAGS_MBIM;
2dd08c
-            goto out;
2dd08c
-        }
2dd08c
-        if (!g_strcmp0 (driver, "qmi_wwan")) {
2dd08c
+            break;
2dd08c
+        case __QMI_TRANSPORT_TYPE_QMUX:
2dd08c
             g_debug ("[%s] automatically selecting QMI mode", qmi_file_get_path_display (self->priv->file));
2dd08c
             ctx->flags &= ~QMI_DEVICE_OPEN_FLAGS_MBIM;
2dd08c
-            goto out;
2dd08c
+            break;
2dd08c
+        case __QMI_TRANSPORT_TYPE_UNKNOWN:
2dd08c
+            g_set_error (&inner_error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
2dd08c
+                         "Cannot automatically select QMI/MBIM mode");
2dd08c
+            break;
2dd08c
         }
2dd08c
-        g_set_error (&inner_error,
2dd08c
-                     QMI_CORE_ERROR,
2dd08c
-                     QMI_CORE_ERROR_FAILED,
2dd08c
-                     "Cannot automatically select QMI/MBIM mode: driver %s",
2dd08c
-                     driver ? driver : "unknown");
2dd08c
         goto out;
2dd08c
     }
2dd08c
 
2dd08c
     /* MBIM mode requested? */
2dd08c
     if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_MBIM) {
2dd08c
-        if (g_strcmp0 (driver, "cdc_mbim") && !self->priv->no_file_check)
2dd08c
-            g_warning ("[%s] requested MBIM mode but unexpected driver found: %s", qmi_file_get_path_display (self->priv->file), driver);
2dd08c
+        if ((transport != __QMI_TRANSPORT_TYPE_MBIM) && !self->priv->no_file_check)
2dd08c
+            g_warning ("[%s] requested MBIM mode but unexpected transport type found", qmi_file_get_path_display (self->priv->file));
2dd08c
         goto out;
2dd08c
     }
2dd08c
 
2dd08c
 #else
2dd08c
 
2dd08c
-    if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_AUTO)
2dd08c
+    /* Auto mode requested? */
2dd08c
+    if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_AUTO) {
2dd08c
         g_warning ("[%s] requested auto mode but no MBIM QMUX support available", qmi_file_get_path_display (self->priv->file));
2dd08c
-    if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_MBIM)
2dd08c
+        goto out;
2dd08c
+    }
2dd08c
+
2dd08c
+    /* MBIM mode requested? */
2dd08c
+    if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_MBIM) {
2dd08c
         g_warning ("[%s] requested MBIM mode but no MBIM QMUX support available", qmi_file_get_path_display (self->priv->file));
2dd08c
+        goto out;
2dd08c
+    }
2dd08c
 
2dd08c
 #endif /* MBIM_QMUX_ENABLED */
2dd08c
 
2dd08c
     /* QMI mode requested? */
2dd08c
-    if (g_strcmp0 (driver, "qmi_wwan") && !self->priv->no_file_check)
2dd08c
-        g_warning ("[%s] requested QMI mode but unexpected driver found: %s",
2dd08c
-                   qmi_file_get_path_display (self->priv->file), driver ? driver : "unknown");
2dd08c
+    if ((transport != __QMI_TRANSPORT_TYPE_QMUX) && !self->priv->no_file_check)
2dd08c
+        g_warning ("[%s] requested QMI mode but unexpected transport type found",
2dd08c
+                   qmi_file_get_path_display (self->priv->file));
2dd08c
 
2dd08c
-#if defined MBIM_QMUX_ENABLED
2dd08c
 out:
2dd08c
-#endif
2dd08c
-
2dd08c
-    g_free (driver);
2dd08c
 
2dd08c
     if (inner_error) {
2dd08c
         g_propagate_error (error, inner_error);
2dd08c
@@ -2029,7 +2029,7 @@ device_open_step (GTask *task)
2dd08c
         /* Fall through */
2dd08c
 
2dd08c
     case DEVICE_OPEN_CONTEXT_STEP_DRIVER:
2dd08c
-        if (!device_setup_open_flags_by_driver (self, ctx, &error)) {
2dd08c
+        if (!device_setup_open_flags_by_transport (self, ctx, &error)) {
2dd08c
             g_task_return_error (task, error);
2dd08c
             g_object_unref (task);
2dd08c
             return;
2dd08c
diff --git a/src/libqmi-glib/qmi-utils.c b/src/libqmi-glib/qmi-utils.c
2dd08c
index df2420cf5c1f..084dba51d011 100644
2dd08c
--- a/src/libqmi-glib/qmi-utils.c
2dd08c
+++ b/src/libqmi-glib/qmi-utils.c
2dd08c
@@ -120,18 +120,13 @@ __qmi_user_allowed (uid_t uid,
2dd08c
 
2dd08c
 /*****************************************************************************/
2dd08c
 
2dd08c
-gchar *
2dd08c
-__qmi_utils_get_driver (const gchar *cdc_wdm_path,
2dd08c
-                        GError **error)
2dd08c
+static gchar *
2dd08c
+utils_get_driver (const gchar  *device_basename,
2dd08c
+                  GError      **error)
2dd08c
 {
2dd08c
     static const gchar *subsystems[] = { "usbmisc", "usb" };
2dd08c
-    guint i;
2dd08c
-    gchar *device_basename;
2dd08c
-    gchar *driver = NULL;
2dd08c
-
2dd08c
-    device_basename = __qmi_utils_get_devname (cdc_wdm_path, error);
2dd08c
-    if (!device_basename)
2dd08c
-        return NULL;
2dd08c
+    guint               i;
2dd08c
+    gchar              *driver = NULL;
2dd08c
 
2dd08c
     for (i = 0; !driver && i < G_N_ELEMENTS (subsystems); i++) {
2dd08c
         gchar *tmp;
2dd08c
@@ -153,9 +148,65 @@ __qmi_utils_get_driver (const gchar *cdc_wdm_path,
2dd08c
         g_free (path);
2dd08c
     }
2dd08c
 
2dd08c
+    if (!driver)
2dd08c
+        g_set_error (error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
2dd08c
+                     "couldn't detect device driver");
2dd08c
+    return driver;
2dd08c
+}
2dd08c
+
2dd08c
+__QmiTransportType
2dd08c
+__qmi_utils_get_transport_type (const gchar  *path,
2dd08c
+                                GError      **error)
2dd08c
+{
2dd08c
+    __QmiTransportType  transport = __QMI_TRANSPORT_TYPE_UNKNOWN;
2dd08c
+    gchar              *device_basename = NULL;
2dd08c
+    gchar              *driver = NULL;
2dd08c
+    gchar              *sysfs_path = NULL;
2dd08c
+    GError             *inner_error = NULL;
2dd08c
+
2dd08c
+    device_basename = __qmi_utils_get_devname (path, &inner_error);
2dd08c
+    if (!device_basename)
2dd08c
+        goto out;
2dd08c
+
2dd08c
+    driver = utils_get_driver (device_basename, &inner_error);
2dd08c
+
2dd08c
+    /* On Android systems we get access to the QMI control port through
2dd08c
+     * virtual smdcntl devices in the smdpkt subsystem. */
2dd08c
+    if (!driver) {
2dd08c
+        path = g_strdup_printf ("/sys/devices/virtual/smdpkt/%s", device_basename);
2dd08c
+        if (g_file_test (path, G_FILE_TEST_EXISTS)) {
2dd08c
+            g_clear_error (&inner_error);
2dd08c
+            transport = __QMI_TRANSPORT_TYPE_QMUX;
2dd08c
+        }
2dd08c
+        goto out;
2dd08c
+    }
2dd08c
+
2dd08c
+    if (!g_strcmp0 (driver, "cdc_mbim")) {
2dd08c
+        transport = __QMI_TRANSPORT_TYPE_MBIM;
2dd08c
+        goto out;
2dd08c
+    }
2dd08c
+
2dd08c
+    if (!g_strcmp0 (driver, "qmi_wwan")) {
2dd08c
+        transport = __QMI_TRANSPORT_TYPE_QMUX;
2dd08c
+        goto out;
2dd08c
+    }
2dd08c
+
2dd08c
+    g_set_error (&inner_error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
2dd08c
+                 "unexpected driver detected: %s", driver);
2dd08c
+
2dd08c
+ out:
2dd08c
+
2dd08c
     g_free (device_basename);
2dd08c
+    g_free (driver);
2dd08c
+    g_free (sysfs_path);
2dd08c
 
2dd08c
-    return driver;
2dd08c
+    if (inner_error) {
2dd08c
+        g_assert (transport == __QMI_TRANSPORT_TYPE_UNKNOWN);
2dd08c
+        g_propagate_error (error, inner_error);
2dd08c
+    } else
2dd08c
+        g_assert (transport != __QMI_TRANSPORT_TYPE_UNKNOWN);
2dd08c
+
2dd08c
+    return transport;
2dd08c
 }
2dd08c
 
2dd08c
 gchar *
2dd08c
diff --git a/src/libqmi-glib/qmi-utils.h b/src/libqmi-glib/qmi-utils.h
2dd08c
index b83bf23c184d..8a1c712dfad0 100644
2dd08c
--- a/src/libqmi-glib/qmi-utils.h
2dd08c
+++ b/src/libqmi-glib/qmi-utils.h
2dd08c
@@ -84,9 +84,16 @@ gchar *__qmi_utils_str_hex (gconstpointer mem,
2dd08c
 G_GNUC_INTERNAL
2dd08c
 gboolean __qmi_user_allowed (uid_t uid,
2dd08c
                              GError **error);
2dd08c
+
2dd08c
+typedef enum {
2dd08c
+    __QMI_TRANSPORT_TYPE_UNKNOWN,
2dd08c
+    __QMI_TRANSPORT_TYPE_QMUX,
2dd08c
+    __QMI_TRANSPORT_TYPE_MBIM,
2dd08c
+} __QmiTransportType;
2dd08c
+
2dd08c
 G_GNUC_INTERNAL
2dd08c
-gchar *__qmi_utils_get_driver (const gchar *cdc_wdm_path,
2dd08c
-                               GError **error);
2dd08c
+__QmiTransportType __qmi_utils_get_transport_type (const gchar  *path,
2dd08c
+                                                   GError      **error);
2dd08c
 
2dd08c
 G_GNUC_INTERNAL
2dd08c
 gchar *__qmi_utils_get_devname (const gchar *cdc_wdm_path,
2dd08c
-- 
2dd08c
2.31.1
2dd08c
2dd08c
2dd08c
From 00502d0353d7e056b3348514033001e0a71bbd83 Mon Sep 17 00:00:00 2001
2dd08c
From: Aleksander Morgado <aleksander@aleksander.es>
2dd08c
Date: Fri, 18 Oct 2019 11:41:49 +0200
2dd08c
Subject: [PATCH 2/3] qmi-device: when MBIM/QMUX support not enabled ignore
2dd08c
 AUTO warnings
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/issues/20
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/merge_requests/72
2dd08c
2dd08c
(cherry picked from commit 99e320c76dc41bc4b4cb0a5b55c06a825cd9224c)
2dd08c
---
2dd08c
 src/libqmi-glib/qmi-device.c | 8 ++------
2dd08c
 1 file changed, 2 insertions(+), 6 deletions(-)
2dd08c
2dd08c
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
2dd08c
index 7af4f4cd43b6..7e93fad079a4 100644
2dd08c
--- a/src/libqmi-glib/qmi-device.c
2dd08c
+++ b/src/libqmi-glib/qmi-device.c
2dd08c
@@ -1984,18 +1984,14 @@ device_setup_open_flags_by_transport (QmiDevice          *self,
2dd08c
 
2dd08c
 #else
2dd08c
 
2dd08c
-    /* Auto mode requested? */
2dd08c
-    if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_AUTO) {
2dd08c
-        g_warning ("[%s] requested auto mode but no MBIM QMUX support available", qmi_file_get_path_display (self->priv->file));
2dd08c
-        goto out;
2dd08c
-    }
2dd08c
-
2dd08c
     /* MBIM mode requested? */
2dd08c
     if (ctx->flags & QMI_DEVICE_OPEN_FLAGS_MBIM) {
2dd08c
         g_warning ("[%s] requested MBIM mode but no MBIM QMUX support available", qmi_file_get_path_display (self->priv->file));
2dd08c
         goto out;
2dd08c
     }
2dd08c
 
2dd08c
+    /* Treat AUTO as QMI mode, without warnings */
2dd08c
+
2dd08c
 #endif /* MBIM_QMUX_ENABLED */
2dd08c
 
2dd08c
     /* QMI mode requested? */
2dd08c
-- 
2dd08c
2.31.1
2dd08c
2dd08c
2dd08c
From dc013e2e3fee3583f93961900b45d6b2fc59871c Mon Sep 17 00:00:00 2001
2dd08c
From: Luca Weiss <luca@z3ntu.xyz>
2dd08c
Date: Mon, 21 Oct 2019 21:05:28 +0200
2dd08c
Subject: [PATCH 3/3] qmi-device: detect rpmsg control ports
2dd08c
2dd08c
and adjust the path to check for smdpkt nodes
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/issues/20
2dd08c
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/merge_requests/73
2dd08c
https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/merge_requests/101
2dd08c
2dd08c
(cherry picked from commit c2ceb25d6e95e37e9f3394937fd9b9b524207224)
2dd08c
(cherry picked from commit 816c36f9a1d24ac1b2a4c46d04cb2ca47d9c0a4e)
2dd08c
---
2dd08c
 src/libqmi-glib/qmi-utils.c | 16 ++++++++++++----
2dd08c
 1 file changed, 12 insertions(+), 4 deletions(-)
2dd08c
2dd08c
diff --git a/src/libqmi-glib/qmi-utils.c b/src/libqmi-glib/qmi-utils.c
2dd08c
index 084dba51d011..cb29c91c64b4 100644
2dd08c
--- a/src/libqmi-glib/qmi-utils.c
2dd08c
+++ b/src/libqmi-glib/qmi-utils.c
2dd08c
@@ -170,11 +170,19 @@ __qmi_utils_get_transport_type (const gchar  *path,
2dd08c
 
2dd08c
     driver = utils_get_driver (device_basename, &inner_error);
2dd08c
 
2dd08c
-    /* On Android systems we get access to the QMI control port through
2dd08c
-     * virtual smdcntl devices in the smdpkt subsystem. */
2dd08c
     if (!driver) {
2dd08c
-        path = g_strdup_printf ("/sys/devices/virtual/smdpkt/%s", device_basename);
2dd08c
-        if (g_file_test (path, G_FILE_TEST_EXISTS)) {
2dd08c
+        /* On Android systems we get access to the QMI control port through
2dd08c
+         * virtual smdcntl devices in the smdpkt subsystem. */
2dd08c
+        sysfs_path = g_strdup_printf ("/sys/class/smdpkt/%s", device_basename);
2dd08c
+        if (g_file_test (sysfs_path, G_FILE_TEST_EXISTS)) {
2dd08c
+            g_clear_error (&inner_error);
2dd08c
+            transport = __QMI_TRANSPORT_TYPE_QMUX;
2dd08c
+            goto out;
2dd08c
+        }
2dd08c
+        g_free (sysfs_path);
2dd08c
+        /* On mainline kernels this control port is provided by rpmsg */
2dd08c
+        sysfs_path = g_strdup_printf ("/sys/class/rpmsg/%s", device_basename);
2dd08c
+        if (g_file_test (sysfs_path, G_FILE_TEST_EXISTS)) {
2dd08c
             g_clear_error (&inner_error);
2dd08c
             transport = __QMI_TRANSPORT_TYPE_QMUX;
2dd08c
         }
2dd08c
-- 
2dd08c
2.31.1
2dd08c