mirror of git://git.sysmocom.de/ofono
qmi: support sim hotplug
Use card status indication to detect SIM removal and insertions
This commit is contained in:
parent
cefba0c26f
commit
34225d2681
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue