On my Huawei E1552 with PIN locked SIM sim_state is 0 when calling
huawei_post_sim() and gprs context is not registered. This is because
^SIMST notification is received only after huawei_post_sim() is called:
Aug 10 12:38:33 tukki ofonod[6565]: plugins/huawei.c:huawei_post_sim() 0x6cdb50
[...]
Aug 10 12:38:34 tukki ofonod[6565]: Pcui:< \r\n^SIMST:1\r\n\r\n^SRVST:2\r\n
Aug 10 12:38:34 tukki ofonod[6565]: plugins/huawei.c:notify_sim_state() 1
Add a test to wait for sim_state to be ready and also a call to
notify_sim_state() to call huawei_post_sim() whenever needed.
---
plugins/huawei.c | 102 ++++++++++++++++++++++++++++++------------------------
1 files changed, 56 insertions(+), 46 deletions(-)
diff --git a/plugins/huawei.c b/plugins/huawei.c
index ba66513..582cba6 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -74,6 +74,7 @@ struct huawei_data {
struct ofono_gprs *gprs;
struct ofono_gprs_context *gc;
guint query_sim_state;
+ gboolean post_sim;
};
static gboolean query_sim_state(gpointer user_data);
@@ -112,6 +113,58 @@ static void huawei_debug(const char *str, void *user_data)
ofono_info("%s%s", prefix, str);
}
+static void huawei_post_sim(struct ofono_modem *modem)
+{
+ struct huawei_data *data = ofono_modem_get_data(modem);
+ struct ofono_netreg *netreg;
+ struct ofono_message_waiting *mw;
+
+ DBG("%p sim_state %d", modem, data->sim_state);
+
+ if (data->sim_state == HUAWEI_SIM_STATE_INVALID_OR_LOCKED) {
+ /* let's wait for ^SIMST notification so that SIM is ready */
+ data->post_sim = TRUE;
+ return;
+ }
+
+ if (data->sim_state == HUAWEI_SIM_STATE_INVALID_PS_AND_CS) {
+ ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+ return;
+ }
+
+ netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
+ data->pcui);
+
+ ofono_sms_create(modem, OFONO_VENDOR_HUAWEI, "atmodem", data->pcui);
+ ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem",
+ data->pcui);
+ ofono_ussd_create(modem, 0, "atmodem", data->pcui);
+ ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+
+ if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
+ data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
+ data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
+ data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+ data->modem);
+
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
+ }
+
+ if ((data->sim_state == HUAWEI_SIM_STATE_VALID ||
+ data->sim_state == HUAWEI_SIM_STATE_INVALID_PS) &&
+ ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
+ ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
+ ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
+ ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
+ ofono_ssn_create(modem, 0, "atmodem", data->pcui);
+
+ mw = ofono_message_waiting_create(modem);
+ if (mw)
+ ofono_message_waiting_register(mw);
+ }
+}
+
static void notify_sim_state(struct ofono_modem *modem,
enum huawei_sim_state sim_state)
{
@@ -130,6 +183,9 @@ static void notify_sim_state(struct ofono_modem *modem,
ofono_sim_inserted_notify(data->sim, TRUE);
data->sim_state = sim_state;
+
+ if (data->post_sim)
+ huawei_post_sim(modem);
}
static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -378,52 +434,6 @@ static void huawei_pre_sim(struct ofono_modem *modem)
ofono_voicecall_create(modem, 0, "atmodem", data->pcui);
}
-static void huawei_post_sim(struct ofono_modem *modem)
-{
- struct huawei_data *data = ofono_modem_get_data(modem);
- struct ofono_netreg *netreg;
- struct ofono_message_waiting *mw;
-
- DBG("%p", modem);
-
- if (data->sim_state == HUAWEI_SIM_STATE_INVALID_PS_AND_CS) {
- ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
- return;
- }
-
- netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
- data->pcui);
-
- ofono_sms_create(modem, OFONO_VENDOR_HUAWEI, "atmodem", data->pcui);
- ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem",
- data->pcui);
- ofono_ussd_create(modem, 0, "atmodem", data->pcui);
- ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
-
- if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
- data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
- data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
- data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
- data->modem);
-
- if (data->gprs && data->gc)
- ofono_gprs_add_context(data->gprs, data->gc);
- }
-
- if ((data->sim_state == HUAWEI_SIM_STATE_VALID ||
- data->sim_state == HUAWEI_SIM_STATE_INVALID_PS) &&
- ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
- ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
- ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
- ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
- ofono_ssn_create(modem, 0, "atmodem", data->pcui);
-
- mw = ofono_message_waiting_create(modem);
- if (mw)
- ofono_message_waiting_register(mw);
- }
-}
-
static struct ofono_modem_driver huawei_driver = {
.name = "huawei",
.probe = huawei_probe,