[PATCH 1/2] base-modem: improve broken modem detection logic
Aleksander Morgado
aleksander at aleksander.es
Mon Apr 30 11:11:38 UTC 2018
If the serial port timeout detection logic is enabled, warn whenever
more than one consecutive command timeout happens, not just when the
limit is reached.
---
src/mm-base-modem.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 458ec74a..12e96dc0 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -110,21 +110,26 @@ get_hash_key (const gchar *subsys,
static void
serial_port_timed_out_cb (MMPortSerial *port,
guint n_consecutive_timeouts,
- gpointer user_data)
+ MMBaseModem *self)
{
- MMBaseModem *self = (MM_BASE_MODEM (user_data));
-
- if (self->priv->max_timeouts > 0 &&
- n_consecutive_timeouts >= self->priv->max_timeouts) {
- mm_warn ("(%s/%s) port timed out %u times, marking modem '%s' as disabled",
- mm_port_type_get_string (mm_port_get_port_type (MM_PORT (port))),
+ /* If reached the maximum number of timeouts, invalidate modem */
+ if (n_consecutive_timeouts >= self->priv->max_timeouts) {
+ mm_err ("(%s/%s) %s port timed out %u consecutive times, marking modem '%s' as invalid",
+ mm_port_subsys_get_string (mm_port_get_subsys (MM_PORT (port))),
mm_port_get_device (MM_PORT (port)),
+ mm_port_type_get_string (mm_port_get_port_type (MM_PORT (port))),
n_consecutive_timeouts,
g_dbus_object_get_object_path (G_DBUS_OBJECT (self)));
-
- /* Only set action to invalidate modem if not already done */
g_cancellable_cancel (self->priv->cancellable);
+ return;
}
+
+ if (n_consecutive_timeouts > 1)
+ mm_warn ("(%s/%s) %s port timed out %u consecutive times",
+ mm_port_subsys_get_string (mm_port_get_subsys (MM_PORT (port))),
+ mm_port_get_device (MM_PORT (port)),
+ mm_port_type_get_string (mm_port_get_port_type (MM_PORT (port))),
+ n_consecutive_timeouts);
}
gboolean
@@ -214,11 +219,12 @@ mm_base_modem_grab_port (MMBaseModem *self,
return FALSE;
}
- /* For serial ports, enable port timeout checks */
- g_signal_connect (port,
- "timed-out",
- G_CALLBACK (serial_port_timed_out_cb),
- self);
+ /* For serial ports, enable port timeout checks if requested to do so */
+ if (self->priv->max_timeouts > 0)
+ g_signal_connect (port,
+ "timed-out",
+ G_CALLBACK (serial_port_timed_out_cb),
+ self);
/* For serial ports, optionally use a specific baudrate */
if (mm_kernel_device_has_property (kernel_device, "ID_MM_TTY_BAUDRATE"))
--
2.17.0
More information about the ModemManager-devel
mailing list