[PATCH 2/2] telit: rework QSS unsolicited handler enabling logic

Carlo Lobrano c.lobrano at gmail.com
Mon Jun 5 07:51:05 UTC 2017


Hi Aleksander,

I tested this patch and it looks good to me (I specially like the second
one). There is just a little mistake I made in my part of the patch. In the
"status changed" log I inverted current status with the previous one.

---
 plugins/telit/mm-broadband-modem-telit.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/plugins/telit/mm-broadband-modem-telit.c
b/plugins/telit/mm-broadband-modem-telit.c
index 7c93c0d..e78a195 100644
--- a/plugins/telit/mm-broadband-modem-telit.c
+++ b/plugins/telit/mm-broadband-modem-telit.c
@@ -125,9 +125,9 @@ telit_qss_unsolicited_handler (MMPortSerialAt *port,
     self->priv->qss_status = cur_qss_status;

     if (cur_qss_status != prev_qss_status)
-        mm_dbg ("QSS: status changed '%s -> %s",
-                mm_telit_qss_status_get_string (cur_qss_status),
-                mm_telit_qss_status_get_string (prev_qss_status));
+        mm_dbg ("QSS: status changed %s -> %s",
+                mm_telit_qss_status_get_string (prev_qss_status),
+                mm_telit_qss_status_get_string (cur_qss_status));

     if ((prev_qss_status == QSS_STATUS_SIM_REMOVED && cur_qss_status !=
QSS_STATUS_SIM_REMOVED) ||
         (prev_qss_status > QSS_STATUS_SIM_REMOVED && cur_qss_status ==
QSS_STATUS_SIM_REMOVED)) {
--


Can I submit a little patch just for that or do you prefer doing otherwise?

On 2 June 2017 at 13:10, Aleksander Morgado <aleksander at aleksander.es>
wrote:

> When the async method starts we store already the primary and the
> optional secondary port objects in the method context, keeping a full
> reference for each.
>
> When we parse the response for the enabling command, we just reuse the
> stored port objects, instead of re-querying the modem to get them, and
> this makes sure that the port objects where we want to set the
> unsolicited message handlers are still valid. If the ports are gone
> in the middle of the enabling operation, the handlers will be set
> without errors, even if the ports may likely get completely disposed
> when this async method context is disposed.
>
> Additionally, we make sure that we return an error also for the case
> where there is no secondary port and the enabling on the primary port
> failed.
>
> This patch also fixes the use of the at_command_full_finish() method to
> complete the at_command_full() async operation, to keep consistency.
> ---
>  plugins/telit/mm-broadband-modem-telit.c | 102
> +++++++++++++------------------
>  1 file changed, 41 insertions(+), 61 deletions(-)
>
> diff --git a/plugins/telit/mm-broadband-modem-telit.c
> b/plugins/telit/mm-broadband-modem-telit.c
> index 2c1c5420..e609bab1 100644
> --- a/plugins/telit/mm-broadband-modem-telit.c
> +++ b/plugins/telit/mm-broadband-modem-telit.c
> @@ -103,6 +103,8 @@ typedef enum {
>
>  typedef struct {
>      QssSetupStep step;
> +    MMPortSerialAt *primary;
> +    MMPortSerialAt *secondary;
>      GError *primary_error;
>      GError *secondary_error;
>  } QssSetupContext;
> @@ -138,6 +140,8 @@ telit_qss_unsolicited_handler (MMPortSerialAt *port,
>  static void
>  qss_setup_context_free (QssSetupContext *ctx)
>  {
> +    g_clear_object (&(ctx->primary));
> +    g_clear_object (&(ctx->secondary));
>      g_clear_error (&(ctx->primary_error));
>      g_clear_error (&(ctx->secondary_error));
>      g_slice_free (QssSetupContext, ctx);
> @@ -156,60 +160,37 @@ telit_qss_enable_ready (MMBaseModem *modem,
>                          GAsyncResult *res,
>                          GTask *task)
>  {
> -    GError *error = NULL;
>      MMBroadbandModemTelit *self;
>      QssSetupContext *ctx;
> -    MMPortSerialAt *primary;
> -    MMPortSerialAt *secondary;
> +    MMPortSerialAt *port;
> +    GError **error;
>      GRegex *pattern;
>
>      self = MM_BROADBAND_MODEM_TELIT (g_task_get_source_object (task));
>      ctx = g_task_get_task_data (task);
>
> -    mm_base_modem_at_command_finish (modem, res, &error);
> -    if (error) {
> -        if (ctx->step == QSS_SETUP_STEP_ENABLE_PRIMARY_PORT) {
> -            mm_warn ("QSS: error enabling unsolicited on primary port:
> %s", error->message);
> -            ctx->primary_error = error;
> -        } else if (ctx->step == QSS_SETUP_STEP_ENABLE_SECONDARY_PORT) {
> -            mm_warn ("QSS: error enabling unsolicited on secondary port:
> %s", error->message);
> -            ctx->secondary_error = error;
> -        } else {
> -            g_assert_not_reached ();
> -        }
> +    if (ctx->step == QSS_SETUP_STEP_ENABLE_PRIMARY_PORT) {
> +        port = ctx->primary;
> +        error = &ctx->primary_error;
> +    } else if (ctx->step == QSS_SETUP_STEP_ENABLE_SECONDARY_PORT) {
> +        port = ctx->secondary;
> +        error = &ctx->secondary_error;
> +    } else
> +        g_assert_not_reached ();
> +
> +    if (!mm_base_modem_at_command_full_finish (modem, res, error)) {
> +        mm_warn ("QSS: error enabling unsolicited on port %s: %s",
> mm_port_get_device (MM_PORT (port)), (*error)->message);
>          goto next_step;
>      }
>
>      pattern = g_regex_new ("#QSS:\\s*([0-3])\\r\\n", G_REGEX_RAW, 0,
> NULL);
>      g_assert (pattern);
> -
> -    if (ctx->step == QSS_SETUP_STEP_ENABLE_PRIMARY_PORT) {
> -        primary = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
> -        mm_port_serial_at_add_unsolicited_msg_handler (
> -            primary,
> -            pattern,
> -            (MMPortSerialAtUnsolicitedMsgFn)telit_qss_unsolicited_
> handler,
> -            self,
> -            NULL);
> -    }
> -
> -    if (ctx->step == QSS_SETUP_STEP_ENABLE_SECONDARY_PORT) {
> -        secondary = mm_base_modem_peek_port_secondary (MM_BASE_MODEM
> (self));
> -        if (!secondary) {
> -            mm_port_serial_at_add_unsolicited_msg_handler (
> -                secondary,
> -                pattern,
> -                (MMPortSerialAtUnsolicitedMsgFn)telit_qss_unsolicited_
> handler,
> -                self,
> -                NULL);
> -        } else {
> -            mm_warn ("QSS could not set handler on secondary port: no
> secondary port found.");
> -            ctx->secondary_error = g_error_new (MM_CORE_ERROR,
> -                                                MM_CORE_ERROR_FAILED,
> -                                                "QSS could not set
> handler hat secondary port: no secondary port found.");
> -        }
> -    }
> -
> +    mm_port_serial_at_add_unsolicited_msg_handler (
> +        port,
> +        pattern,
> +        (MMPortSerialAtUnsolicitedMsgFn)telit_qss_unsolicited_handler,
> +        self,
> +        NULL);
>      g_regex_unref (pattern);
>
>  next_step:
> @@ -276,7 +257,7 @@ qss_setup_step (GTask *task)
>              return;
>          case QSS_SETUP_STEP_ENABLE_PRIMARY_PORT:
>              mm_base_modem_at_command_full (MM_BASE_MODEM (self),
> -                                           mm_base_modem_peek_port_primary
> (MM_BASE_MODEM (self)),
> +                                           ctx->primary,
>                                             "#QSS=1",
>                                             3,
>                                             FALSE,
> @@ -285,35 +266,32 @@ qss_setup_step (GTask *task)
>                                             (GAsyncReadyCallback)
> telit_qss_enable_ready,
>                                             task);
>              return;
> -        case QSS_SETUP_STEP_ENABLE_SECONDARY_PORT: {
> -            MMPortSerialAt *port;
> -
> -            port = mm_base_modem_peek_port_secondary (MM_BASE_MODEM
> (self));
> -            if (port) {
> +        case QSS_SETUP_STEP_ENABLE_SECONDARY_PORT:
> +            if (ctx->secondary) {
>                  mm_base_modem_at_command_full (MM_BASE_MODEM (self),
> -                                           port,
> -                                           "#QSS=1",
> -                                           3,
> -                                           FALSE,
> -                                           FALSE, /* raw */
> -                                           NULL, /* cancellable */
> -                                           (GAsyncReadyCallback)
> telit_qss_enable_ready,
> -                                           task);
> +                                               ctx->secondary,
> +                                               "#QSS=1",
> +                                               3,
> +                                               FALSE,
> +                                               FALSE, /* raw */
> +                                               NULL, /* cancellable */
> +                                               (GAsyncReadyCallback)
> telit_qss_enable_ready,
> +                                               task);
>                  return;
>              }
> -
>              /* Fall back to next step */
>              ctx->step++;
> -        }
>          case QSS_SETUP_STEP_LAST:
> -            if (ctx->primary_error && ctx->secondary_error) {
> +            /* If all enabling actions failed (either both, or only
> primary if
> +             * there is no secondary), then we return an error */
> +            if (ctx->primary_error &&
> +                (ctx->secondary_error || !ctx->secondary))
>                  g_task_return_new_error (task,
>                                           MM_CORE_ERROR,
>                                           MM_CORE_ERROR_FAILED,
>                                           "QSS: couldn't enable
> unsolicited");
> -            } else {
> +            else
>                  g_task_return_boolean (task, TRUE);
> -            }
>              g_object_unref (task);
>              break;
>      }
> @@ -331,6 +309,8 @@ modem_setup_sim_hot_swap (MMIfaceModem *self,
>
>      ctx = g_slice_new0 (QssSetupContext);
>      ctx->step = QSS_SETUP_STEP_FIRST;
> +    ctx->primary = mm_base_modem_get_port_primary (MM_BASE_MODEM (self));
> +    ctx->secondary = mm_base_modem_get_port_secondary (MM_BASE_MODEM
> (self));
>
>      g_task_set_task_data (task, ctx, (GDestroyNotify)
> qss_setup_context_free);
>      qss_setup_step (task);
> --
> 2.13.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20170605/0c8ac67b/attachment-0001.html>


More information about the ModemManager-devel mailing list