diff options
author | Christophe Ronco <c.ronco@kerlink.fr> | 2018-04-13 15:58:35 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2018-04-19 10:27:32 -0500 |
commit | 8af406a45d9f10f485c9cdf56b8525fd9420611e (patch) | |
tree | 7c6a2ed472990a3c10a5808a7edfd4783853b5f5 /drivers | |
parent | bfa0ac979eee07aba908a565216171b410b27f57 (diff) | |
download | ofono-8af406a45d9f10f485c9cdf56b8525fd9420611e.tar.gz |
qmi: report failure or retry in case of invalid pin type
QMI_UIM_GET_CARD_STATUS is retried in more error cases
when trying to get password type.
In case of failure, driver report an error instead of
OFONO_SIM_PASSWORD_INVALID. This avoids a crash.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/qmimodem/sim.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c index c884157e..2a40d9fb 100644 --- a/drivers/qmimodem/sim.c +++ b/drivers/qmimodem/sim.c @@ -493,8 +493,15 @@ static bool get_card_status(const struct qmi_uim_slot_info *slot, case 0x03: /* PUK1 or PUK for UPIN is required */ sim_stat->passwd_state = OFONO_SIM_PASSWORD_SIM_PUK; break; + case 0x00: /* Unknown */ + case 0x01: /* Detected */ case 0x04: /* Personalization state must be checked. */ - /* This is temporary, we could retry and get another result */ + case 0x05: /* PIN1 blocked */ + case 0x06: /* Illegal */ + /* + * This could be temporary, we should retry and + * expect another result + */ sim_stat->passwd_state = OFONO_SIM_PASSWORD_INVALID; need_retry = true; break; @@ -605,12 +612,18 @@ static void query_passwd_state_cb(struct qmi_result *result, case GET_CARD_STATUS_RESULT_OK: DBG("passwd state %d", sim_stat.passwd_state); data->retry_count = 0; - CALLBACK_WITH_SUCCESS(cb, sim_stat.passwd_state, cbd->data); + if (sim_stat.passwd_state == OFONO_SIM_PASSWORD_INVALID) + CALLBACK_WITH_FAILURE(cb, -1, cbd->data); + else + CALLBACK_WITH_SUCCESS(cb, sim_stat.passwd_state, + cbd->data); break; case GET_CARD_STATUS_RESULT_TEMP_ERROR: data->retry_count++; if (data->retry_count > MAX_RETRY_COUNT) { - DBG("Failed after %d attempts", data->retry_count); + DBG("Failed after %d attempts. Card state:%d", + data->retry_count, + sim_stat.card_state); data->retry_count = 0; CALLBACK_WITH_FAILURE(cb, -1, cbd->data); } else { |