aboutsummaryrefslogtreecommitdiff
path: root/src/kerneldevice
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-10-16 23:46:41 +0200
committerAleksander Morgado <aleksander@aleksander.es>2017-12-05 10:58:29 +0100
commit33583ca4dea8dd14e9090fc011986577b14b8ede (patch)
treefc482e7c547c02c15a47d492980f202ca5f5acb9 /src/kerneldevice
parent5b3baa02d368aa2cb41420f62af712fa29837f2b (diff)
kerneldevice: allow getting interface class/subclass/protocol
Diffstat (limited to 'src/kerneldevice')
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c31
-rw-r--r--src/kerneldevice/mm-kernel-device-udev.c60
-rw-r--r--src/kerneldevice/mm-kernel-device.c36
-rw-r--r--src/kerneldevice/mm-kernel-device.h18
4 files changed, 124 insertions, 21 deletions
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c
index 0afd3a8f..6b0f0724 100644
--- a/src/kerneldevice/mm-kernel-device-generic.c
+++ b/src/kerneldevice/mm-kernel-device-generic.c
@@ -442,8 +442,32 @@ kernel_device_get_sysfs_path (MMKernelDevice *self)
return MM_KERNEL_DEVICE_GENERIC (self)->priv->sysfs_path;
}
+static gint
+kernel_device_get_interface_class (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), -1);
+
+ return (gint) MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_class;
+}
+
+static gint
+kernel_device_get_interface_subclass (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), -1);
+
+ return (gint) MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_subclass;
+}
+
+static gint
+kernel_device_get_interface_protocol (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), -1);
+
+ return (gint) MM_KERNEL_DEVICE_GENERIC (self)->priv->interface_protocol;
+}
+
static const gchar *
-kernel_device_get_parent_sysfs_path (MMKernelDevice *self)
+kernel_device_get_interface_sysfs_path (MMKernelDevice *self)
{
g_return_val_if_fail (MM_IS_KERNEL_DEVICE_GENERIC (self), NULL);
@@ -1057,7 +1081,10 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass)
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer;
- kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path;
+ kernel_device_class->get_interface_class = kernel_device_get_interface_class;
+ kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass;
+ kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol;
+ kernel_device_class->get_interface_sysfs_path = kernel_device_get_interface_sysfs_path;
kernel_device_class->cmp = kernel_device_cmp;
kernel_device_class->has_property = kernel_device_has_property;
kernel_device_class->get_property = kernel_device_get_property;
diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c
index 3cedb2a8..2c2bc790 100644
--- a/src/kerneldevice/mm-kernel-device-udev.c
+++ b/src/kerneldevice/mm-kernel-device-udev.c
@@ -242,6 +242,17 @@ ensure_physdev (MMKernelDeviceUdev *self)
/*****************************************************************************/
+static void
+ensure_parent (MMKernelDeviceUdev *self)
+{
+ if (self->priv->parent)
+ return;
+ if (self->priv->device)
+ self->priv->parent = g_udev_device_get_parent (self->priv->device);
+}
+
+/*****************************************************************************/
+
static const gchar *
kernel_device_get_subsystem (MMKernelDevice *_self)
{
@@ -428,17 +439,51 @@ kernel_device_get_physdev_manufacturer (MMKernelDevice *_self)
return g_udev_device_get_sysfs_attr (self->priv->physdev, "manufacturer");
}
-static const gchar *
-kernel_device_get_parent_sysfs_path (MMKernelDevice *_self)
+static gint
+kernel_device_get_interface_class (MMKernelDevice *_self)
{
MMKernelDeviceUdev *self;
- g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), 0);
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), -1);
self = MM_KERNEL_DEVICE_UDEV (_self);
+ ensure_parent (self);
+ return (self->priv->parent ? g_udev_device_get_sysfs_attr_as_int (self->priv->parent, "bInterfaceClass") : -1);
+}
- if (!self->priv->parent && self->priv->device)
- self->priv->parent = g_udev_device_get_parent (self->priv->device);
+static gint
+kernel_device_get_interface_subclass (MMKernelDevice *_self)
+{
+ MMKernelDeviceUdev *self;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), -1);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+ ensure_parent (self);
+ return (self->priv->parent ? g_udev_device_get_sysfs_attr_as_int (self->priv->parent, "bInterfaceSubClass") : -1);
+}
+
+static gint
+kernel_device_get_interface_protocol (MMKernelDevice *_self)
+{
+ MMKernelDeviceUdev *self;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), -1);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+ ensure_parent (self);
+ return (self->priv->parent ? g_udev_device_get_sysfs_attr_as_int (self->priv->parent, "bInterfaceProtocol") : -1);
+}
+
+static const gchar *
+kernel_device_get_interface_sysfs_path (MMKernelDevice *_self)
+{
+ MMKernelDeviceUdev *self;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), NULL);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+ ensure_parent (self);
return (self->priv->parent ? g_udev_device_get_sysfs_path (self->priv->parent) : NULL);
}
@@ -837,7 +882,10 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass)
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
kernel_device_class->get_physdev_manufacturer = kernel_device_get_physdev_manufacturer;
- kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path;
+ kernel_device_class->get_interface_class = kernel_device_get_interface_class;
+ kernel_device_class->get_interface_subclass = kernel_device_get_interface_subclass;
+ kernel_device_class->get_interface_protocol = kernel_device_get_interface_protocol;
+ kernel_device_class->get_interface_sysfs_path = kernel_device_get_interface_sysfs_path;
kernel_device_class->cmp = kernel_device_cmp;
kernel_device_class->has_property = kernel_device_has_property;
kernel_device_class->get_property = kernel_device_get_property;
diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c
index 996594e5..c4a6d8db 100644
--- a/src/kerneldevice/mm-kernel-device.c
+++ b/src/kerneldevice/mm-kernel-device.c
@@ -123,13 +123,43 @@ mm_kernel_device_get_physdev_manufacturer (MMKernelDevice *self)
NULL);
}
+gint
+mm_kernel_device_get_interface_class (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), -1);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_class ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_class (self) :
+ -1);
+}
+
+gint
+mm_kernel_device_get_interface_subclass (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), -1);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_subclass ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_subclass (self) :
+ -1);
+}
+
+gint
+mm_kernel_device_get_interface_protocol (MMKernelDevice *self)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), -1);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_protocol ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_protocol (self) :
+ -1);
+}
+
const gchar *
-mm_kernel_device_get_parent_sysfs_path (MMKernelDevice *self)
+mm_kernel_device_get_interface_sysfs_path (MMKernelDevice *self)
{
g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), NULL);
- return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_parent_sysfs_path ?
- MM_KERNEL_DEVICE_GET_CLASS (self)->get_parent_sysfs_path (self) :
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_sysfs_path ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_interface_sysfs_path (self) :
NULL);
}
diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h
index f1e048d3..b50e213c 100644
--- a/src/kerneldevice/mm-kernel-device.h
+++ b/src/kerneldevice/mm-kernel-device.h
@@ -37,25 +37,20 @@ struct _MMKernelDeviceClass {
GObjectClass parent;
const gchar * (* get_subsystem) (MMKernelDevice *self);
-
const gchar * (* get_name) (MMKernelDevice *self);
-
const gchar * (* get_driver) (MMKernelDevice *self);
-
const gchar * (* get_sysfs_path) (MMKernelDevice *self);
- const gchar * (* get_parent_sysfs_path) (MMKernelDevice *self);
+ gint (* get_interface_class) (MMKernelDevice *self);
+ gint (* get_interface_subclass) (MMKernelDevice *self);
+ gint (* get_interface_protocol) (MMKernelDevice *self);
+ const gchar * (* get_interface_sysfs_path) (MMKernelDevice *self);
const gchar * (* get_physdev_uid) (MMKernelDevice *self);
-
guint16 (* get_physdev_vid) (MMKernelDevice *self);
-
guint16 (* get_physdev_pid) (MMKernelDevice *self);
-
const gchar * (* get_physdev_sysfs_path) (MMKernelDevice *self);
-
const gchar * (* get_physdev_subsystem) (MMKernelDevice *self);
-
const gchar * (* get_physdev_manufacturer) (MMKernelDevice *self);
gboolean (* cmp) (MMKernelDevice *a, MMKernelDevice *b);
@@ -80,7 +75,10 @@ const gchar *mm_kernel_device_get_name (MMKernelDevice *self);
const gchar *mm_kernel_device_get_driver (MMKernelDevice *self);
const gchar *mm_kernel_device_get_sysfs_path (MMKernelDevice *self);
-const gchar *mm_kernel_device_get_parent_sysfs_path (MMKernelDevice *self);
+gint mm_kernel_device_get_interface_class (MMKernelDevice *self);
+gint mm_kernel_device_get_interface_subclass (MMKernelDevice *self);
+gint mm_kernel_device_get_interface_protocol (MMKernelDevice *self);
+const gchar *mm_kernel_device_get_interface_sysfs_path (MMKernelDevice *self);
const gchar *mm_kernel_device_get_physdev_uid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_vid (MMKernelDevice *self);