aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/dell/mm-plugin-dell.c2
-rw-r--r--plugins/huawei/mm-broadband-modem-huawei.c2
-rw-r--r--plugins/huawei/mm-plugin-huawei.c2
-rw-r--r--plugins/simtech/mm-plugin-simtech.c2
-rw-r--r--plugins/telit/mm-common-telit.c2
-rw-r--r--plugins/zte/mm-plugin-zte.c2
-rw-r--r--src/kerneldevice/mm-kernel-device-generic.c7
-rw-r--r--src/kerneldevice/mm-kernel-device-udev.c160
-rw-r--r--src/kerneldevice/mm-kernel-device.c55
-rw-r--r--src/kerneldevice/mm-kernel-device.h14
-rw-r--r--src/mm-plugin.c4
11 files changed, 213 insertions, 39 deletions
diff --git a/plugins/dell/mm-plugin-dell.c b/plugins/dell/mm-plugin-dell.c
index 5efcb192..f9dfd1a6 100644
--- a/plugins/dell/mm-plugin-dell.c
+++ b/plugins/dell/mm-plugin-dell.c
@@ -342,7 +342,7 @@ dell_custom_init (MMPortProbe *probe,
/* Dell-branded Telit modems always answer to +GMI
* Avoid +CGMI and ATI sending for minimizing port probing time */
- if (mm_kernel_device_get_property_as_boolean (port_device, "ID_MM_TELIT_PORTS_TAGGED")) {
+ if (mm_kernel_device_get_global_property_as_boolean (port_device, "ID_MM_TELIT_PORTS_TAGGED")) {
ctx->cgmi_retries = 0;
ctx->ati_retries = 0;
}
diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c
index 607e14ee..0e375e13 100644
--- a/plugins/huawei/mm-broadband-modem-huawei.c
+++ b/plugins/huawei/mm-broadband-modem-huawei.c
@@ -2367,7 +2367,7 @@ ensure_ndisdup_support_checked (MMBroadbandModemHuawei *self,
/* First, check for devices which support NDISDUP on any AT port. These
* devices are tagged by udev */
- if (mm_kernel_device_get_property_as_boolean (mm_port_peek_kernel_device (port), "ID_MM_HUAWEI_NDISDUP_SUPPORTED")) {
+ if (mm_kernel_device_get_global_property_as_boolean (mm_port_peek_kernel_device (port), "ID_MM_HUAWEI_NDISDUP_SUPPORTED")) {
mm_dbg ("This device (%s) can support ndisdup feature", mm_port_get_device (port));
self->priv->ndisdup_support = FEATURE_SUPPORTED;
}
diff --git a/plugins/huawei/mm-plugin-huawei.c b/plugins/huawei/mm-plugin-huawei.c
index 83667955..deb17510 100644
--- a/plugins/huawei/mm-plugin-huawei.c
+++ b/plugins/huawei/mm-plugin-huawei.c
@@ -292,7 +292,7 @@ huawei_custom_init_step (HuaweiCustomInitContext *ctx)
/* Try to get a port map from the modem */
port = mm_port_probe_peek_port (ctx->probe);
- if (!ctx->getportmode_done && !mm_kernel_device_get_property_as_boolean (port, "ID_MM_HUAWEI_DISABLE_GETPORTMODE")) {
+ if (!ctx->getportmode_done && !mm_kernel_device_get_global_property_as_boolean (port, "ID_MM_HUAWEI_DISABLE_GETPORTMODE")) {
if (ctx->getportmode_retries == 0) {
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
huawei_custom_init_context_complete_and_free (ctx);
diff --git a/plugins/simtech/mm-plugin-simtech.c b/plugins/simtech/mm-plugin-simtech.c
index 54544aa0..b150868f 100644
--- a/plugins/simtech/mm-plugin-simtech.c
+++ b/plugins/simtech/mm-plugin-simtech.c
@@ -98,7 +98,7 @@ grab_port (MMPlugin *self,
* to show up with more than two AT-capable ports.
*/
if (pflags == MM_PORT_SERIAL_AT_FLAG_NONE &&
- mm_kernel_device_get_property_as_boolean (port, "ID_MM_SIMTECH_TAGGED"))
+ mm_kernel_device_get_global_property_as_boolean (port, "ID_MM_SIMTECH_TAGGED"))
ptype = MM_PORT_TYPE_IGNORED;
}
diff --git a/plugins/telit/mm-common-telit.c b/plugins/telit/mm-common-telit.c
index 3f2cce5c..3c913de2 100644
--- a/plugins/telit/mm-common-telit.c
+++ b/plugins/telit/mm-common-telit.c
@@ -330,7 +330,7 @@ telit_custom_init (MMPortProbe *probe,
ctx->getportcfg_retries = 3;
/* If the device is tagged for supporting #PORTCFG do the custom init */
- if (mm_kernel_device_get_property_as_boolean (port_device, "ID_MM_TELIT_PORTS_TAGGED")) {
+ if (mm_kernel_device_get_global_property_as_boolean (port_device, "ID_MM_TELIT_PORTS_TAGGED")) {
telit_custom_init_step (ctx);
return;
}
diff --git a/plugins/zte/mm-plugin-zte.c b/plugins/zte/mm-plugin-zte.c
index 172f275e..3a87c376 100644
--- a/plugins/zte/mm-plugin-zte.c
+++ b/plugins/zte/mm-plugin-zte.c
@@ -141,7 +141,7 @@ grab_port (MMPlugin *self,
}
}
- if (mm_kernel_device_get_property_as_boolean (port, "ID_MM_ZTE_ICERA_DHCP")) {
+ if (mm_kernel_device_get_global_property_as_boolean (port, "ID_MM_ZTE_ICERA_DHCP")) {
mm_dbg ("ZTE: Icera-based modem will use DHCP");
g_object_set (modem,
MM_BROADBAND_MODEM_ICERA_DEFAULT_IP_METHOD, MM_BEARER_IP_METHOD_DHCP,
diff --git a/src/kerneldevice/mm-kernel-device-generic.c b/src/kerneldevice/mm-kernel-device-generic.c
index 0434bd1b..07681398 100644
--- a/src/kerneldevice/mm-kernel-device-generic.c
+++ b/src/kerneldevice/mm-kernel-device-generic.c
@@ -1067,6 +1067,13 @@ mm_kernel_device_generic_class_init (MMKernelDeviceGenericClass *klass)
kernel_device_class->get_property_as_int = kernel_device_get_property_as_int;
kernel_device_class->get_property_as_int_hex = kernel_device_get_property_as_int_hex;
+ /* Device-wide properties are stored per-port in the generic backend */
+ kernel_device_class->has_global_property = kernel_device_has_property;
+ kernel_device_class->get_global_property = kernel_device_get_property;
+ kernel_device_class->get_global_property_as_boolean = kernel_device_get_property_as_boolean;
+ kernel_device_class->get_global_property_as_int = kernel_device_get_property_as_int;
+ kernel_device_class->get_global_property_as_int_hex = kernel_device_get_property_as_int_hex;
+
properties[PROP_PROPERTIES] =
g_param_spec_object ("properties",
"Properties",
diff --git a/src/kerneldevice/mm-kernel-device-udev.c b/src/kerneldevice/mm-kernel-device-udev.c
index 2b2f19cb..e8763f7e 100644
--- a/src/kerneldevice/mm-kernel-device-udev.c
+++ b/src/kerneldevice/mm-kernel-device-udev.c
@@ -352,16 +352,13 @@ kernel_device_get_physdev_uid (MMKernelDevice *_self)
return uid;
}
- ensure_physdev (self);
- if (self->priv->physdev) {
- /* Try to load from properties set on the physical device */
- if ((uid = g_udev_device_get_property (self->priv->physdev, "ID_MM_PHYSDEV_UID")) != NULL)
- return uid;
+ /* Try to load from properties set on the physical device */
+ if ((uid = mm_kernel_device_get_global_property (MM_KERNEL_DEVICE (self), "ID_MM_PHYSDEV_UID")) != NULL)
+ return uid;
- /* Use physical device sysfs path, if any */
- if ((uid = g_udev_device_get_sysfs_path (self->priv->physdev)) != NULL)
- return uid;
- }
+ /* Use physical device sysfs path, if any */
+ if (self->priv->physdev && (uid = g_udev_device_get_sysfs_path (self->priv->physdev)) != NULL)
+ return uid;
/* If there is no physical device sysfs path, use the device sysfs itself */
g_assert (self->priv->device);
@@ -436,9 +433,9 @@ kernel_device_is_candidate (MMKernelDevice *_self,
* the device to a specific ModemManager driver, we need to ensure that all
* rules have been processed before handling a device.
*
- * The udev tag applies to each port in a device. In other words, the flag
+ * This udev tag applies to each port in a device. In other words, the flag
* may be set in some ports, but not in others */
- if (!g_udev_device_get_property_as_boolean (self->priv->device, "ID_MM_CANDIDATE"))
+ if (!mm_kernel_device_get_property_as_boolean (MM_KERNEL_DEVICE (self), "ID_MM_CANDIDATE"))
return FALSE;
/* Load physical device. If there is no physical device, we don't process
@@ -457,16 +454,15 @@ kernel_device_is_candidate (MMKernelDevice *_self,
return FALSE;
}
- /* The blacklist applies to the device as a whole, and therefore the flag
- * will be applied always in the physical device, not in each port. */
- if (g_udev_device_get_property_as_boolean (self->priv->physdev, "ID_MM_DEVICE_IGNORE")) {
+ /* Ignore blacklisted devices. */
+ if (mm_kernel_device_get_global_property_as_boolean (MM_KERNEL_DEVICE (self), "ID_MM_DEVICE_IGNORE")) {
mm_dbg ("(%s/%s): device is blacklisted", subsys, name);
return FALSE;
}
/* Is the device in the manual-only greylist? If so, return if this is an
* automatic scan. */
- if (!manual_scan && g_udev_device_get_property_as_boolean (self->priv->physdev, "ID_MM_DEVICE_MANUAL_SCAN_ONLY")) {
+ if (!manual_scan && mm_kernel_device_get_global_property_as_boolean (MM_KERNEL_DEVICE (self), "ID_MM_DEVICE_MANUAL_SCAN_ONLY")) {
mm_dbg ("(%s/%s): device probed only in manual scan", subsys, name);
return FALSE;
}
@@ -474,7 +470,7 @@ kernel_device_is_candidate (MMKernelDevice *_self,
/* If the physdev is a 'platform' or 'pnp' device that's not whitelisted, ignore it */
physdev_subsys = g_udev_device_get_subsystem (self->priv->physdev);
if ((!g_strcmp0 (physdev_subsys, "platform") || !g_strcmp0 (physdev_subsys, "pnp")) &&
- (!g_udev_device_get_property_as_boolean (self->priv->physdev, "ID_MM_PLATFORM_DRIVER_PROBE"))) {
+ (!mm_kernel_device_get_global_property_as_boolean (MM_KERNEL_DEVICE (self), "ID_MM_PLATFORM_DRIVER_PROBE"))) {
mm_dbg ("(%s/%s): port's parent platform driver is not whitelisted", subsys, name);
return FALSE;
}
@@ -596,6 +592,103 @@ kernel_device_get_property_as_int_hex (MMKernelDevice *_self,
return ((s && mm_get_uint_from_hex_str (s, &out)) ? out : 0);
}
+static gboolean
+kernel_device_has_global_property (MMKernelDevice *_self,
+ const gchar *property)
+{
+ MMKernelDeviceUdev *self;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), FALSE);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+
+ ensure_physdev (self);
+ if (self->priv->physdev && g_udev_device_has_property (self->priv->physdev, property))
+ return TRUE;
+
+ return kernel_device_has_property (_self, property);
+}
+
+static const gchar *
+kernel_device_get_global_property (MMKernelDevice *_self,
+ const gchar *property)
+{
+ MMKernelDeviceUdev *self;
+ const gchar *str;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), NULL);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+
+ ensure_physdev (self);
+ if (self->priv->physdev &&
+ g_udev_device_has_property (self->priv->physdev, property) &&
+ (str = g_udev_device_get_property (self->priv->physdev, property)) != NULL)
+ return str;
+
+ return kernel_device_get_property (_self, property);
+}
+
+static gboolean
+kernel_device_get_global_property_as_boolean (MMKernelDevice *_self,
+ const gchar *property)
+{
+ MMKernelDeviceUdev *self;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), FALSE);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+
+ ensure_physdev (self);
+ if (self->priv->physdev &&
+ g_udev_device_has_property (self->priv->physdev, property) &&
+ g_udev_device_get_property (self->priv->physdev, property))
+ return TRUE;
+
+ return kernel_device_get_property_as_boolean (_self, property);
+}
+
+static gint
+kernel_device_get_global_property_as_int (MMKernelDevice *_self,
+ const gchar *property)
+{
+ MMKernelDeviceUdev *self;
+ gint value;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), -1);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+
+ ensure_physdev (self);
+ if (self->priv->physdev &&
+ g_udev_device_has_property (self->priv->physdev, property) &&
+ (value = g_udev_device_get_property_as_int (self->priv->physdev, property)) >= 0)
+ return value;
+
+ return kernel_device_get_property_as_int (_self, property);
+}
+
+static guint
+kernel_device_get_global_property_as_int_hex (MMKernelDevice *_self,
+ const gchar *property)
+{
+ MMKernelDeviceUdev *self;
+ const gchar *s;
+ guint out = 0;
+
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE_UDEV (_self), G_MAXUINT);
+
+ self = MM_KERNEL_DEVICE_UDEV (_self);
+
+ ensure_physdev (self);
+ if (self->priv->physdev &&
+ g_udev_device_has_property (self->priv->physdev, property) &&
+ (s = g_udev_device_get_property (self->priv->physdev, property)) != NULL)
+ return ((s && mm_get_uint_from_hex_str (s, &out)) ? out : 0);
+
+ return kernel_device_get_property_as_int_hex (_self, property);
+}
+
/*****************************************************************************/
MMKernelDevice *
@@ -770,21 +863,26 @@ mm_kernel_device_udev_class_init (MMKernelDeviceUdevClass *klass)
object_class->get_property = get_property;
object_class->set_property = set_property;
- kernel_device_class->get_subsystem = kernel_device_get_subsystem;
- 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_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;
- kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path;
- kernel_device_class->is_candidate = kernel_device_is_candidate;
- kernel_device_class->cmp = kernel_device_cmp;
- kernel_device_class->has_property = kernel_device_has_property;
- kernel_device_class->get_property = kernel_device_get_property;
- kernel_device_class->get_property_as_boolean = kernel_device_get_property_as_boolean;
- kernel_device_class->get_property_as_int = kernel_device_get_property_as_int;
- kernel_device_class->get_property_as_int_hex = kernel_device_get_property_as_int_hex;
+ kernel_device_class->get_subsystem = kernel_device_get_subsystem;
+ 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_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;
+ kernel_device_class->get_parent_sysfs_path = kernel_device_get_parent_sysfs_path;
+ kernel_device_class->is_candidate = kernel_device_is_candidate;
+ kernel_device_class->cmp = kernel_device_cmp;
+ kernel_device_class->has_property = kernel_device_has_property;
+ kernel_device_class->get_property = kernel_device_get_property;
+ kernel_device_class->get_property_as_boolean = kernel_device_get_property_as_boolean;
+ kernel_device_class->get_property_as_int = kernel_device_get_property_as_int;
+ kernel_device_class->get_property_as_int_hex = kernel_device_get_property_as_int_hex;
+ kernel_device_class->has_global_property = kernel_device_has_global_property;
+ kernel_device_class->get_global_property = kernel_device_get_global_property;
+ kernel_device_class->get_global_property_as_boolean = kernel_device_get_global_property_as_boolean;
+ kernel_device_class->get_global_property_as_int = kernel_device_get_global_property_as_int;
+ kernel_device_class->get_global_property_as_int_hex = kernel_device_get_global_property_as_int_hex;
properties[PROP_UDEV_DEVICE] =
g_param_spec_object ("udev-device",
diff --git a/src/kerneldevice/mm-kernel-device.c b/src/kerneldevice/mm-kernel-device.c
index 4de4e744..e69e9d1d 100644
--- a/src/kerneldevice/mm-kernel-device.c
+++ b/src/kerneldevice/mm-kernel-device.c
@@ -177,6 +177,61 @@ mm_kernel_device_get_property_as_int_hex (MMKernelDevice *self,
0);
}
+gboolean
+mm_kernel_device_has_global_property (MMKernelDevice *self,
+ const gchar *property)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), FALSE);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->has_global_property ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->has_global_property (self, property) :
+ FALSE);
+}
+
+const gchar *
+mm_kernel_device_get_global_property (MMKernelDevice *self,
+ const gchar *property)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), NULL);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property (self, property) :
+ NULL);
+}
+
+gboolean
+mm_kernel_device_get_global_property_as_boolean (MMKernelDevice *self,
+ const gchar *property)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), FALSE);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_boolean ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_boolean (self, property) :
+ FALSE);
+}
+
+gint
+mm_kernel_device_get_global_property_as_int (MMKernelDevice *self,
+ const gchar *property)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), -1);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_int ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_int (self, property) :
+ -1);
+}
+
+guint
+mm_kernel_device_get_global_property_as_int_hex (MMKernelDevice *self,
+ const gchar *property)
+{
+ g_return_val_if_fail (MM_IS_KERNEL_DEVICE (self), 0);
+
+ return (MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_int_hex ?
+ MM_KERNEL_DEVICE_GET_CLASS (self)->get_global_property_as_int_hex (self, property) :
+ 0);
+}
+
/*****************************************************************************/
static void
diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h
index 5c1f6db0..efb64ae7 100644
--- a/src/kerneldevice/mm-kernel-device.h
+++ b/src/kerneldevice/mm-kernel-device.h
@@ -62,6 +62,12 @@ struct _MMKernelDeviceClass {
gboolean (* get_property_as_boolean) (MMKernelDevice *self, const gchar *property);
gint (* get_property_as_int) (MMKernelDevice *self, const gchar *property);
guint (* get_property_as_int_hex) (MMKernelDevice *self, const gchar *property);
+
+ gboolean (* has_global_property) (MMKernelDevice *self, const gchar *property);
+ const gchar * (* get_global_property) (MMKernelDevice *self, const gchar *property);
+ gboolean (* get_global_property_as_boolean) (MMKernelDevice *self, const gchar *property);
+ gint (* get_global_property_as_int) (MMKernelDevice *self, const gchar *property);
+ guint (* get_global_property_as_int_hex) (MMKernelDevice *self, const gchar *property);
};
GType mm_kernel_device_get_type (void);
@@ -82,10 +88,18 @@ guint16 mm_kernel_device_get_physdev_pid (MMKernelDevice *self);
gboolean mm_kernel_device_cmp (MMKernelDevice *a, MMKernelDevice *b);
+/* Standard properties are usually associated to single ports */
gboolean mm_kernel_device_has_property (MMKernelDevice *self, const gchar *property);
const gchar *mm_kernel_device_get_property (MMKernelDevice *self, const gchar *property);
gboolean mm_kernel_device_get_property_as_boolean (MMKernelDevice *self, const gchar *property);
gint mm_kernel_device_get_property_as_int (MMKernelDevice *self, const gchar *property);
guint mm_kernel_device_get_property_as_int_hex (MMKernelDevice *self, const gchar *property);
+/* Global properties are usually associated to full devices */
+gboolean mm_kernel_device_has_global_property (MMKernelDevice *self, const gchar *property);
+const gchar *mm_kernel_device_get_global_property (MMKernelDevice *self, const gchar *property);
+gboolean mm_kernel_device_get_global_property_as_boolean (MMKernelDevice *self, const gchar *property);
+gint mm_kernel_device_get_global_property_as_int (MMKernelDevice *self, const gchar *property);
+guint mm_kernel_device_get_global_property_as_int_hex (MMKernelDevice *self, const gchar *property);
+
#endif /* MM_KERNEL_DEVICE_H */
diff --git a/src/mm-plugin.c b/src/mm-plugin.c
index 6fce8898..af4bc739 100644
--- a/src/mm-plugin.c
+++ b/src/mm-plugin.c
@@ -417,8 +417,8 @@ apply_pre_probing_filters (MMPlugin *self,
* supported. If that is the case, filter by udev tag */
if (self->priv->udev_tags) {
for (i = 0; self->priv->udev_tags[i]; i++) {
- /* Check if the port was tagged */
- if (mm_kernel_device_get_property_as_boolean (port, self->priv->udev_tags[i]))
+ /* Check if the port or device was tagged */
+ if (mm_kernel_device_get_global_property_as_boolean (port, self->priv->udev_tags[i]))
break;
}