diff options
Diffstat (limited to 'plugins/huawei.c')
-rw-r--r-- | plugins/huawei.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/plugins/huawei.c b/plugins/huawei.c index 0c8d8c07..f40889e0 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -221,6 +221,30 @@ static gboolean notify_sim_state(struct ofono_modem *modem, return FALSE; } +static void cpin_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + + if (!ok) + return; + + /* Force notification of SIM ready because it's in a locked state */ + notify_sim_state(modem, HUAWEI_SIM_STATE_VALID); +} + +static gboolean query_sim_locked(gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct huawei_data *data = ofono_modem_get_data(modem); + + data->sim_poll_timeout = 0; + + g_at_chat_send(data->pcui, "AT+CPIN?", NULL, + cpin_cb, modem, NULL); + + return FALSE; +} + static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; @@ -259,6 +283,10 @@ static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data) data->sim_poll_timeout = g_timeout_add_seconds(2, query_sim_state, modem); + } else if (sim_state == HUAWEI_SIM_STATE_INVALID_OR_LOCKED) { + data->sim_poll_timeout = g_timeout_add_seconds(2, + query_sim_locked, + modem); } } |