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.pena...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel