From 591db5e4555dbb3699ab752e3b736f550d965fc4 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Fri, 12 Feb 2021 11:18:32 +0100 Subject: kernel-device-udev: setup 'lower device' for virtual ports --- src/kerneldevice/mm-kernel-device-udev.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/kerneldevice/mm-kernel-device-udev.c') diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c index 0687ec64..e2707c3a 100644 --- a/src/kerneldevice/mm-kernel-device-udev.c +++ b/src/kerneldevice/mm-kernel-device-udev.c @@ -22,6 +22,7 @@ #include #include "mm-kernel-device-udev.h" +#include "mm-kernel-device-helpers.h" #include "mm-log-object.h" static void initable_iface_init (GInitableIface *iface); @@ -73,10 +74,33 @@ udev_device_get_sysfs_attr_as_hex (GUdevDevice *device, static void preload_contents_other (MMKernelDeviceUdev *self) { + g_autofree gchar *lower_device_name = NULL; + /* For any other kind of bus (or the absence of one, as in virtual devices), * assume this is a single port device and don't try to match multiple ports * together. Also, obviously, no vendor, product, revision or interface. */ self->priv->driver = g_strdup (g_udev_device_get_driver (self->priv->device)); + + /* But look for a lower real physical device, as we may have one */ + lower_device_name = mm_kernel_device_get_lower_device_name (g_udev_device_get_sysfs_path (self->priv->device)); + if (lower_device_name) { + g_autoptr(GUdevDevice) lower_device = NULL; + const gchar *subsystem; + + subsystem = g_udev_device_get_subsystem (self->priv->device); + lower_device = g_udev_client_query_by_subsystem_and_name (self->priv->client, subsystem, lower_device_name); + if (!lower_device) { + mm_obj_dbg (self, "couldn't find lower device: %s/%s", subsystem, lower_device_name); + } else { + g_autoptr(MMKernelDevice) lower_kernel_device = NULL; + + mm_obj_dbg (self, "setting up lower device: %s/%s", subsystem, lower_device_name); + lower_kernel_device = mm_kernel_device_udev_new (self->priv->client, lower_device); + g_object_set (self, + "lower-device", lower_kernel_device, + NULL); + } + } } static void -- cgit v1.2.3-70-g09d2