diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kerneldevice/mm-kernel-device-generic.c | 14 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.c | 11 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.c | 12 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.h | 2 |
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); |