kernel-device-udev: setup 'lower device' for virtual ports

This commit is contained in:
Aleksander Morgado
2021-02-12 11:18:32 +01:00
parent 73830f0bd0
commit 591db5e455

View File

@@ -22,6 +22,7 @@
#include <ModemManager-tags.h> #include <ModemManager-tags.h>
#include "mm-kernel-device-udev.h" #include "mm-kernel-device-udev.h"
#include "mm-kernel-device-helpers.h"
#include "mm-log-object.h" #include "mm-log-object.h"
static void initable_iface_init (GInitableIface *iface); static void initable_iface_init (GInitableIface *iface);
@@ -73,10 +74,33 @@ udev_device_get_sysfs_attr_as_hex (GUdevDevice *device,
static void static void
preload_contents_other (MMKernelDeviceUdev *self) 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), /* 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 * assume this is a single port device and don't try to match multiple ports
* together. Also, obviously, no vendor, product, revision or interface. */ * together. Also, obviously, no vendor, product, revision or interface. */
self->priv->driver = g_strdup (g_udev_device_get_driver (self->priv->device)); 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 static void