diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c index e91c6578..b96f8efb 100644 --- a/drivers/qmimodem/sim.c +++ b/drivers/qmimodem/sim.c @@ -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) diff --git a/drivers/qmimodem/uim.h b/drivers/qmimodem/uim.h index cd10e684..9003aba3 100644 --- a/drivers/qmimodem/uim.h +++ b/drivers/qmimodem/uim.h @@ -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 */