diff options
-rw-r--r-- | src/kerneldevice/mm-kernel-device-generic.c | 34 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device-udev.c | 22 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.c | 8 | ||||
-rw-r--r-- | src/kerneldevice/mm-kernel-device.h | 4 |
4 files changed, 68 insertions, 0 deletions
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c index 58316e78..9c6cc292 100644 --- a/src/kerneldevice/mm-kernel-device-generic.c +++ b/src/kerneldevice/mm-kernel-device-generic.c @@ -58,6 +58,7 @@ struct _MMKernelDeviceGenericPrivate { gchar **drivers; gchar **subsystems; gchar *sysfs_path; + gchar *wwandev_sysfs_path; gchar *interface_sysfs_path; guint8 interface_class; guint8 interface_subclass; @@ -460,6 +461,30 @@ preload_contents_usb (MMKernelDeviceGeneric *self) self->priv->subsystems = (gchar **) g_ptr_array_free (subsystems, FALSE); } +static void +preload_contents_wwan (MMKernelDeviceGeneric *self) +{ + g_autofree gchar *iter = NULL; + + /* Find the first parent device subsystem */ + iter = g_path_get_dirname(self->priv->sysfs_path); + while (iter && (g_strcmp0 (iter, "/") != 0)) { + g_autofree gchar *current_subsystem = NULL; + gchar *parent; + + current_subsystem = read_sysfs_attribute_link_basename (iter, "subsystem"); + if (current_subsystem) { + if (g_strcmp0 (current_subsystem, "wwan") == 0) + self->priv->wwandev_sysfs_path = g_strdup (iter); + break; + } + + parent = g_path_get_dirname (iter); + g_clear_pointer (&iter, g_free); + iter = parent; + } +} + static gchar * find_device_bus_subsystem (MMKernelDeviceGeneric *self) { @@ -518,6 +543,8 @@ preload_contents (MMKernelDeviceGeneric *self) else preload_contents_other (self); + preload_contents_wwan (self); /* wwan is bus agnostic class */ + if (!bus_subsys) return; @@ -580,6 +607,12 @@ kernel_device_get_sysfs_path (MMKernelDevice *self) return MM_KERNEL_DEVICE_GENERIC (self)->priv->sysfs_path; } +static const gchar * +kernel_device_get_wwandev_sysfs_path (MMKernelDevice *self) +{ + return MM_KERNEL_DEVICE_GENERIC (self)->priv->wwandev_sysfs_path; +} + static gint kernel_device_get_interface_number (MMKernelDevice *self) { @@ -1200,6 +1233,7 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass) kernel_device_class->get_name = kernel_device_get_name; kernel_device_class->get_driver = kernel_device_get_driver; kernel_device_class->get_sysfs_path = kernel_device_get_sysfs_path; + kernel_device_class->get_wwandev_sysfs_path = kernel_device_get_wwandev_sysfs_path; kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid; kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid; kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid; diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c index e2707c3a..19389f66 100644 --- a/src/kerneldevice/mm-kernel-device-udev.c +++ b/src/kerneldevice/mm-kernel-device-udev.c @@ -348,6 +348,27 @@ kernel_device_get_sysfs_path (MMKernelDevice *_self) } static const gchar * +kernel_device_get_wwandev_sysfs_path (MMKernelDevice *_self) +{ + g_autoptr(GUdevDevice) parent = NULL; + MMKernelDeviceUdev *self; + const gchar *subsys; + + self = MM_KERNEL_DEVICE_UDEV (_self); + parent = g_udev_device_get_parent (self->priv->device); + + if (!parent) + return NULL; + + subsys = g_udev_device_get_subsystem (parent); + + if (!subsys || g_strcmp0 (subsys, "wwan")) + return NULL; + + return g_udev_device_get_sysfs_path (parent); +} + +static const gchar * kernel_device_get_physdev_uid (MMKernelDevice *_self) { MMKernelDeviceUdev *self; @@ -780,6 +801,7 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass) kernel_device_class->get_name = kernel_device_get_name; kernel_device_class->get_driver = kernel_device_get_driver; kernel_device_class->get_sysfs_path = kernel_device_get_sysfs_path; + kernel_device_class->get_wwandev_sysfs_path = kernel_device_get_wwandev_sysfs_path; kernel_device_class->get_physdev_uid = kernel_device_get_physdev_uid; kernel_device_class->get_physdev_vid = kernel_device_get_physdev_vid; kernel_device_class->get_physdev_pid = kernel_device_get_physdev_pid; diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c index d5fb0adf..64380bab 100644 --- a/src/kerneldevice/mm-kernel-device.c +++ b/src/kerneldevice/mm-kernel-device.c @@ -74,6 +74,14 @@ mm_kernel_device_get_sysfs_path (MMKernelDevice *self) } const gchar * +mm_kernel_device_get_wwandev_sysfs_path (MMKernelDevice *self) +{ + return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_wwandev_sysfs_path ? + MM_KERNEL_DEVICE_GET_CLASS (self)->get_wwandev_sysfs_path (self) : + NULL); +} + +const gchar * mm_kernel_device_get_physdev_uid (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 e05bd967..2eed71f1 100644 --- a/src/kerneldevice/mm-kernel-device.h +++ b/src/kerneldevice/mm-kernel-device.h @@ -43,6 +43,8 @@ struct _MMKernelDeviceClass { const gchar * (* get_driver) (MMKernelDevice *self); const gchar * (* get_sysfs_path) (MMKernelDevice *self); + const gchar * (* get_wwandev_sysfs_path) (MMKernelDevice *self); + gint (* get_interface_number) (MMKernelDevice *self); gint (* get_interface_class) (MMKernelDevice *self); gint (* get_interface_subclass) (MMKernelDevice *self); @@ -77,6 +79,8 @@ 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_wwandev_sysfs_path (MMKernelDevice *self); + gint mm_kernel_device_get_interface_number (MMKernelDevice *self); gint mm_kernel_device_get_interface_class (MMKernelDevice *self); gint mm_kernel_device_get_interface_subclass (MMKernelDevice *self); |