[PATCH] telit: lock/unlock CSIM operations by default
Penalva, Salvador
Salvador.Penalva at digi.com
Fri Mar 17 09:52:39 UTC 2017
Thank you all,
You have all been really helpful and quick and the patch seems to do its job perfectly!
Salvador
-----Original Message-----
From: Aleksander Morgado [mailto:aleksander at aleksander.es]
Sent: jueves, 16 de marzo de 2017 22:35
To: Carlo Lobrano; Penalva, Salvador; Daniele Palmas
Cc: ModemManager (development); Aleksander Morgado
Subject: Re: [PATCH] telit: lock/unlock CSIM operations by default
On Wed, Mar 15, 2017 at 12:19 AM, Aleksander Morgado <aleksander at aleksander.es> 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.
>
Pushed to git master and mm-1-6.
> ---
> 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
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list