aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c34
-rw-r--r--src/kerneldevice/mm-kernel-device-udev.c22
-rw-r--r--src/kerneldevice/mm-kernel-device.c8
-rw-r--r--src/kerneldevice/mm-kernel-device.h4
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);