[PATCH] telit: lock/unlock CSIM operations by default

Dan Williams dcbw at redhat.com
Wed Mar 15 01:40:06 UTC 2017


On Wed, 2017-03-15 at 00:19 +0100, Aleksander Morgado wrote:
> Wrap the AT+CSIM=XX commands between lock (CSIM=1) and
> unlock (CSIM=0) operations.
> 
> This seems to avoid the TTY lockup seen in several different Telit
> modules.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=100205
> 
> Reported-by: Penalva, Salvador <Salvador.Penalva at digi.com>
> ---
> 
> Hey Salvador, Carlo and Daniele,
> 
> Can you guys review and test this patch? It looks like it solved the
> issue I saw myself.
> 
> The AT command reference for the Telit LE866 does say that the
> AT+CSIM commands need to be enclosed within lock/unlock operations
> like these.

If the LOCK succeeds, then don't we need to UNLOCK if some intermediate
step fails?  It looks like we'll just leave it in locked state if any
step like say PIN or PIN2 calls
load_unlock_retries_context_complete_and_free().

Dan

> ---
>  plugins/telit/mm-broadband-modem-telit.c | 60
> ++++++++++++++++++++++++++++++++
>  1 file changed, 60 insertions(+)
> 
> diff --git a/plugins/telit/mm-broadband-modem-telit.c
> b/plugins/telit/mm-broadband-modem-telit.c
> index b1679ae4..8bc9d1e5 100644
> --- a/plugins/telit/mm-broadband-modem-telit.c
> +++ b/plugins/telit/mm-broadband-modem-telit.c
> @@ -452,6 +452,8 @@ modem_load_supported_bands (MMIfaceModem *self,
>  /*******************************************************************
> **********/
>  /* Load unlock retries (Modem interface) */
> 
> +#define CSIM_LOCK_STR               "+CSIM=1"
> +#define CSIM_UNLOCK_STR             "+CSIM=0"
>  #define CSIM_QUERY_PIN_RETRIES_STR  "+CSIM=10,0020000100"
>  #define CSIM_QUERY_PUK_RETRIES_STR  "+CSIM=10,002C000100"
>  #define CSIM_QUERY_PIN2_RETRIES_STR "+CSIM=10,0020008100"
> @@ -460,10 +462,12 @@ modem_load_supported_bands (MMIfaceModem *self,
> 
>  typedef enum {
>      LOAD_UNLOCK_RETRIES_STEP_FIRST,
> +    LOAD_UNLOCK_RETRIES_STEP_LOCK,
>      LOAD_UNLOCK_RETRIES_STEP_PIN,
>      LOAD_UNLOCK_RETRIES_STEP_PUK,
>      LOAD_UNLOCK_RETRIES_STEP_PIN2,
>      LOAD_UNLOCK_RETRIES_STEP_PUK2,
> +    LOAD_UNLOCK_RETRIES_STEP_UNLOCK,
>      LOAD_UNLOCK_RETRIES_STEP_LAST
>  } LoadUnlockRetriesStep;
> 
> @@ -500,6 +504,25 @@ modem_load_unlock_retries_finish (MMIfaceModem
> *self,
>  }
> 
>  static void
> +csim_unlock_ready (MMBaseModem              *self,
> +                   GAsyncResult             *res,
> +                   LoadUnlockRetriesContext *ctx)
> +{
> +    const gchar *response;
> +    GError      *error = NULL;
> +
> +    /* Ignore errors */
> +    response = mm_base_modem_at_command_finish (self, res, &error);
> +    if (!response) {
> +        mm_warn ("Couldn't unlock SIM card: %s", error->message);
> +        g_error_free (error);
> +    }
> +
> +    ctx->step++;
> +    load_unlock_retries_step (ctx);
> +}
> +
> +static void
>  csim_query_ready (MMBaseModem *self,
>                    GAsyncResult *res,
>                    LoadUnlockRetriesContext *ctx)
> @@ -542,6 +565,7 @@ csim_query_ready (MMBaseModem *self,
>              mm_unlock_retries_set (ctx->retries,
> MM_MODEM_LOCK_SIM_PUK2, unlock_retries);
>              break;
>          default:
> +            g_assert_not_reached ();
>              break;
>      }
> 
> @@ -551,12 +575,40 @@ next_step:
>  }
> 
>  static void
> +csim_lock_ready (MMBaseModem              *self,
> +                 GAsyncResult             *res,
> +                 LoadUnlockRetriesContext *ctx)
> +{
> +    const gchar *response;
> +    GError      *error = NULL;
> +
> +    response = mm_base_modem_at_command_finish (self, res, &error);
> +    if (!response) {
> +        g_prefix_error (&error, "Couldn't lock SIM card: ");
> +        g_simple_async_result_take_error (ctx->result, error);
> +        load_unlock_retries_context_complete_and_free (ctx);
> +        return;
> +    }
> +
> +    ctx->step++;
> +    load_unlock_retries_step (ctx);
> +}
> +
> +static void
>  load_unlock_retries_step (LoadUnlockRetriesContext *ctx)
>  {
>      switch (ctx->step) {
>          case LOAD_UNLOCK_RETRIES_STEP_FIRST:
>              /* Fall back on next step */
>              ctx->step++;
> +        case LOAD_UNLOCK_RETRIES_STEP_LOCK:
> +            mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
> +                                      CSIM_LOCK_STR,
> +                                      CSIM_QUERY_TIMEOUT,
> +                                      FALSE,
> +                                      (GAsyncReadyCallback)
> csim_lock_ready,
> +                                      ctx);
> +            break;
>          case LOAD_UNLOCK_RETRIES_STEP_PIN:
>              mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
>                                        CSIM_QUERY_PIN_RETRIES_STR,
> @@ -589,6 +641,14 @@ load_unlock_retries_step
> (LoadUnlockRetriesContext *ctx)
>                                        (GAsyncReadyCallback)
> csim_query_ready,
>                                        ctx);
>              break;
> +        case LOAD_UNLOCK_RETRIES_STEP_UNLOCK:
> +            mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
> +                                      CSIM_UNLOCK_STR,
> +                                      CSIM_QUERY_TIMEOUT,
> +                                      FALSE,
> +                                      (GAsyncReadyCallback)
> csim_unlock_ready,
> +                                      ctx);
> +            break;
>          case LOAD_UNLOCK_RETRIES_STEP_LAST:
>              if (ctx->succeded_requests == 0) {
>                  g_simple_async_result_set_error (ctx->result,
> --
> 2.12.0
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


More information about the ModemManager-devel mailing list