[PATCH 1/2] base-modem: improve broken modem detection logic

Aleksander Morgado aleksander at aleksander.es
Mon Apr 30 16:24:35 UTC 2018


On Mon, Apr 30, 2018 at 1:11 PM, Aleksander Morgado
<aleksander at aleksander.es> wrote:
> 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.
> ---

This one pushed to git master already, for 1.8.

>  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
>



-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list