Hi all, Sorry for the late reply, but I was double checking this change because of the last paragraph in +CSIM reference:
> After the locking of the SIM-ME interface (AT+CSIM=1) the SIM will be > accessible only by AT+CSIM commands (#QSS: 0). The GSM and GPRS services > will be automatically de-registered to avoid the TE commands alter the GSM > application. They will be automatically reconditioned after the unlocking of the > SIM-ME interface. After the unlocking of the SIM-ME interface if PIN is required > it will be necessary to enter it another time. But this does not seems to affect the behaviour of the modem, which still works fine. In my environment I can't reproduce the issue this patch fixes (tty locked), but I do not see any side effect, so for me it's ok. But, while this patch does not cause regression, I did observe a problem testing this use case: when SIM is locked and then unlocked, with SIM hot swap enabled, we receive an unsolicited "#QSS: 1", which is not related to any physical SIM insertion, and release the modem: mar 16 09:55:00 d2092 ModemManager[542]: <debug> (ttyACM0): --> 'AT+CSQ<CR>' mar 16 09:55:00 d2092 ModemManager[542]: <debug> (ttyACM0): <-- '<CR><LF>' mar 16 09:55:00 d2092 ModemManager[542]: <debug> (ttyACM0): <-- '+CSQ: 9,4<CR><LF><CR><LF>OK<CR><LF>' mar 16 09:55:00 d2092 ModemManager[542]: <debug> (ttyACM0) device open count is 3 (close) mar 16 09:55:00 d2092 ModemManager[542]: <debug> Modem /org/freedesktop/ModemManager1/Modem/0: signal quality updated (29) mar 16 09:55:00 d2092 ModemManager[542]: <debug> Periodic signal quality checks rescheduled (interval = 30s) mar 16 09:55:02 d2092 ModemManager[542]: <debug> (ttyACM3): <-- '<CR><LF>+CIEV: service,1<CR><LF>' mar 16 09:55:02 d2092 ModemManager[542]: <debug> (ttyACM3): <-- '<CR><LF>+CIEV: roam,0<CR><LF>' mar 16 09:55:05 d2092 ModemManager[542]: <debug> (ttyACM0) device open count is 4 (open) mar 16 09:55:05 d2092 ModemManager[542]: <debug> (ttyACM0): --> 'AT+CCLK?<CR>' mar 16 09:55:05 d2092 ModemManager[542]: <debug> (ttyACM0): <-- '<CR><LF>' mar 16 09:55:05 d2092 ModemManager[542]: <debug> (ttyACM0): <-- '+CCLK: "17/03/16,09:55:05+04"<CR><LF><CR><LF>OK<CR><LF>' mar 16 09:55:05 d2092 ModemManager[542]: <debug> (ttyACM0) device open count is 3 (close) mar 16 09:55:09 d2092 ModemManager[542]: <debug> (ttyACM3): <-- '<CR><LF>#QSS: 1<CR><LF>' mar 16 09:55:09 d2092 ModemManager[542]: <info> QSS: SIM inserted mar 16 09:55:09 d2092 ModemManager[542]: <debug> Releasing SIM hot swap ports context This happens with master ModemManger too. I'm working on this now, probably a solution would be to borrow Aleksander patch about #QSS: 3, in order to keep an internal state of the SIM presence and just ignore #QSS: 1 when we already know that SIM is inserted. On Wed, 15 Mar 2017 at 23:49 Aleksander Morgado <aleksan...@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.pena...@digi.com> --- Hey Dan & everyone, This v2 just adds a NOTE at the beginning of the section specifying that the UNLOCK step must always be run if LOCK is run. --- plugins/telit/mm-broadband-modem-telit.c | 69 +++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c index b1679ae4..6ef340f1 100644 --- a/plugins/telit/mm-broadband-modem-telit.c +++ b/plugins/telit/mm-broadband-modem-telit.c @@ -450,8 +450,17 @@ modem_load_supported_bands (MMIfaceModem *self, } /*****************************************************************************/ -/* Load unlock retries (Modem interface) */ +/* Load unlock retries (Modem interface) + * + * NOTE: the logic must make sure that LOAD_UNLOCK_RETRIES_STEP_UNLOCK is always + * run if LOAD_UNLOCK_RETRIES_STEP_LOCK has been run. Currently, the logic just + * runs all intermediate steps ignoring errors (i.e. not completing the + * operation if something fails), so the LOAD_UNLOCK_RETRIES_STEP_UNLOCK is + * always run. + */ +#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 +469,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 +511,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 +572,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 +582,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 +648,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