device: load driver being used when first port grabbed
This commit is contained in:
@@ -43,6 +43,9 @@ struct _MMDevicePrivate {
|
|||||||
GUdevDevice *udev_device;
|
GUdevDevice *udev_device;
|
||||||
gchar *udev_device_path;
|
gchar *udev_device_path;
|
||||||
|
|
||||||
|
/* Kernel driver managing this device */
|
||||||
|
gchar *driver;
|
||||||
|
|
||||||
/* Best plugin to manage this device */
|
/* Best plugin to manage this device */
|
||||||
MMPlugin *plugin;
|
MMPlugin *plugin;
|
||||||
|
|
||||||
@@ -75,6 +78,37 @@ mm_device_owns_port (MMDevice *self,
|
|||||||
(GCompareFunc)udev_port_cmp);
|
(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
|
void
|
||||||
mm_device_grab_port (MMDevice *self,
|
mm_device_grab_port (MMDevice *self,
|
||||||
GUdevDevice *udev_port)
|
GUdevDevice *udev_port)
|
||||||
@@ -82,6 +116,15 @@ mm_device_grab_port (MMDevice *self,
|
|||||||
if (!g_list_find_custom (self->priv->udev_ports,
|
if (!g_list_find_custom (self->priv->udev_ports,
|
||||||
udev_port,
|
udev_port,
|
||||||
(GCompareFunc)udev_port_cmp)) {
|
(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,
|
self->priv->udev_ports = g_list_prepend (self->priv->udev_ports,
|
||||||
g_object_ref (udev_port));
|
g_object_ref (udev_port));
|
||||||
}
|
}
|
||||||
@@ -257,6 +300,12 @@ mm_device_get_path (MMDevice *self)
|
|||||||
return self->priv->udev_device_path;
|
return self->priv->udev_device_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gchar *
|
||||||
|
mm_device_get_driver (MMDevice *self)
|
||||||
|
{
|
||||||
|
return self->priv->driver;
|
||||||
|
}
|
||||||
|
|
||||||
GUdevDevice *
|
GUdevDevice *
|
||||||
mm_device_peek_udev_device (MMDevice *self)
|
mm_device_peek_udev_device (MMDevice *self)
|
||||||
{
|
{
|
||||||
@@ -398,6 +447,7 @@ finalize (GObject *object)
|
|||||||
MMDevice *self = MM_DEVICE (object);
|
MMDevice *self = MM_DEVICE (object);
|
||||||
|
|
||||||
g_free (self->priv->udev_device_path);
|
g_free (self->priv->udev_device_path);
|
||||||
|
g_free (self->priv->driver);
|
||||||
|
|
||||||
G_OBJECT_CLASS (mm_device_parent_class)->finalize (object);
|
G_OBJECT_CLASS (mm_device_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
@@ -64,6 +64,7 @@ gboolean mm_device_create_modem (MMDevice *self,
|
|||||||
void mm_device_remove_modem (MMDevice *self);
|
void mm_device_remove_modem (MMDevice *self);
|
||||||
|
|
||||||
const gchar *mm_device_get_path (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_peek_udev_device (MMDevice *self);
|
||||||
GUdevDevice *mm_device_get_udev_device (MMDevice *self);
|
GUdevDevice *mm_device_get_udev_device (MMDevice *self);
|
||||||
void mm_device_set_plugin (MMDevice *self,
|
void mm_device_set_plugin (MMDevice *self,
|
||||||
|
Reference in New Issue
Block a user