aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c14
-rw-r--r--src/kerneldevice/mm-kernel-device-udev.c11
-rw-r--r--src/kerneldevice/mm-kernel-device.c12
-rw-r--r--src/kerneldevice/mm-kernel-device.h2
4 files changed, 39 insertions, 0 deletions
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c
index 81ef962a..1ff63575 100644
--- a/src/kerneldevice/mm-kernel-device-generic.c
+++ b/src/kerneldevice/mm-kernel-device-generic.c
@@ -69,6 +69,7 @@ struct _MMKernelDeviceGenericPrivate {
guint16 physdev_vid;
guint16 physdev_pid;
guint16 physdev_subsystem_vid;
+ guint16 physdev_subsystem_pid;
guint16 physdev_revision;
gchar *physdev_manufacturer;
gchar *physdev_product;
@@ -402,6 +403,7 @@ preload_contents_pci (MMKernelDeviceGeneric *self)
self->priv->physdev_vid = read_sysfs_attribute_as_hex (self->priv->physdev_sysfs_path, "vendor");
self->priv->physdev_pid = read_sysfs_attribute_as_hex (self->priv->physdev_sysfs_path, "device");
self->priv->physdev_subsystem_vid = read_sysfs_attribute_as_hex (self->priv->physdev_sysfs_path, "subsystem_vendor");
+ self->priv->physdev_subsystem_pid = read_sysfs_attribute_as_hex (self->priv->physdev_sysfs_path, "subsystem_device");
self->priv->physdev_revision = read_sysfs_attribute_as_hex (self->priv->physdev_sysfs_path, "revision");
/* stop traversing as soon as the physical device is found */
break;
@@ -585,6 +587,8 @@ preload_contents (MMKernelDeviceGeneric *self)
mm_obj_dbg (self, " product: %04x", self->priv->physdev_pid);
if (self->priv->physdev_subsystem_vid)
mm_obj_dbg (self, " subsystem vendor: %04x", self->priv->physdev_subsystem_vid);
+ if (self->priv->physdev_subsystem_pid)
+ mm_obj_dbg (self, " subsystem device: %04x", self->priv->physdev_subsystem_pid);
if (self->priv->physdev_revision)
mm_obj_dbg (self, " revision: %04x", self->priv->physdev_revision);
if (self->priv->physdev_manufacturer)
@@ -705,6 +709,12 @@ kernel_device_get_physdev_subsystem_vid (MMKernelDevice *self)
}
static guint16
+kernel_device_get_physdev_subsystem_pid (MMKernelDevice *self)
+{
+ return MM_KERNEL_DEVICE_GENERIC (self)->priv->physdev_subsystem_pid;
+}
+
+static guint16
kernel_device_get_physdev_revision (MMKernelDevice *self)
{
return MM_KERNEL_DEVICE_GENERIC (self)->priv->physdev_revision;
@@ -827,6 +837,9 @@ check_condition (MMKernelDeviceGeneric *self,
else if (g_str_equal (attribute, "subsystem_vendor"))
result = ((mm_get_uint_from_hex_str (match->value, &val)) &&
((mm_kernel_device_get_physdev_subsystem_vid (MM_KERNEL_DEVICE (self)) == val) == condition_equal));
+ else if (g_str_equal (attribute, "subsystem_device"))
+ result = ((mm_get_uint_from_hex_str (match->value, &val)) &&
+ ((mm_kernel_device_get_physdev_subsystem_pid (MM_KERNEL_DEVICE (self)) == val) == condition_equal));
/* manufacturer in the physdev */
else if (g_str_equal (attribute, "manufacturer"))
result = ((self->priv->physdev_manufacturer && g_str_equal (self->priv->physdev_manufacturer, match->value)) == condition_equal);
@@ -1214,6 +1227,7 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass)
kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid;
kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid;
kernel_device_class->get_physdev_subsystem_vid = kernel_device_get_physdev_subsystem_vid;
+ kernel_device_class->get_physdev_subsystem_pid = kernel_device_get_physdev_subsystem_pid;
kernel_device_class->get_physdev_revision = kernel_device_get_physdev_revision;
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c
index 09b65db4..7fede022 100644
--- a/src/kerneldevice/mm-kernel-device-udev.c
+++ b/src/kerneldevice/mm-kernel-device-udev.c
@@ -49,6 +49,7 @@ struct _MMKernelDeviceUdevPrivate {
guint16 vendor;
guint16 product;
guint16 subsystem_vendor;
+ guint16 subsystem_device;
guint16 revision;
gchar *driver;
@@ -188,6 +189,7 @@ preload_contents_pci (MMKernelDeviceUdev *self)
self->priv->vendor = udev_device_get_sysfs_attr_as_hex (iter, "vendor");
self->priv->product = udev_device_get_sysfs_attr_as_hex (iter, "device");
self->priv->subsystem_vendor = udev_device_get_sysfs_attr_as_hex (iter, "subsystem_vendor");
+ self->priv->subsystem_device = udev_device_get_sysfs_attr_as_hex (iter, "subsystem_device");
self->priv->revision = udev_device_get_sysfs_attr_as_hex (iter, "revision");
self->priv->physdev = g_object_ref (iter);
/* stop traversing as soon as the physical device is found */
@@ -300,6 +302,8 @@ preload_contents (MMKernelDeviceUdev *self)
mm_obj_dbg (self, " product: %04x", self->priv->product);
if (self->priv->subsystem_vendor)
mm_obj_dbg (self, " subsystem vendor: %04x", self->priv->subsystem_vendor);
+ if (self->priv->subsystem_device)
+ mm_obj_dbg (self, " subsystem device: %04x", self->priv->subsystem_device);
if (self->priv->revision)
mm_obj_dbg (self, " revision: %04x", self->priv->revision);
}
@@ -418,6 +422,12 @@ kernel_device_get_physdev_subsystem_vid (MMKernelDevice *self)
}
static guint16
+kernel_device_get_physdev_subsystem_pid (MMKernelDevice *self)
+{
+ return MM_KERNEL_DEVICE_UDEV (self)->priv->subsystem_device;
+}
+
+static guint16
kernel_device_get_physdev_revision (MMKernelDevice *self)
{
return MM_KERNEL_DEVICE_UDEV (self)->priv->revision;
@@ -816,6 +826,7 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass)
kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid;
kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid;
kernel_device_class->get_physdev_subsystem_vid = kernel_device_get_physdev_subsystem_vid;
+ kernel_device_class->get_physdev_subsystem_pid = kernel_device_get_physdev_subsystem_pid;
kernel_device_class->get_physdev_revision = kernel_device_get_physdev_revision;
kernel_device_class->get_physdev_sysfs_path = kernel_device_get_physdev_sysfs_path;
kernel_device_class->get_physdev_subsystem = kernel_device_get_physdev_subsystem;
diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c
index f016133a..875a46a6 100644
--- a/src/kerneldevice/mm-kernel-device.c
+++ b/src/kerneldevice/mm-kernel-device.c
@@ -118,6 +118,18 @@ mm_kernel_device_get_physdev_subsystem_vid (MMKernelDevice *self)
}
guint16
+mm_kernel_device_get_physdev_subsystem_pid (MMKernelDevice *self)
+{
+ /* when a lower device is available, physdev info taken from it */
+ if (self->priv->lower_device)
+ return mm_kernel_device_get_physdev_subsystem_pid (self->priv->lower_device);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_physdev_subsystem_pid ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_physdev_subsystem_pid (self) :
+ 0);
+}
+
+guint16
mm_kernel_device_get_physdev_pid (MMKernelDevice *self)
{
/* when a lower device is available, physdev info taken from it */
diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h
index 403ae598..54a7ba86 100644
--- a/src/kerneldevice/mm-kernel-device.h
+++ b/src/kerneldevice/mm-kernel-device.h
@@ -56,6 +56,7 @@ struct _MMKernelDeviceClass {
guint16 (* get_physdev_vid) (MMKernelDevice *self);
guint16 (* get_physdev_pid) (MMKernelDevice *self);
guint16 (* get_physdev_subsystem_vid) (MMKernelDevice *self);
+ guint16 (* get_physdev_subsystem_pid) (MMKernelDevice *self);
guint16 (* get_physdev_revision) (MMKernelDevice *self);
const gchar * (* get_physdev_sysfs_path) (MMKernelDevice *self);
const gchar * (* get_physdev_subsystem) (MMKernelDevice *self);
@@ -93,6 +94,7 @@ const gchar *mm_kernel_device_get_physdev_uid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_vid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_pid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_subsystem_vid (MMKernelDevice *self);
+guint16 mm_kernel_device_get_physdev_subsystem_pid (MMKernelDevice *self);
guint16 mm_kernel_device_get_physdev_revision (MMKernelDevice *self);
const gchar *mm_kernel_device_get_physdev_sysfs_path (MMKernelDevice *self);
const gchar *mm_kernel_device_get_physdev_subsystem (MMKernelDevice *self);