huawei: fix online logic

The recently introduced online support to huawei didn't work with my
Huawei E1552. The problem was that with command AT+CFUN=1;+CFUN=5
the modem didn't initialise the sim state properly.

To fix this I changed the logic so that CFUN=5 is called only after the sim
state has switched to a valid state. Now my Huawei E1552 works with connman
again.

PIN locked SIMs still won't work. The problem is that it takes some time for
the sim state to go to a valid state:

Sep 20 15:01:57 dell-m520 ofonod[12451]: Pcui:< \r\n+CPIN: READY\r\n\r\nOK\r\n
[...]
Sep 20 15:02:00 dell-m520 ofonod[12451]: huawei: invalid sim state in post online (0)
[...]
Sep 20 15:02:01 dell-m520 ofonod[12451]: Pcui:< \r\n^SIMST:1\r\n

I don't know why it takes so long to get a valid state.

There is also another issue, in "cold start" case the phonebook
initialisation fails:

Sep 20 14:34:24 dell-m520 ofonod[11939]: Pcui:> AT+CPBS=?\r
Sep 20 14:34:24 dell-m520 ofonod[11939]: Pcui:< \r\n+CME ERROR: SIM busy\r\n

But in "warm start" it seems to work:

Sep 20 14:38:59 dell-m520 ofonod[12091]: Pcui:> AT+CPBS=?\r
Sep 20 14:38:59 dell-m520 ofonod[12091]: Pcui:< \r\n+CPBS: ("SM","EN","ON")\r\n\r\nOK\r\n

I consider this as a minor issue and didn't investigate it at all.
This commit is contained in:
Kalle Valo 2010-09-20 15:40:33 +03:00 committed by Marcel Holtmann
parent 940eaffa72
commit 78842faa30
1 changed files with 53 additions and 24 deletions

View File

@ -163,6 +163,22 @@ static void ussdmode_support_cb(gboolean ok, GAtResult *result,
ussdmode_query_cb, data, NULL);
}
static void cfun_offline(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
struct huawei_data *data = ofono_modem_get_data(modem);
if (!ok) {
ofono_modem_set_powered(modem, FALSE);
return;
}
if (data->sim == NULL)
return;
ofono_sim_inserted_notify(data->sim, TRUE);
}
static gboolean notify_sim_state(struct ofono_modem *modem,
enum huawei_sim_state sim_state)
{
@ -170,17 +186,33 @@ static gboolean notify_sim_state(struct ofono_modem *modem,
DBG("%d", sim_state);
if (sim_state == HUAWEI_SIM_STATE_NOT_EXISTENT) {
ofono_sim_inserted_notify(data->sim, FALSE);
data->sim_state = sim_state;
switch (sim_state) {
case HUAWEI_SIM_STATE_NOT_EXISTENT:
/* SIM is not ready, try again a bit later */
return TRUE;
case HUAWEI_SIM_STATE_INVALID_OR_LOCKED:
ofono_modem_set_powered(modem, TRUE);
return FALSE;
case HUAWEI_SIM_STATE_VALID:
case HUAWEI_SIM_STATE_INVALID_CS:
case HUAWEI_SIM_STATE_INVALID_PS:
case HUAWEI_SIM_STATE_INVALID_PS_AND_CS:
/*
* In the "warm start" case the modem skips
* HUAWEI_SIM_STATE_INVALID_OR_LOCKED altogether, so need
* to set power also here
*/
ofono_modem_set_powered(modem, TRUE);
g_at_chat_send(data->pcui, "AT+CFUN=5", none_prefix,
cfun_offline, modem, NULL);
return FALSE;
}
ofono_sim_inserted_notify(data->sim, TRUE);
data->sim_state = sim_state;
return FALSE;
}
@ -347,24 +379,24 @@ static void cvoice_query_cb(gboolean ok, GAtResult *result,
gint mode, rate, bits, period;
if (!ok)
goto done;
return;
g_at_result_iter_init(&iter, result);
if (!g_at_result_iter_next(&iter, "^CVOICE:"))
goto done;
return;
if (!g_at_result_iter_next_number(&iter, &mode))
goto done;
return;
if (!g_at_result_iter_next_number(&iter, &rate))
goto done;
return;
if (!g_at_result_iter_next_number(&iter, &bits))
goto done;
return;
if (!g_at_result_iter_next_number(&iter, &period))
goto done;
return;
data->voice = TRUE;
@ -383,9 +415,6 @@ static void cvoice_query_cb(gboolean ok, GAtResult *result,
/* check available voice ports */
g_at_chat_send(data->pcui, "AT^DDSETEX=?", none_prefix,
NULL, NULL, NULL);
done:
ofono_modem_set_powered(modem, TRUE);
}
static void cvoice_support_cb(gboolean ok, GAtResult *result,
@ -396,21 +425,16 @@ static void cvoice_support_cb(gboolean ok, GAtResult *result,
GAtResultIter iter;
if (!ok)
goto done;
return;
g_at_result_iter_init(&iter, result);
if (!g_at_result_iter_next(&iter, "^CVOICE:"))
goto done;
return;
/* query current voice setting */
g_at_chat_send(data->pcui, "AT^CVOICE?", cvoice_prefix,
cvoice_query_cb, modem, NULL);
return;
done:
ofono_modem_set_powered(modem, TRUE);
}
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
@ -550,7 +574,7 @@ static int huawei_enable(struct ofono_modem *modem)
g_at_chat_send(data->pcui, "ATE0", none_prefix, NULL, NULL, NULL);
g_at_chat_send(data->pcui, "AT+CFUN=1;+CFUN=5", none_prefix,
g_at_chat_send(data->pcui, "AT+CFUN=1", none_prefix,
cfun_enable, modem, NULL);
query_sim_state(modem);
@ -667,8 +691,13 @@ static void huawei_post_online(struct ofono_modem *modem)
struct ofono_netreg *netreg;
struct ofono_message_waiting *mw;
if (data->sim_state == HUAWEI_SIM_STATE_INVALID_PS_AND_CS)
if (data->sim_state != HUAWEI_SIM_STATE_VALID &&
data->sim_state != HUAWEI_SIM_STATE_INVALID_CS &&
data->sim_state != HUAWEI_SIM_STATE_INVALID_PS) {
ofono_info("huawei: invalid sim state in post online (%d)",
data->sim_state);
return;
}
netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
data->pcui);