* [PATCHv2 0/2] Robustness fixes for mbm @ 2010-08-23 14:18 Pekka.Pessi 2010-08-23 14:18 ` [PATCHv2 1/2] mbm: fix initial polling for sim Pekka.Pessi 0 siblings, 1 reply; 6+ messages in thread From: Pekka.Pessi @ 2010-08-23 14:18 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 485 bytes --] Hi all, Here are some robustness fixes for MBM modem. In 1/2 I've corrected my older patches which tried to detect the presence of the SIM card on the particular error response returned to AT+CPIN?. It did not work as expected. The patch 2/2 addresses problems initializing the modem too early. The initial command tends to fail when a MBM modem is inserted via USB and oFono tries to access the modem while it is still powering up and initializing itself. --Pekka ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv2 1/2] mbm: fix initial polling for sim 2010-08-23 14:18 [PATCHv2 0/2] Robustness fixes for mbm Pekka.Pessi @ 2010-08-23 14:18 ` Pekka.Pessi 2010-08-23 14:18 ` [PATCHv2 2/2] mbm: retry modem init Pekka.Pessi 2010-08-23 14:32 ` [PATCHv2 1/2] mbm: fix initial polling for sim Marcel Holtmann 0 siblings, 2 replies; 6+ messages in thread From: Pekka.Pessi @ 2010-08-23 14:18 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 1234 bytes --] From: Pekka Pessi <Pekka.Pessi@nokia.com> There seems to be no specific error codes returned when SIM is missing. Poll at least 5 times upon an error and give up after that. --- plugins/mbm.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/mbm.c b/plugins/mbm.c index eb7b1a4..8541aaf 100644 --- a/plugins/mbm.c +++ b/plugins/mbm.c @@ -108,10 +108,8 @@ static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data) DBG(""); - /* 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) { + /* Modem returns an error if SIM is not ready. */ + if (!ok && data->cpin_poll_count++ < 5) { data->cpin_poll_source = g_timeout_add_seconds(1, init_simpin_check, modem); return; @@ -119,7 +117,7 @@ static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data) data->cpin_poll_count = 0; - /* Modem returns ERROR if there is no SIM in slot. */ + /* There is probably no SIM if SIM is not ready after 5 seconds. */ data->have_sim = ok; ofono_modem_set_powered(modem, TRUE); -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCHv2 2/2] mbm: retry modem init 2010-08-23 14:18 ` [PATCHv2 1/2] mbm: fix initial polling for sim Pekka.Pessi @ 2010-08-23 14:18 ` Pekka.Pessi 2010-08-23 14:34 ` Marcel Holtmann 2010-08-23 14:32 ` [PATCHv2 1/2] mbm: fix initial polling for sim Marcel Holtmann 1 sibling, 1 reply; 6+ messages in thread From: Pekka.Pessi @ 2010-08-23 14:18 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 3939 bytes --] From: Pekka Pessi <Pekka.Pessi@nokia.com> If the first initialization command results are catastrophic. Retry it 10 times and refuse to enable modem if it still fails. --- plugins/mbm.c | 75 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 58 insertions(+), 17 deletions(-) diff --git a/plugins/mbm.c b/plugins/mbm.c index 8541aaf..753a4f1 100644 --- a/plugins/mbm.c +++ b/plugins/mbm.c @@ -55,8 +55,8 @@ static const char *none_prefix[] = { NULL }; struct mbm_data { GAtChat *modem_port; GAtChat *data_port; - guint cpin_poll_source; - guint cpin_poll_count; + guint poll_source; + guint poll_count; gboolean have_sim; }; @@ -86,8 +86,8 @@ static void mbm_remove(struct ofono_modem *modem) g_at_chat_unref(data->data_port); g_at_chat_unref(data->modem_port); - if (data->cpin_poll_source > 0) - g_source_remove(data->cpin_poll_source); + if (data->poll_source > 0) + g_source_remove(data->poll_source); g_free(data); } @@ -109,13 +109,13 @@ static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data) DBG(""); /* Modem returns an error if SIM is not ready. */ - if (!ok && data->cpin_poll_count++ < 5) { - data->cpin_poll_source = + if (!ok && data->poll_count++ < 5) { + data->poll_source = g_timeout_add_seconds(1, init_simpin_check, modem); return; } - data->cpin_poll_count = 0; + data->poll_count = 0; /* There is probably no SIM if SIM is not ready after 5 seconds. */ data->have_sim = ok; @@ -128,7 +128,7 @@ static gboolean init_simpin_check(gpointer user_data) struct ofono_modem *modem = user_data; struct mbm_data *data = ofono_modem_get_data(modem); - data->cpin_poll_source = 0; + data->poll_source = 0; g_at_chat_send(data->modem_port, "AT+CPIN?", cpin_prefix, simpin_check, modem, NULL); @@ -220,6 +220,55 @@ static void emrdy_query(gboolean ok, GAtResult *result, gpointer user_data) cfun_query, modem, NULL); }; +static gboolean init_check(gpointer user_data); + +static void init_result(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct mbm_data *data = ofono_modem_get_data(modem); + + DBG(""); + + if (!ok && data->poll_count++ < 10) { + data->poll_source = g_timeout_add_seconds(1, init_check, modem); + return; + } + + data->poll_count = 0; + + if (!ok) { + g_at_chat_unref(data->modem_port); + data->modem_port = NULL; + + g_at_chat_unref(data->data_port); + data->data_port = NULL; + + ofono_modem_set_powered(modem, FALSE); + return; + } + + g_at_chat_register(data->modem_port, "*EMRDY:", emrdy_notifier, + FALSE, modem, NULL); + + g_at_chat_send(data->modem_port, "AT*E2CFUN=1", none_prefix, + NULL, NULL, NULL); + g_at_chat_send(data->modem_port, "AT*EMRDY?", none_prefix, + emrdy_query, modem, NULL); +} + +static gboolean init_check(gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct mbm_data *data = ofono_modem_get_data(modem); + + data->poll_source = 0; + + g_at_chat_send(data->modem_port, "AT&F E0 V1 X4 &C1 +CMEE=1", NULL, + init_result, modem, NULL); + + return FALSE; +} + static GAtChat *create_port(const char *device) { GAtSyntax *syntax; @@ -277,15 +326,7 @@ static int mbm_enable(struct ofono_modem *modem) if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(data->data_port, mbm_debug, "Data:"); - g_at_chat_register(data->modem_port, "*EMRDY:", emrdy_notifier, - FALSE, modem, NULL); - - g_at_chat_send(data->modem_port, "AT&F E0 V1 X4 &C1 +CMEE=1", NULL, - NULL, NULL, NULL); - g_at_chat_send(data->modem_port, "AT*E2CFUN=1", none_prefix, - NULL, NULL, NULL); - g_at_chat_send(data->modem_port, "AT*EMRDY?", none_prefix, - emrdy_query, modem, NULL); + init_check(modem); return -EINPROGRESS; } -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCHv2 2/2] mbm: retry modem init 2010-08-23 14:18 ` [PATCHv2 2/2] mbm: retry modem init Pekka.Pessi @ 2010-08-23 14:34 ` Marcel Holtmann 2010-08-23 16:31 ` Pekka Pessi 0 siblings, 1 reply; 6+ messages in thread From: Marcel Holtmann @ 2010-08-23 14:34 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 4409 bytes --] Hi Pekka, > If the first initialization command results are catastrophic. Retry it > 10 times and refuse to enable modem if it still fails. > --- > plugins/mbm.c | 75 ++++++++++++++++++++++++++++++++++++++++++++------------- > 1 files changed, 58 insertions(+), 17 deletions(-) > > diff --git a/plugins/mbm.c b/plugins/mbm.c > index 8541aaf..753a4f1 100644 > --- a/plugins/mbm.c > +++ b/plugins/mbm.c > @@ -55,8 +55,8 @@ static const char *none_prefix[] = { NULL }; > struct mbm_data { > GAtChat *modem_port; > GAtChat *data_port; > - guint cpin_poll_source; > - guint cpin_poll_count; > + guint poll_source; > + guint poll_count; > gboolean have_sim; > }; > > @@ -86,8 +86,8 @@ static void mbm_remove(struct ofono_modem *modem) > g_at_chat_unref(data->data_port); > g_at_chat_unref(data->modem_port); > > - if (data->cpin_poll_source > 0) > - g_source_remove(data->cpin_poll_source); > + if (data->poll_source > 0) > + g_source_remove(data->poll_source); > > g_free(data); > } > @@ -109,13 +109,13 @@ static void simpin_check(gboolean ok, GAtResult *result, gpointer user_data) > DBG(""); > > /* Modem returns an error if SIM is not ready. */ > - if (!ok && data->cpin_poll_count++ < 5) { > - data->cpin_poll_source = > + if (!ok && data->poll_count++ < 5) { > + data->poll_source = > g_timeout_add_seconds(1, init_simpin_check, modem); > return; > } > > - data->cpin_poll_count = 0; > + data->poll_count = 0; > > /* There is probably no SIM if SIM is not ready after 5 seconds. */ > data->have_sim = ok; > @@ -128,7 +128,7 @@ static gboolean init_simpin_check(gpointer user_data) > struct ofono_modem *modem = user_data; > struct mbm_data *data = ofono_modem_get_data(modem); > > - data->cpin_poll_source = 0; > + data->poll_source = 0; > > g_at_chat_send(data->modem_port, "AT+CPIN?", cpin_prefix, > simpin_check, modem, NULL); > @@ -220,6 +220,55 @@ static void emrdy_query(gboolean ok, GAtResult *result, gpointer user_data) > cfun_query, modem, NULL); > }; > > +static gboolean init_check(gpointer user_data); > + > +static void init_result(gboolean ok, GAtResult *result, gpointer user_data) > +{ > + struct ofono_modem *modem = user_data; > + struct mbm_data *data = ofono_modem_get_data(modem); > + > + DBG(""); > + > + if (!ok && data->poll_count++ < 10) { > + data->poll_source = g_timeout_add_seconds(1, init_check, modem); > + return; > + } > + > + data->poll_count = 0; > + > + if (!ok) { > + g_at_chat_unref(data->modem_port); > + data->modem_port = NULL; > + > + g_at_chat_unref(data->data_port); > + data->data_port = NULL; > + > + ofono_modem_set_powered(modem, FALSE); > + return; > + } > + > + g_at_chat_register(data->modem_port, "*EMRDY:", emrdy_notifier, > + FALSE, modem, NULL); > + > + g_at_chat_send(data->modem_port, "AT*E2CFUN=1", none_prefix, > + NULL, NULL, NULL); > + g_at_chat_send(data->modem_port, "AT*EMRDY?", none_prefix, > + emrdy_query, modem, NULL); > +} > + > +static gboolean init_check(gpointer user_data) > +{ > + struct ofono_modem *modem = user_data; > + struct mbm_data *data = ofono_modem_get_data(modem); > + > + data->poll_source = 0; > + > + g_at_chat_send(data->modem_port, "AT&F E0 V1 X4 &C1 +CMEE=1", NULL, > + init_result, modem, NULL); > + > + return FALSE; > +} > + > static GAtChat *create_port(const char *device) > { > GAtSyntax *syntax; > @@ -277,15 +326,7 @@ static int mbm_enable(struct ofono_modem *modem) > if (getenv("OFONO_AT_DEBUG")) > g_at_chat_set_debug(data->data_port, mbm_debug, "Data:"); > > - g_at_chat_register(data->modem_port, "*EMRDY:", emrdy_notifier, > - FALSE, modem, NULL); > - > - g_at_chat_send(data->modem_port, "AT&F E0 V1 X4 &C1 +CMEE=1", NULL, > - NULL, NULL, NULL); > - g_at_chat_send(data->modem_port, "AT*E2CFUN=1", none_prefix, > - NULL, NULL, NULL); > - g_at_chat_send(data->modem_port, "AT*EMRDY?", none_prefix, > - emrdy_query, modem, NULL); > + init_check(modem); don't you think we should leave the EMRDY notifier in the mbm_enable callback. I don't think it is a good idea to register more than one of these. Can the AT&F line really fail? Or can we just assume that one will just work fine and not try to send it again. Regards Marcel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCHv2 2/2] mbm: retry modem init 2010-08-23 14:34 ` Marcel Holtmann @ 2010-08-23 16:31 ` Pekka Pessi 0 siblings, 0 replies; 6+ messages in thread From: Pekka Pessi @ 2010-08-23 16:31 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 1226 bytes --] Hi Marcel, > don't you think we should leave the EMRDY notifier in the mbm_enable > callback. I don't think it is a good idea to register more than one of > these. I think it is registered only once? Ooops... > Can the AT&F line really fail? Or can we just assume that one will just > work fine and not try to send it again. Oh yes, it will. With connmand I get this kind of AT debug trace about 4 times of 5: ofonod[3729]: Modem: > AT&F E0 V1 X4 &C1 +CMEE=1\r ofonod[3729]: Modem: < AT&F E0 V1 X4 &C1 +CMEE=1\r\r\nNO CARRIER\r\n ofonod[3729]: Modem: > AT*E2CFUN=1\r ofonod[3729]: Modem: < AT*E2CFUN=1\r\r\nERROR\r\n ofonod[3729]: Modem: > AT*EMRDY?\r ofonod[3729]: Modem: < AT*EMRDY?\r\r\nERROR\r\n ofonod[3729]: plugins/mbm.c:emrdy_query() 0 ofonod[3729]: Modem: > AT+CFUN?\r ofonod[3729]: Modem: < AT+CFUN?\r ofonod[3729]: Modem: < \r\n+CFUN: 4\r\n\r\nOK\r\n ofonod[3729]: plugins/mbm.c:cfun_query() 1 ofonod[3729]: Modem: > AT+CFUN=1\r ofonod[3729]: Modem: < AT+CFUN=1\r ofonod[3729]: Modem: < \r\nOK\r\n ofonod[3729]: plugins/mbm.c:cfun_enable() ofonod[3729]: Modem: > AT+CPIN?\r ofonod[3729]: Modem: < AT+CPIN?\r ofonod[3729]: Modem: < \r\nERROR\r\n -- Pekka.Pessi mail@nokia.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCHv2 1/2] mbm: fix initial polling for sim 2010-08-23 14:18 ` [PATCHv2 1/2] mbm: fix initial polling for sim Pekka.Pessi 2010-08-23 14:18 ` [PATCHv2 2/2] mbm: retry modem init Pekka.Pessi @ 2010-08-23 14:32 ` Marcel Holtmann 1 sibling, 0 replies; 6+ messages in thread From: Marcel Holtmann @ 2010-08-23 14:32 UTC (permalink / raw) To: ofono [-- Attachment #1: Type: text/plain, Size: 323 bytes --] Hi Pekka, > There seems to be no specific error codes returned when SIM is missing. > Poll at least 5 times upon an error and give up after that. > --- > plugins/mbm.c | 8 +++----- > 1 files changed, 3 insertions(+), 5 deletions(-) looks good to me. Patch has been applied. Thanks. Regards Marcel ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-08-23 16:31 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-08-23 14:18 [PATCHv2 0/2] Robustness fixes for mbm Pekka.Pessi 2010-08-23 14:18 ` [PATCHv2 1/2] mbm: fix initial polling for sim Pekka.Pessi 2010-08-23 14:18 ` [PATCHv2 2/2] mbm: retry modem init Pekka.Pessi 2010-08-23 14:34 ` Marcel Holtmann 2010-08-23 16:31 ` Pekka Pessi 2010-08-23 14:32 ` [PATCHv2 1/2] mbm: fix initial polling for sim Marcel Holtmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox