aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/80-mm-candidate.rules13
-rw-r--r--src/mm-port-probe.c53
2 files changed, 52 insertions, 14 deletions
diff --git a/src/80-mm-candidate.rules b/src/80-mm-candidate.rules
index 905dcee3..04ff3c46 100644
--- a/src/80-mm-candidate.rules
+++ b/src/80-mm-candidate.rules
@@ -21,21 +21,8 @@ KERNEL=="cdc-wdm*", SUBSYSTEM=="usbmisc", ENV{ID_MM_CANDIDATE}="1"
# - All USB devices ignored for now, only PCI devices expected
# - Only "wwan_port" device types processed (single ports); we fully ignore
# the "wwan_dev" device type (full device, not just one port)
-# - FIREHOSE ports are used for firmware updates and not managed by ModemManager
SUBSYSTEMS=="usb", GOTO="mm_candidate_end"
SUBSYSTEM=="wwan", ENV{DEVTYPE}=="wwan_dev", GOTO="mm_candidate_end"
SUBSYSTEM=="wwan", ENV{ID_MM_CANDIDATE}="1"
-SUBSYSTEM=="wwan", ATTR{type}=="AT", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
-SUBSYSTEM=="wwan", ATTR{type}=="MBIM", ENV{ID_MM_PORT_TYPE_MBIM}="1"
-SUBSYSTEM=="wwan", ATTR{type}=="QMI", ENV{ID_MM_PORT_TYPE_QMI}="1"
-SUBSYSTEM=="wwan", ATTR{type}=="QCDM", ENV{ID_MM_PORT_TYPE_QCDM}="1"
-SUBSYSTEM=="wwan", ATTR{type}=="FIREHOSE", ENV{ID_MM_PORT_IGNORE}="1"
-
-# Linux 5.13 does not have "type" attribute yet, match kernel name instead
-SUBSYSTEM=="wwan", KERNEL=="*MBIM", ENV{ID_MM_PORT_TYPE_MBIM}="1"
-SUBSYSTEM=="wwan", KERNEL=="*QMI", ENV{ID_MM_PORT_TYPE_QMI}="1"
-SUBSYSTEM=="wwan", KERNEL=="*AT", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
-SUBSYSTEM=="wwan", KERNEL=="*QCDM", ENV{ID_MM_PORT_TYPE_QCDM}="1"
-SUBSYSTEM=="wwan", KERNEL=="*FIREHOSE", ENV{ID_MM_PORT_IGNORE}="1"
LABEL="mm_candidate_end"
diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c
index 67a1aca3..7e896652 100644
--- a/src/mm-port-probe.c
+++ b/src/mm-port-probe.c
@@ -1853,6 +1853,8 @@ initialize_port_type_hints (MMPortProbe *self)
gboolean auto_maybe_qmi = FALSE;
gboolean auto_maybe_mbim = FALSE;
gboolean auto_maybe_at = FALSE;
+ gboolean auto_maybe_qcdm = FALSE;
+ gboolean auto_ignored = FALSE;
#define ADD_HINT_FROM_UDEV_TAG(TAG, FIELD) do { \
if (!self->priv->FIELD && \
@@ -1897,9 +1899,54 @@ initialize_port_type_hints (MMPortProbe *self)
mm_obj_dbg (self, "port may be AT based on the driver in use: %s", driver);
auto_maybe_at = TRUE;
}
+ } else if (!g_strcmp0 (mm_kernel_device_get_subsystem (self->priv->port), "wwan")) {
+ /* Linux >= 5.14 has at 'type' attribute specifying the type of port */
+ if (mm_kernel_device_has_attribute (self->priv->port, "type")) {
+ const gchar *type;
+
+ type = mm_kernel_device_get_attribute (self->priv->port, "type");
+ if (!g_strcmp0 (type, "AT")) {
+ mm_obj_dbg (self, "port may be AT based on the wwan type attribute");
+ auto_maybe_at = TRUE;
+ } else if (!g_strcmp0 (type, "MBIM")) {
+ mm_obj_dbg (self, "port may be MBIM based on the wwan type attribute");
+ auto_maybe_mbim = TRUE;
+ } else if (!g_strcmp0 (type, "QMI")) {
+ mm_obj_dbg (self, "port may be QMI based on the wwan type attribute");
+ auto_maybe_qmi = TRUE;
+ } else if (!g_strcmp0 (type, "QCDM")) {
+ mm_obj_dbg (self, "port may be QCDM based on the wwan type attribute");
+ auto_maybe_qcdm = TRUE;
+ } else if (!g_strcmp0 (type, "FIREHOSE")) {
+ mm_obj_dbg (self, "port may be FIREHOSE based on the wwan type attribute");
+ auto_ignored = TRUE;
+ }
+ }
+ /* Linux 5.13 does not have 'type' attribute yet, match kernel name instead */
+ else {
+ const gchar *name;
+
+ name = mm_kernel_device_get_name (self->priv->port);
+ if (g_str_has_suffix (name, "AT")) {
+ mm_obj_dbg (self, "port may be AT based on the wwan device name");
+ auto_maybe_at = TRUE;
+ } else if (g_str_has_suffix (name, "MBIM")) {
+ mm_obj_dbg (self, "port may be MBIM based on the wwan device name");
+ auto_maybe_mbim = TRUE;
+ } else if (g_str_has_suffix (name, "QMI")) {
+ mm_obj_dbg (self, "port may be QMI based on the wwan device name");
+ auto_maybe_qmi = TRUE;
+ } else if (g_str_has_suffix (name, "QCDM")) {
+ mm_obj_dbg (self, "port may be QCDM based on the wwan device name");
+ auto_maybe_qcdm = TRUE;
+ } else if (g_str_has_suffix (name, "FIREHOSE")) {
+ mm_obj_dbg (self, "port may be FIREHOSE based on the wwan device name");
+ auto_ignored = TRUE;
+ }
+ }
}
- g_assert ((auto_maybe_qmi + auto_maybe_mbim + auto_maybe_at) <= 1);
+ g_assert ((auto_maybe_qmi + auto_maybe_mbim + auto_maybe_at + auto_maybe_qcdm + auto_ignored) <= 1);
#define PROCESS_AUTO_HINTS(TYPE, FIELD) do { \
if (auto_##FIELD) { \
@@ -1913,6 +1960,7 @@ initialize_port_type_hints (MMPortProbe *self)
PROCESS_AUTO_HINTS ("QMI", maybe_qmi);
PROCESS_AUTO_HINTS ("MBIM", maybe_mbim);
PROCESS_AUTO_HINTS ("AT", maybe_at);
+ PROCESS_AUTO_HINTS ("QCDM", maybe_qcdm);
#undef PROCESS_AUTO_HINTS
@@ -1928,6 +1976,9 @@ initialize_port_type_hints (MMPortProbe *self)
if (mm_kernel_device_get_property_as_boolean (self->priv->port, ID_MM_PORT_IGNORE)) {
mm_obj_dbg (self, "port is ignored via udev tag");
self->priv->is_ignored = TRUE;
+ } else if (auto_ignored) {
+ mm_obj_dbg (self, "port is ignored via automatic rules");
+ self->priv->is_ignored = TRUE;
}
}