diff options
-rw-r--r-- | src/80-mm-candidate.rules | 13 | ||||
-rw-r--r-- | src/mm-port-probe.c | 53 |
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; } } |