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, _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono