summaryrefslogtreecommitdiffstats
path: root/plugins/ste.c
diff options
context:
space:
mode:
authorSjur Brændeland <sjur.brandeland@stericsson.com>2010-08-17 14:22:28 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-08-17 14:57:31 +0200
commite1cd53476a499285661bc4d4b46bb062481906b1 (patch)
tree0ac2c7f215fe240dfa8041c81484a2c43f82e917 /plugins/ste.c
parent53546e6e237462efcc457b4cbd36532e25422106 (diff)
downloadofono-e1cd53476a499285661bc4d4b46bb062481906b1.tar.bz2
stemodem: Add polling for SIM ready status
Interim solution until support for SIM 'ready' notification is supported.
Diffstat (limited to 'plugins/ste.c')
-rw-r--r--plugins/ste.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/plugins/ste.c b/plugins/ste.c
index 0dcb7f50..479d85cd 100644
--- a/plugins/ste.c
+++ b/plugins/ste.c
@@ -62,8 +62,13 @@
#include <drivers/stemodem/caif_socket.h>
#include <drivers/stemodem/if_caif.h>
+static const char *cpin_prefix[] = { "+CPIN:", NULL };
+
struct ste_data {
GAtChat *chat;
+ guint cpin_poll_source;
+ guint cpin_poll_count;
+ gboolean have_sim;
};
static int ste_probe(struct ofono_modem *modem)
@@ -90,6 +95,10 @@ static void ste_remove(struct ofono_modem *modem)
ofono_modem_set_data(modem, NULL);
g_at_chat_unref(data->chat);
+
+ if (data->cpin_poll_source > 0)
+ g_source_remove(data->cpin_poll_source);
+
g_free(data);
}
@@ -98,16 +107,55 @@ static void ste_debug(const char *str, void *user_data)
ofono_info("%s", str);
}
+static gboolean init_simpin_check(gpointer user_data);
+
+static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct ste_data *data = ofono_modem_get_data(modem);
+
+ /* Modem returns +CME ERROR: 10 if SIM is not ready. */
+ if (!ok && result->final_or_pdu &&
+ !strcmp(result->final_or_pdu, "+CME ERROR: 10") &&
+ data->cpin_poll_count++ < 5) {
+ data->cpin_poll_source =
+ g_timeout_add_seconds(1, init_simpin_check, modem);
+ return;
+ }
+
+ data->cpin_poll_count = 0;
+
+ /* Modem returns ERROR if there is no SIM in slot. */
+ data->have_sim = ok;
+
+ ofono_modem_set_powered(modem, TRUE);
+}
+
+static gboolean init_simpin_check(gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ struct ste_data *data = ofono_modem_get_data(modem);
+
+ data->cpin_poll_source = 0;
+
+ g_at_chat_send(data->chat, "AT+CPIN?", cpin_prefix,
+ simpin_check, modem, NULL);
+
+ return FALSE;
+}
+
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
DBG("");
- if (!ok)
+ if (!ok) {
ofono_modem_set_powered(modem, FALSE);
+ return;
+ }
- ofono_modem_set_powered(modem, TRUE);
+ init_simpin_check(modem);
}
static int ste_enable(struct ofono_modem *modem)