Use card status indication to detect SIM removal and insertions
---
drivers/qmimodem/sim.c | 44 ++++++++++++++++++++++++++++++++++++++++----
drivers/qmimodem/uim.h | 2 +-
2 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c
index e91c657..b96f8ef 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 cd10e68..9003aba 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 */
--
2.7.4