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'
This commit is contained in:
@@ -39,7 +39,7 @@ enum {
|
||||
PROP_VALID,
|
||||
PROP_MAX_TIMEOUTS,
|
||||
PROP_DEVICE,
|
||||
PROP_DRIVER,
|
||||
PROP_DRIVERS,
|
||||
PROP_PLUGIN,
|
||||
PROP_VENDOR_ID,
|
||||
PROP_PRODUCT_ID,
|
||||
@@ -59,7 +59,7 @@ struct _MMBaseModemPrivate {
|
||||
gulong invalid_if_cancelled;
|
||||
|
||||
gchar *device;
|
||||
gchar *driver;
|
||||
gchar **drivers;
|
||||
gchar *plugin;
|
||||
|
||||
guint vendor_id;
|
||||
@@ -809,12 +809,12 @@ mm_base_modem_get_device (MMBaseModem *self)
|
||||
return self->priv->device;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
mm_base_modem_get_driver (MMBaseModem *self)
|
||||
const gchar **
|
||||
mm_base_modem_get_drivers (MMBaseModem *self)
|
||||
{
|
||||
g_return_val_if_fail (MM_IS_BASE_MODEM (self), NULL);
|
||||
|
||||
return self->priv->driver;
|
||||
return (const gchar **)self->priv->drivers;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
@@ -909,9 +909,9 @@ set_property (GObject *object,
|
||||
g_free (self->priv->device);
|
||||
self->priv->device = g_value_dup_string (value);
|
||||
break;
|
||||
case PROP_DRIVER:
|
||||
g_free (self->priv->driver);
|
||||
self->priv->driver = g_value_dup_string (value);
|
||||
case PROP_DRIVERS:
|
||||
g_strfreev (self->priv->drivers);
|
||||
self->priv->drivers = g_value_dup_boxed (value);
|
||||
break;
|
||||
case PROP_PLUGIN:
|
||||
g_free (self->priv->plugin);
|
||||
@@ -951,8 +951,8 @@ get_property (GObject *object,
|
||||
case PROP_DEVICE:
|
||||
g_value_set_string (value, self->priv->device);
|
||||
break;
|
||||
case PROP_DRIVER:
|
||||
g_value_set_string (value, self->priv->driver);
|
||||
case PROP_DRIVERS:
|
||||
g_value_set_boxed (value, self->priv->drivers);
|
||||
break;
|
||||
case PROP_PLUGIN:
|
||||
g_value_set_string (value, self->priv->plugin);
|
||||
@@ -986,7 +986,7 @@ finalize (GObject *object)
|
||||
self->priv->device);
|
||||
|
||||
g_free (self->priv->device);
|
||||
g_free (self->priv->driver);
|
||||
g_strfreev (self->priv->drivers);
|
||||
g_free (self->priv->plugin);
|
||||
|
||||
G_OBJECT_CLASS (mm_base_modem_parent_class)->finalize (object);
|
||||
@@ -1065,13 +1065,13 @@ mm_base_modem_class_init (MMBaseModemClass *klass)
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_property (object_class, PROP_DEVICE, properties[PROP_DEVICE]);
|
||||
|
||||
properties[PROP_DRIVER] =
|
||||
g_param_spec_string (MM_BASE_MODEM_DRIVER,
|
||||
"Driver",
|
||||
"Kernel driver",
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_property (object_class, PROP_DRIVER, properties[PROP_DRIVER]);
|
||||
properties[PROP_DRIVERS] =
|
||||
g_param_spec_boxed (MM_BASE_MODEM_DRIVERS,
|
||||
"Drivers",
|
||||
"Kernel drivers",
|
||||
G_TYPE_STRV,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_property (object_class, PROP_DRIVERS, properties[PROP_DRIVERS]);
|
||||
|
||||
properties[PROP_PLUGIN] =
|
||||
g_param_spec_string (MM_BASE_MODEM_PLUGIN,
|
||||
|
@@ -44,7 +44,7 @@ typedef struct _MMBaseModemPrivate MMBaseModemPrivate;
|
||||
#define MM_BASE_MODEM_MAX_TIMEOUTS "base-modem-max-timeouts"
|
||||
#define MM_BASE_MODEM_VALID "base-modem-valid"
|
||||
#define MM_BASE_MODEM_DEVICE "base-modem-device"
|
||||
#define MM_BASE_MODEM_DRIVER "base-modem-driver"
|
||||
#define MM_BASE_MODEM_DRIVERS "base-modem-drivers"
|
||||
#define MM_BASE_MODEM_PLUGIN "base-modem-plugin"
|
||||
#define MM_BASE_MODEM_VENDOR_ID "base-modem-vendor-id"
|
||||
#define MM_BASE_MODEM_PRODUCT_ID "base-modem-product-id"
|
||||
@@ -131,9 +131,9 @@ void mm_base_modem_set_valid (MMBaseModem *self,
|
||||
gboolean valid);
|
||||
gboolean mm_base_modem_get_valid (MMBaseModem *self);
|
||||
|
||||
const gchar *mm_base_modem_get_device (MMBaseModem *self);
|
||||
const gchar *mm_base_modem_get_driver (MMBaseModem *self);
|
||||
const gchar *mm_base_modem_get_plugin (MMBaseModem *self);
|
||||
const gchar *mm_base_modem_get_device (MMBaseModem *self);
|
||||
const gchar **mm_base_modem_get_drivers (MMBaseModem *self);
|
||||
const gchar *mm_base_modem_get_plugin (MMBaseModem *self);
|
||||
|
||||
guint mm_base_modem_get_vendor_id (MMBaseModem *self);
|
||||
guint mm_base_modem_get_product_id (MMBaseModem *self);
|
||||
|
@@ -7631,14 +7631,14 @@ mm_broadband_modem_take_and_convert_to_current_charset (MMBroadbandModem *self,
|
||||
|
||||
MMBroadbandModem *
|
||||
mm_broadband_modem_new (const gchar *device,
|
||||
const gchar *driver,
|
||||
const gchar **drivers,
|
||||
const gchar *plugin,
|
||||
guint16 vendor_id,
|
||||
guint16 product_id)
|
||||
{
|
||||
return g_object_new (MM_TYPE_BROADBAND_MODEM,
|
||||
MM_BASE_MODEM_DEVICE, device,
|
||||
MM_BASE_MODEM_DRIVER, driver,
|
||||
MM_BASE_MODEM_DRIVERS, drivers,
|
||||
MM_BASE_MODEM_PLUGIN, plugin,
|
||||
MM_BASE_MODEM_VENDOR_ID, vendor_id,
|
||||
MM_BASE_MODEM_PRODUCT_ID, product_id,
|
||||
|
@@ -75,7 +75,7 @@ struct _MMBroadbandModemClass {
|
||||
GType mm_broadband_modem_get_type (void);
|
||||
|
||||
MMBroadbandModem *mm_broadband_modem_new (const gchar *device,
|
||||
const gchar *driver,
|
||||
const gchar **drivers,
|
||||
const gchar *plugin,
|
||||
guint16 vendor_id,
|
||||
guint16 product_id);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -74,18 +74,18 @@ gboolean mm_device_create_modem (MMDevice *self,
|
||||
GError **error);
|
||||
void mm_device_remove_modem (MMDevice *self);
|
||||
|
||||
const gchar *mm_device_get_path (MMDevice *self);
|
||||
const gchar *mm_device_get_driver (MMDevice *self);
|
||||
guint16 mm_device_get_vendor (MMDevice *self);
|
||||
guint16 mm_device_get_product (MMDevice *self);
|
||||
GUdevDevice *mm_device_peek_udev_device (MMDevice *self);
|
||||
GUdevDevice *mm_device_get_udev_device (MMDevice *self);
|
||||
void mm_device_set_plugin (MMDevice *self,
|
||||
GObject *plugin);
|
||||
GObject *mm_device_peek_plugin (MMDevice *self);
|
||||
GObject *mm_device_get_plugin (MMDevice *self);
|
||||
MMBaseModem *mm_device_peek_modem (MMDevice *self);
|
||||
MMBaseModem *mm_device_get_modem (MMDevice *self);
|
||||
const gchar *mm_device_get_path (MMDevice *self);
|
||||
const gchar **mm_device_get_drivers (MMDevice *self);
|
||||
guint16 mm_device_get_vendor (MMDevice *self);
|
||||
guint16 mm_device_get_product (MMDevice *self);
|
||||
GUdevDevice *mm_device_peek_udev_device (MMDevice *self);
|
||||
GUdevDevice *mm_device_get_udev_device (MMDevice *self);
|
||||
void mm_device_set_plugin (MMDevice *self,
|
||||
GObject *plugin);
|
||||
GObject *mm_device_peek_plugin (MMDevice *self);
|
||||
GObject *mm_device_get_plugin (MMDevice *self);
|
||||
MMBaseModem *mm_device_peek_modem (MMDevice *self);
|
||||
MMBaseModem *mm_device_get_modem (MMDevice *self);
|
||||
|
||||
GObject *mm_device_peek_port_probe (MMDevice *self,
|
||||
GUdevDevice *udev_port);
|
||||
|
@@ -3185,14 +3185,14 @@ interface_initialization_step (InitializationContext *ctx)
|
||||
g_free (device);
|
||||
}
|
||||
/* Load driver if not done before */
|
||||
if (!mm_gdbus_modem_get_driver (ctx->skeleton)) {
|
||||
gchar *driver;
|
||||
if (!mm_gdbus_modem_get_drivers (ctx->skeleton)) {
|
||||
gchar **drivers;
|
||||
|
||||
g_object_get (ctx->self,
|
||||
MM_BASE_MODEM_DRIVER, &driver,
|
||||
MM_BASE_MODEM_DRIVERS, &drivers,
|
||||
NULL);
|
||||
mm_gdbus_modem_set_driver (ctx->skeleton, driver);
|
||||
g_free (driver);
|
||||
mm_gdbus_modem_set_drivers (ctx->skeleton, (const gchar * const *)drivers);
|
||||
g_strfreev (drivers);
|
||||
}
|
||||
/* Load plugin if not done before */
|
||||
if (!mm_gdbus_modem_get_plugin (ctx->skeleton)) {
|
||||
@@ -3563,7 +3563,7 @@ mm_iface_modem_initialize (MMIfaceModem *self,
|
||||
mm_gdbus_modem_set_own_numbers (skeleton, NULL);
|
||||
mm_gdbus_modem_set_device_identifier (skeleton, NULL);
|
||||
mm_gdbus_modem_set_device (skeleton, NULL);
|
||||
mm_gdbus_modem_set_driver (skeleton, NULL);
|
||||
mm_gdbus_modem_set_drivers (skeleton, NULL);
|
||||
mm_gdbus_modem_set_plugin (skeleton, NULL);
|
||||
mm_gdbus_modem_set_equipment_identifier (skeleton, NULL);
|
||||
mm_gdbus_modem_set_unlock_required (skeleton, MM_MODEM_LOCK_UNKNOWN);
|
||||
|
@@ -199,34 +199,45 @@ apply_pre_probing_filters (MMPlugin *self,
|
||||
* drivers are not supported. If that is the case, filter by driver */
|
||||
if (self->priv->drivers ||
|
||||
self->priv->forbidden_drivers) {
|
||||
const gchar *driver;
|
||||
static const gchar *virtual_drivers [] = { "virtual", NULL };
|
||||
const gchar **drivers;
|
||||
|
||||
/* Detect any modems accessible through the list of virtual ports */
|
||||
driver = (is_virtual_port (g_udev_device_get_name (port)) ?
|
||||
"virtual" :
|
||||
mm_device_get_driver (device));
|
||||
drivers = (is_virtual_port (g_udev_device_get_name (port)) ?
|
||||
virtual_drivers :
|
||||
mm_device_get_drivers (device));
|
||||
|
||||
/* If error retrieving driver: unsupported */
|
||||
if (!driver)
|
||||
if (!drivers)
|
||||
return TRUE;
|
||||
|
||||
/* Filtering by allowed drivers */
|
||||
if (self->priv->drivers) {
|
||||
for (i = 0; self->priv->drivers[i]; i++) {
|
||||
if (g_str_equal (driver, self->priv->drivers[i]))
|
||||
break;
|
||||
gboolean found = FALSE;
|
||||
|
||||
for (i = 0; self->priv->drivers[i] && !found; i++) {
|
||||
guint j;
|
||||
|
||||
for (j = 0; drivers[j] && !found; j++) {
|
||||
if (g_str_equal (drivers[j], self->priv->drivers[i]))
|
||||
found = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we didn't match any driver: unsupported */
|
||||
if (!self->priv->drivers[i])
|
||||
if (!found)
|
||||
return TRUE;
|
||||
}
|
||||
/* Filtering by forbidden drivers */
|
||||
else {
|
||||
for (i = 0; self->priv->forbidden_drivers[i]; i++) {
|
||||
/* If we match a forbidden driver: unsupported */
|
||||
if (g_str_equal (driver, self->priv->forbidden_drivers[i]))
|
||||
return TRUE;
|
||||
guint j;
|
||||
|
||||
for (j = 0; drivers[j]; j++) {
|
||||
/* If we match a forbidden driver: unsupported */
|
||||
if (g_str_equal (drivers[j], self->priv->forbidden_drivers[i]))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -662,7 +673,7 @@ mm_plugin_create_modem (MMPlugin *self,
|
||||
/* Let the plugin create the modem from the port probe results */
|
||||
modem = MM_PLUGIN_GET_CLASS (self)->create_modem (MM_PLUGIN (self),
|
||||
mm_device_get_path (device),
|
||||
mm_device_get_driver (device),
|
||||
mm_device_get_drivers (device),
|
||||
mm_device_get_vendor (device),
|
||||
mm_device_get_product (device),
|
||||
port_probes,
|
||||
|
@@ -84,7 +84,7 @@ struct _MMPluginClass {
|
||||
* a list of port probes (Mandatory) */
|
||||
MMBaseModem *(*create_modem) (MMPlugin *plugin,
|
||||
const gchar *sysfs_path,
|
||||
const gchar *driver,
|
||||
const gchar **drivers,
|
||||
guint16 vendor,
|
||||
guint16 product,
|
||||
GList *probes,
|
||||
|
Reference in New Issue
Block a user