summaryrefslogtreecommitdiff
path: root/drivers/qmimodem
diff options
context:
space:
mode:
authorChristophe Ronco <c.ronco@kerlink.fr>2018-04-13 15:58:35 +0200
committerDenis Kenzior <denkenz@gmail.com>2018-04-19 10:27:32 -0500
commit8af406a45d9f10f485c9cdf56b8525fd9420611e (patch)
tree7c6a2ed472990a3c10a5808a7edfd4783853b5f5 /drivers/qmimodem
parentbfa0ac979eee07aba908a565216171b410b27f57 (diff)
downloadofono-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/qmimodem')
-rw-r--r--drivers/qmimodem/sim.c19
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 {