summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-06-02 22:19:55 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-06-03 12:27:27 +0200
commitbf7d8e043a3d14361d2d9d6db4c29f2d9d85de0c (patch)
treea412240f3afbf67182f27a8f428e668da34dc5c0
parentb24f8af1e8df9a81ea13dc403b8e5e58a14b5ea0 (diff)
downloadlibqmi-bf7d8e043a3d14361d2d9d6db4c29f2d9d85de0c.tar.gz
libqmi-glib,helpers: wwan devices detected by subsystem only
Don't attempt to load the device driver; it's really only applicable to USB. For The new WWAN subsystem, we rely exclusively on a subsystem check. (cherry picked from commit 026158ab1a7d31811f4c254d3b0edd5c6f5e1adc)
-rw-r--r--src/libqmi-glib/qmi-helpers.c109
1 files changed, 42 insertions, 67 deletions
diff --git a/src/libqmi-glib/qmi-helpers.c b/src/libqmi-glib/qmi-helpers.c
index dff1f057..b52e6835 100644
--- a/src/libqmi-glib/qmi-helpers.c
+++ b/src/libqmi-glib/qmi-helpers.c
@@ -429,10 +429,9 @@ qmi_helpers_string_utf8_from_ucs2le (const guint8 *ucs2le,
/*****************************************************************************/
static gchar *
-helpers_get_driver (const gchar *device_basename,
- GError **error)
+helpers_get_usb_driver (const gchar *device_basename)
{
- static const gchar *subsystems[] = { "usbmisc", "usb", "wwan" };
+ static const gchar *subsystems[] = { "usbmisc", "usb" };
guint i;
gchar *driver = NULL;
@@ -456,9 +455,6 @@ helpers_get_driver (const gchar *device_basename,
g_free (path);
}
- if (!driver)
- g_set_error (error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
- "couldn't detect device driver");
return driver;
}
@@ -466,75 +462,54 @@ QmiHelpersTransportType
qmi_helpers_get_transport_type (const gchar *path,
GError **error)
{
- QmiHelpersTransportType transport = QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN;
- gchar *device_basename = NULL;
- gchar *driver = NULL;
- gchar *sysfs_path = NULL;
- GError *inner_error = NULL;
+ g_autofree gchar *device_basename = NULL;
+ g_autofree gchar *usb_driver = NULL;
+ g_autofree gchar *wwan_sysfs_path = NULL;
+ g_autofree gchar *smdpkt_sysfs_path = NULL;
+ g_autofree gchar *rpmsg_sysfs_path = NULL;
- device_basename = qmi_helpers_get_devname (path, &inner_error);
+ device_basename = qmi_helpers_get_devname (path, error);
if (!device_basename)
- goto out;
-
- driver = helpers_get_driver (device_basename, &inner_error);
-
- if (!driver) {
- /* On Android systems we get access to the QMI control port through
- * virtual smdcntl devices in the smdpkt subsystem. */
- sysfs_path = g_strdup_printf ("/sys/class/smdpkt/%s", device_basename);
- if (g_file_test (sysfs_path, G_FILE_TEST_EXISTS)) {
- g_clear_error (&inner_error);
- transport = QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- goto out;
- }
- g_free (sysfs_path);
- /* On mainline kernels this control port is provided by rpmsg */
- sysfs_path = g_strdup_printf ("/sys/class/rpmsg/%s", device_basename);
- if (g_file_test (sysfs_path, G_FILE_TEST_EXISTS)) {
- g_clear_error (&inner_error);
- transport = QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- }
- goto out;
- }
-
- if (!g_strcmp0 (driver, "cdc_mbim")) {
- transport = QMI_HELPERS_TRANSPORT_TYPE_MBIM;
- goto out;
- }
-
- if (!g_strcmp0 (driver, "qmi_wwan")) {
- transport = QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- goto out;
+ return QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN;
+
+ /* Most likely case, we have a USB driver */
+ usb_driver = helpers_get_usb_driver (device_basename);
+ if (usb_driver) {
+ if (!g_strcmp0 (usb_driver, "cdc_mbim"))
+ return QMI_HELPERS_TRANSPORT_TYPE_MBIM;
+ if (!g_strcmp0 (usb_driver, "qmi_wwan"))
+ return QMI_HELPERS_TRANSPORT_TYPE_QMUX;
+ g_set_error (error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
+ "unexpected usb driver detected: %s", usb_driver);
+ return QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN;
}
- if (!g_strcmp0 (driver, "wwan")) {
- /* MHI/PCIe uci devices have protocol in their name */
- if (g_strrstr (device_basename, "QMI")) {
- transport = QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- goto out;
- }
- if (g_strrstr (device_basename, "MBIM")) {
- transport = QMI_HELPERS_TRANSPORT_TYPE_MBIM;
- goto out;
- }
+ /* MHI/PCIe uci devices have protocol in their name */
+ wwan_sysfs_path = g_strdup_printf ("/sys/class/wwan/%s", device_basename);
+ if (g_file_test (wwan_sysfs_path, G_FILE_TEST_EXISTS)) {
+ if (g_strrstr (device_basename, "QMI"))
+ return QMI_HELPERS_TRANSPORT_TYPE_QMUX;
+ if (g_strrstr (device_basename, "MBIM"))
+ return QMI_HELPERS_TRANSPORT_TYPE_MBIM;
+ g_set_error (error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
+ "unsupported wwan port");
+ return QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN;
}
- g_set_error (&inner_error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
- "unexpected driver detected: %s", driver);
-
- out:
-
- g_free (device_basename);
- g_free (driver);
- g_free (sysfs_path);
+ /* On Android systems we get access to the QMI control port through
+ * virtual smdcntl devices in the smdpkt subsystem. */
+ smdpkt_sysfs_path = g_strdup_printf ("/sys/class/smdpkt/%s", device_basename);
+ if (g_file_test (smdpkt_sysfs_path, G_FILE_TEST_EXISTS))
+ return QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- if (inner_error) {
- g_assert (transport == QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN);
- g_propagate_error (error, inner_error);
- } else
- g_assert (transport != QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN);
+ /* On mainline kernels this control port is provided by rpmsg */
+ rpmsg_sysfs_path = g_strdup_printf ("/sys/class/rpmsg/%s", device_basename);
+ if (g_file_test (rpmsg_sysfs_path, G_FILE_TEST_EXISTS))
+ return QMI_HELPERS_TRANSPORT_TYPE_QMUX;
- return transport;
+ g_set_error (error, QMI_CORE_ERROR, QMI_CORE_ERROR_FAILED,
+ "unexpected port subsystem");
+ return QMI_HELPERS_TRANSPORT_TYPE_UNKNOWN;
}
gchar *