From 42ad7b758a09b91bba6cda7fe9ac06525aa86f6a Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 13 Feb 2014 15:18:16 -0600 Subject: [PATCH] manager: make Bluetooth rfcomm ports work again At some point rfcomm serial ports stopped having parents in sysfs, so checks to get the physical device fail because the rfcomm port is /sys/devices/virtual/rfcommX and has no parents. So we have to fall back on checking the interface name. --- src/mm-device.c | 7 +++++++ src/mm-manager.c | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/mm-device.c b/src/mm-device.c index d2ca4de4..0d65d19b 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -232,6 +232,7 @@ const gchar * mm_device_utils_get_port_driver (GUdevDevice *udev_port) { const gchar *driver, *subsys; + const char *name = g_udev_device_get_name (udev_port); driver = g_udev_device_get_driver (udev_port); if (!driver) { @@ -254,6 +255,12 @@ mm_device_utils_get_port_driver (GUdevDevice *udev_port) g_object_unref (parent); } + /* Newer kernels don't set up the rfcomm port parent in sysfs, + * so we must infer it from the device name. + */ + if (!driver && strncmp (name, "rfcomm", 6) == 0) + driver = "bluetooth"; + return driver; } diff --git a/src/mm-manager.c b/src/mm-manager.c index 8c7969ee..3d5eea8b 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -170,13 +170,20 @@ find_physical_device (GUdevDevice *child) { GUdevDevice *iter, *old = NULL; GUdevDevice *physdev = NULL; - const char *subsys, *type; + const char *subsys, *type, *name; guint32 i = 0; gboolean is_usb = FALSE, is_pci = FALSE, is_pcmcia = FALSE, is_platform = FALSE; gboolean is_pnp = FALSE; g_return_val_if_fail (child != NULL, NULL); + /* Bluetooth rfcomm devices are "virtual" and don't necessarily have + * parents at all. + */ + name = g_udev_device_get_name (child); + if (name && strncmp (name, "rfcomm", 6) == 0) + return g_object_ref (child); + iter = g_object_ref (child); while (iter && i++ < 8) { subsys = g_udev_device_get_subsystem (iter);