aboutsummaryrefslogtreecommitdiff
path: root/src/mm-device.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-08-24 13:28:22 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-08-24 13:34:51 +0200
commit0436b3e45753a166fea18d6c1463aef5a38fd1ee (patch)
tree5317581a8f5e85be45ba9cec8cd03be90c717fb8 /src/mm-device.c
parenta595912d2d70fce7a8370b194c230331fee605a7 (diff)
api,introspection: report list of drivers, not just one
Different ports of the same modem may get handled by different drivers. We therefore need to provide a list of drivers (new `Modem.Drivers' property with signature 'as') instead of just one (removed `Modem.Driver' property with signature 's'). $ sudo mmcli -m 0 | grep drivers | drivers: 'qcserial, qmi_wwan'
Diffstat (limited to 'src/mm-device.c')
-rw-r--r--src/mm-device.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/src/mm-device.c b/src/mm-device.c
index 1733f943..6af43dae 100644
--- a/src/mm-device.c
+++ b/src/mm-device.c
@@ -53,8 +53,8 @@ struct _MMDevicePrivate {
guint16 vendor;
guint16 product;
- /* Kernel driver managing this device */
- gchar *driver;
+ /* Kernel drivers managing this device */
+ gchar **drivers;
/* Best plugin to manage this device */
MMPlugin *plugin;
@@ -217,6 +217,37 @@ get_driver_name (GUdevDevice *device)
return ret;
}
+static void
+add_port_driver (MMDevice *self,
+ GUdevDevice *udev_port)
+{
+ gchar *driver = NULL;
+ guint n_items;
+ guint i;
+
+ driver = get_driver_name (udev_port);
+
+ n_items = (self->priv->drivers ? g_strv_length (self->priv->drivers) : 0);
+ if (n_items > 0) {
+ /* Add driver to our list of drivers, if not already there */
+ for (i = 0; self->priv->drivers[i]; i++) {
+ if (g_str_equal (self->priv->drivers[i], driver)) {
+ g_free (driver);
+ driver = NULL;
+ break;
+ }
+ }
+ }
+
+ if (!driver)
+ return;
+
+ self->priv->drivers = g_realloc (self->priv->drivers,
+ (n_items + 2) * sizeof (gchar *));
+ self->priv->drivers[n_items] = driver;
+ self->priv->drivers[n_items + 1] = NULL;
+}
+
void
mm_device_grab_port (MMDevice *self,
GUdevDevice *udev_port)
@@ -226,10 +257,8 @@ mm_device_grab_port (MMDevice *self,
if (mm_device_owns_port (self, udev_port))
return;
- /* Get the driver name and vendor/product IDs out of the first port
- * grabbed */
+ /* Get the vendor/product IDs out of the first port grabbed */
if (!self->priv->port_probes) {
- self->priv->driver = get_driver_name (udev_port);
if (!get_device_ids (udev_port,
&self->priv->vendor,
&self->priv->product)) {
@@ -238,6 +267,9 @@ mm_device_grab_port (MMDevice *self,
}
}
+ /* Add new port driver */
+ add_port_driver (self, udev_port);
+
/* Create and store new port probe */
probe = mm_port_probe_new (self, udev_port);
self->priv->port_probes = g_list_prepend (self->priv->port_probes, probe);
@@ -438,10 +470,10 @@ mm_device_get_path (MMDevice *self)
return self->priv->udev_device_path;
}
-const gchar *
-mm_device_get_driver (MMDevice *self)
+const gchar **
+mm_device_get_drivers (MMDevice *self)
{
- return self->priv->driver;
+ return (const gchar **)self->priv->drivers;
}
guint16
@@ -636,7 +668,7 @@ finalize (GObject *object)
MMDevice *self = MM_DEVICE (object);
g_free (self->priv->udev_device_path);
- g_free (self->priv->driver);
+ g_strfreev (self->priv->drivers);
G_OBJECT_CLASS (mm_device_parent_class)->finalize (object);
}