aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-device.c50
-rw-r--r--src/mm-device.h1
2 files changed, 51 insertions, 0 deletions
diff --git a/src/mm-device.c b/src/mm-device.c
index dc7bde29..0fe8f205 100644
--- a/src/mm-device.c
+++ b/src/mm-device.c
@@ -43,6 +43,9 @@ struct _MMDevicePrivate {
GUdevDevice *udev_device;
gchar *udev_device_path;
+ /* Kernel driver managing this device */
+ gchar *driver;
+
/* Best plugin to manage this device */
MMPlugin *plugin;
@@ -75,6 +78,37 @@ mm_device_owns_port (MMDevice *self,
(GCompareFunc)udev_port_cmp);
}
+static gchar *
+get_driver_name (GUdevDevice *device)
+{
+ GUdevDevice *parent = NULL;
+ const gchar *driver, *subsys;
+ gchar *ret = NULL;
+
+ driver = g_udev_device_get_driver (device);
+ if (!driver) {
+ parent = g_udev_device_get_parent (device);
+ if (parent)
+ driver = g_udev_device_get_driver (parent);
+
+ /* Check for bluetooth; it's driver is a bunch of levels up so we
+ * just check for the subsystem of the parent being bluetooth.
+ */
+ if (!driver && parent) {
+ subsys = g_udev_device_get_subsystem (parent);
+ if (subsys && !strcmp (subsys, "bluetooth"))
+ driver = "bluetooth";
+ }
+ }
+
+ if (driver)
+ ret = g_strdup (driver);
+ if (parent)
+ g_object_unref (parent);
+
+ return ret;
+}
+
void
mm_device_grab_port (MMDevice *self,
GUdevDevice *udev_port)
@@ -82,6 +116,15 @@ mm_device_grab_port (MMDevice *self,
if (!g_list_find_custom (self->priv->udev_ports,
udev_port,
(GCompareFunc)udev_port_cmp)) {
+
+ /* Get the driver name out of the first port grabbed */
+ if (!self->priv->udev_ports) {
+ self->priv->driver = get_driver_name (udev_port);
+ mm_dbg ("(%s) managed by driver '%s'",
+ self->priv->udev_device_path,
+ self->priv->driver);
+ }
+
self->priv->udev_ports = g_list_prepend (self->priv->udev_ports,
g_object_ref (udev_port));
}
@@ -257,6 +300,12 @@ mm_device_get_path (MMDevice *self)
return self->priv->udev_device_path;
}
+const gchar *
+mm_device_get_driver (MMDevice *self)
+{
+ return self->priv->driver;
+}
+
GUdevDevice *
mm_device_peek_udev_device (MMDevice *self)
{
@@ -398,6 +447,7 @@ finalize (GObject *object)
MMDevice *self = MM_DEVICE (object);
g_free (self->priv->udev_device_path);
+ g_free (self->priv->driver);
G_OBJECT_CLASS (mm_device_parent_class)->finalize (object);
}
diff --git a/src/mm-device.h b/src/mm-device.h
index c0c24686..f9997c06 100644
--- a/src/mm-device.h
+++ b/src/mm-device.h
@@ -64,6 +64,7 @@ gboolean mm_device_create_modem (MMDevice *self,
void mm_device_remove_modem (MMDevice *self);
const gchar *mm_device_get_path (MMDevice *self);
+const gchar *mm_device_get_driver (MMDevice *self);
GUdevDevice *mm_device_peek_udev_device (MMDevice *self);
GUdevDevice *mm_device_get_udev_device (MMDevice *self);
void mm_device_set_plugin (MMDevice *self,