summaryrefslogtreecommitdiffstats
path: root/plugins/huawei.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/huawei.c')
-rw-r--r--plugins/huawei.c28
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);
}
}