summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2023-03-28 08:01:33 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2023-04-13 11:49:19 +0000
commit131e783a5f33f7a710f68203546bd0946a2504f8 (patch)
treee0e506c10ea760b113d5fd9f7b71a3a0be24e0bc
parent585d2af713ffe4d68bfba904fa30993390f17627 (diff)
downloadModemManager-131e783a5f33f7a710f68203546bd0946a2504f8.tar.gz
port-probe: improve logging of detected port type hints in udev tags
Explicitly log when a tag is found, and also warn if too many por type hints are provided in the same port.
-rw-r--r--src/mm-port-probe.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c
index 56a397824..1c338b9e4 100644
--- a/src/mm-port-probe.c
+++ b/src/mm-port-probe.c
@@ -1845,6 +1845,44 @@ mm_port_probe_get_port_subsys (MMPortProbe *self)
return mm_kernel_device_get_subsystem (self->priv->port);
}
+static void
+initialize_port_type_hints (MMPortProbe *self)
+{
+ g_autoptr(GString) udev_tags = NULL;
+ guint n_udev_hints = 0;
+
+#define ADD_HINT_FROM_UDEV_TAG(TAG, FIELD) do { \
+ if (!self->priv->FIELD && \
+ mm_kernel_device_get_property_as_boolean (self->priv->port, TAG)) { \
+ mm_obj_dbg (self, "udev tag detected: %s", TAG); \
+ self->priv->FIELD = TRUE; \
+ n_udev_hints++; \
+ if (!udev_tags) \
+ udev_tags = g_string_new (TAG); \
+ else \
+ g_string_append_printf (udev_tags, ", %s", TAG); \
+ } \
+ } while (0)
+
+ /* Process udev-configured port type hints */
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_GPS, is_gps);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_AUDIO, is_audio);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_AT_PRIMARY, maybe_at);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_AT_SECONDARY, maybe_at);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_AT_PPP, maybe_at);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_QCDM, maybe_qcdm);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_QMI, maybe_qmi);
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_TYPE_MBIM, maybe_mbim);
+
+ /* Warn if more than one given at the same time */
+ if (n_udev_hints > 1)
+ mm_obj_warn (self, "multiple incompatible port type hints configured via udev: %s", udev_tags->str);
+
+ ADD_HINT_FROM_UDEV_TAG (ID_MM_PORT_IGNORE, is_ignored);
+
+#undef ADD_HINT_FROM_UDEV_TAG
+}
+
/*****************************************************************************/
static gchar *
@@ -1892,15 +1930,7 @@ set_property (GObject *object,
case PROP_PORT:
/* construct only */
self->priv->port = g_value_dup_object (value);
- self->priv->is_ignored = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_IGNORE);
- self->priv->is_gps = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_GPS);
- self->priv->is_audio = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AUDIO);
- self->priv->maybe_at = (mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_PRIMARY) ||
- mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_SECONDARY) ||
- mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_AT_PPP));
- self->priv->maybe_qcdm = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_QCDM);
- self->priv->maybe_qmi = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_QMI);
- self->priv->maybe_mbim = mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_TYPE_MBIM);
+ initialize_port_type_hints (self);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);