qmi: support sim hotplug

Use card status indication to detect SIM removal and insertions
This commit is contained in:
Christophe Ronco 2019-02-15 15:37:24 +01:00 committed by Denis Kenzior
parent cefba0c26f
commit 34225d2681
2 changed files with 41 additions and 5 deletions

View File

@ -524,7 +524,7 @@ static bool get_card_status(const struct qmi_uim_slot_info *slot,
return need_retry;
}
static enum get_card_status_result handle_get_card_status_result(
static enum get_card_status_result handle_get_card_status_data(
struct qmi_result *result, struct sim_status *sim_stat)
{
const void *ptr;
@ -533,9 +533,6 @@ static enum get_card_status_result handle_get_card_status_result(
uint8_t i;
enum get_card_status_result res = GET_CARD_STATUS_RESULT_ERROR;
if (qmi_result_set_error(result, NULL))
goto done;
ptr = qmi_result_get(result, QMI_UIM_RESULT_CARD_STATUS, &len);
if (!ptr)
goto done;
@ -578,6 +575,15 @@ done:
return res;
}
static enum get_card_status_result handle_get_card_status_result(
struct qmi_result *result, struct sim_status *sim_stat)
{
if (qmi_result_set_error(result, NULL))
return GET_CARD_STATUS_RESULT_ERROR;
return handle_get_card_status_data(result, sim_stat);
}
static gboolean query_passwd_state_retry(gpointer userdata)
{
struct cb_data *cbd = userdata;
@ -796,6 +802,33 @@ static void get_card_status_cb(struct qmi_result *result, void *user_data)
}
}
static void card_status_notify(struct qmi_result *result, void *user_data)
{
struct ofono_sim *sim = user_data;
struct sim_data *data = ofono_sim_get_data(sim);
struct sim_status sim_stat;
DBG("");
if (handle_get_card_status_data(result, &sim_stat) !=
GET_CARD_STATUS_RESULT_OK) {
data->app_type = 0; /* Unknown */
sim_stat.card_state = 0x00; /* Absent */
} else {
data->app_type = sim_stat.app_type;
}
switch (sim_stat.card_state) {
case 0x00: /* Absent */
case 0x02: /* Error */
ofono_sim_inserted_notify(sim, FALSE);
break;
case 0x01: /* Present */
ofono_sim_inserted_notify(sim, TRUE);
break;
}
}
static void event_registration_cb(struct qmi_result *result, void *user_data)
{
struct ofono_sim *sim = user_data;
@ -811,6 +844,9 @@ static void event_registration_cb(struct qmi_result *result, void *user_data)
goto error;
DBG("event mask 0x%04x", data->event_mask);
if (data->event_mask & 0x0001)
qmi_service_register(data->uim, QMI_UIM_GET_CARD_STATUS_EVENT,
card_status_notify, sim, NULL);
if (qmi_service_send(data->uim, QMI_UIM_GET_CARD_STATUS, NULL,
get_card_status_cb, sim, NULL) > 0)

View File

@ -29,7 +29,7 @@
#define QMI_UIM_EVENT_REGISTRATION 46 /* Register for indications */
#define QMI_UIM_GET_CARD_STATUS 47 /* Get card status */
#define QMI_UIM_GET_CARD_STATUS_EVENT 50 /* Card status indication */
/* Register for indications */
#define QMI_UIM_PARAM_EVENT_MASK 0x01 /* uint32 */