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;
|
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)
|
struct qmi_result *result, struct sim_status *sim_stat)
|
||||||
{
|
{
|
||||||
const void *ptr;
|
const void *ptr;
|
||||||
|
@ -533,9 +533,6 @@ static enum get_card_status_result handle_get_card_status_result(
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
enum get_card_status_result res = GET_CARD_STATUS_RESULT_ERROR;
|
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);
|
ptr = qmi_result_get(result, QMI_UIM_RESULT_CARD_STATUS, &len);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -578,6 +575,15 @@ done:
|
||||||
return res;
|
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)
|
static gboolean query_passwd_state_retry(gpointer userdata)
|
||||||
{
|
{
|
||||||
struct cb_data *cbd = 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)
|
static void event_registration_cb(struct qmi_result *result, void *user_data)
|
||||||
{
|
{
|
||||||
struct ofono_sim *sim = 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;
|
goto error;
|
||||||
|
|
||||||
DBG("event mask 0x%04x", data->event_mask);
|
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,
|
if (qmi_service_send(data->uim, QMI_UIM_GET_CARD_STATUS, NULL,
|
||||||
get_card_status_cb, sim, NULL) > 0)
|
get_card_status_cb, sim, NULL) > 0)
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
#define QMI_UIM_EVENT_REGISTRATION 46 /* Register for indications */
|
#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 47 /* Get card status */
|
||||||
|
#define QMI_UIM_GET_CARD_STATUS_EVENT 50 /* Card status indication */
|
||||||
|
|
||||||
/* Register for indications */
|
/* Register for indications */
|
||||||
#define QMI_UIM_PARAM_EVENT_MASK 0x01 /* uint32 */
|
#define QMI_UIM_PARAM_EVENT_MASK 0x01 /* uint32 */
|
||||||
|
|
Loading…
Reference in New Issue