From 1588e7c082c976b730c00d016ededaa8e5cc54d7 Mon Sep 17 00:00:00 2001 From: Philip Paeps Date: Thu, 26 Jun 2014 19:08:14 +0200 Subject: [PATCH] sim: query Quectel UC15 PIN retries with AT+QPINC? --- drivers/atmodem/sim.c | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c index f8e04725..4a91798c 100644 --- a/drivers/atmodem/sim.c +++ b/drivers/atmodem/sim.c @@ -67,6 +67,7 @@ static const char *epin_prefix[] = { "*EPIN:", NULL }; static const char *spic_prefix[] = { "+SPIC:", NULL }; static const char *pct_prefix[] = { "#PCT:", NULL }; static const char *pnnm_prefix[] = { "+PNNM:", NULL }; +static const char *qpinc_prefix[] = { "+QPINC:", NULL }; static const char *none_prefix[] = { NULL }; static void at_crsm_info_cb(gboolean ok, GAtResult *result, gpointer user_data) @@ -967,6 +968,49 @@ error: CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); } +static void at_qpinc_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct cb_data *cbd = user_data; + ofono_sim_pin_retries_cb_t cb = cbd->cb; + const char *final = g_at_result_final_response(result); + GAtResultIter iter; + struct ofono_error error; + int retries[OFONO_SIM_PASSWORD_INVALID]; + size_t i; + + decode_at_error(&error, final); + + if (!ok) { + cb(&error, NULL, cbd->data); + return; + } + + for (i = 0; i < OFONO_SIM_PASSWORD_INVALID; i++) + retries[i] = -1; + + g_at_result_iter_init(&iter, result); + while (g_at_result_iter_next(&iter, "+QPINC:")) { + const char *name; + int pin, puk; + + if (!g_at_result_iter_next_string(&iter, &name)) + continue; + if (!g_at_result_iter_next_number(&iter, &pin)) + continue; + if (!g_at_result_iter_next_number(&iter, &puk)) + continue; + + if (!strcmp(name, "SC")) { + retries[OFONO_SIM_PASSWORD_SIM_PIN] = pin; + retries[OFONO_SIM_PASSWORD_SIM_PUK] = puk; + } else if (!strcmp(name, "P2")) { + retries[OFONO_SIM_PASSWORD_SIM_PIN2] = pin; + retries[OFONO_SIM_PASSWORD_SIM_PUK2] = puk; + } + } + cb(&error, retries, cbd->data); +} + static void at_pin_retries_query(struct ofono_sim *sim, ofono_sim_pin_retries_cb_t cb, void *data) @@ -1028,6 +1072,11 @@ static void at_pin_retries_query(struct ofono_sim *sim, at_pnnm_cb, cbd, g_free) > 0) return; break; + case OFONO_VENDOR_QUECTEL: + if (g_at_chat_send(sd->chat, "AT+QPINC?", qpinc_prefix, + at_qpinc_cb, cbd, g_free) > 0) + return; + break; default: if (g_at_chat_send(sd->chat, "AT+CPINR", cpinr_prefixes, at_cpinr_cb, cbd, g_free) > 0)