summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2023-03-28 09:05:06 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2023-04-13 11:53:54 +0000
commitcb2dea5dc4d5617a1736f63c3986551825f1a385 (patch)
treeec19a5c862b740fe7e71d4f089d99c0dd35ddf8c
parente77df40b68ce32980f307959cc98d31918690a81 (diff)
downloadModemManager-cb2dea5dc4d5617a1736f63c3986551825f1a385.tar.gz
port-probe: perform auto detection of port type hints for wwan
We can remove the port type hint udev tags for the wwan subsystem, as that logic is now incorporated in the port type hint processing logic in the daemon itself. This makes it clearer to know what exact hints are being used, as the logic is in a single place and it has proper logging of all possible cases.
-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 905dcee38..04ff3c46a 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 67a1aca3b..7e8966528 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;
}
}