All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] ifx: Adding modem selftest to Infineon modem
@ 2010-12-18  1:51 Robertino Benis
  2010-12-18 18:25 ` Marcel Holtmann
  0 siblings, 1 reply; 4+ messages in thread
From: Robertino Benis @ 2010-12-18  1:51 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 3999 bytes --]

Hi all,

This is a second attempt to submit a patch that triggers Infineon
modem selftest during ofono boot. Patch addresses issues raised
by Marcel from the previous submission.

Thank you,
-- r.


---
 plugins/ifx.c |   87 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 81 insertions(+), 6 deletions(-)

diff --git a/plugins/ifx.c b/plugins/ifx.c
index 2f4c65b..3647dbc 100644
--- a/plugins/ifx.c
+++ b/plugins/ifx.c
@@ -71,6 +71,8 @@
 #define GPRS3_DLC   4
 #define AUX_DLC     5
 
+#define IFX_SELF_TESTS_TIMEOUT	5
+
 static char *dlc_prefixes[NUM_DLC] = { "Voice: ", "Net: ", "GPRS1: ",
 					"GPRS2: ", "GPRS3: ", "Aux: " };
 
@@ -80,6 +82,18 @@ static const char *dlc_nodes[NUM_DLC] = { "/dev/ttyGSM1", "/dev/ttyGSM2",
 
 static const char *none_prefix[] = { NULL };
 static const char *xdrv_prefix[] = { "+XDRV:", NULL };
+static const char *empty_prefix[] = { "", NULL };
+
+struct ifx_self_tests {
+	char *test_desc;
+	char *at_cmd;
+};
+
+static const struct ifx_self_tests mst[] = {
+		{ "RTC GTI Test", "at(a)rtc:rtc_gti_test_verify_32khz()" },
+		{ "Device Version Test", "at(a)vers:device_version_id()" },
+		{ NULL, NULL }
+};
 
 struct ifx_data {
 	GIOChannel *device;
@@ -99,6 +113,8 @@ struct ifx_data {
 	int audio_loopback;
 	struct ofono_sim *sim;
 	gboolean have_sim;
+	guint self_test_timeout;
+	int self_test_idx;
 };
 
 static void ifx_debug(const char *str, void *user_data)
@@ -545,6 +561,64 @@ static gboolean mux_timeout_cb(gpointer user_data)
 	return FALSE;
 }
 
+static gboolean self_test_timeout_cb(gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct ifx_data *data = ofono_modem_get_data(modem);
+
+	ofono_error("Modem %s: TIMED OUT",
+			mst[data->self_test_idx].test_desc);
+
+	g_source_remove(data->self_test_timeout);
+	data->self_test_timeout = 0;
+
+	shutdown_device(data);
+	ofono_modem_set_powered(modem, FALSE);
+
+	return FALSE;
+}
+
+static void ifx_self_test_cb(gboolean ok, GAtResult *result,
+				gpointer user_data)
+{
+	struct ofono_modem *modem = user_data;
+	struct ifx_data *data = ofono_modem_get_data(modem);
+
+	if (data->self_test_timeout > 0) {
+		g_source_remove(data->self_test_timeout);
+		data->self_test_timeout = 0;
+	}
+
+	if (!ok) {
+		ofono_error("Modem %s: FAIL",
+			mst[data->self_test_idx].test_desc);
+		shutdown_device(data);
+		ofono_modem_set_powered(modem, FALSE);
+
+		return;
+	}
+
+	data->self_test_idx++;
+
+	if (mst[data->self_test_idx].at_cmd != NULL) {
+		g_at_chat_send(data->dlcs[AUX_DLC],
+			mst[data->self_test_idx].at_cmd,
+			empty_prefix, ifx_self_test_cb, modem, NULL);
+
+		data->self_test_timeout = g_timeout_add_seconds(
+			IFX_SELF_TESTS_TIMEOUT, self_test_timeout_cb, modem);
+
+	} else {	/* Enable  MUX Channels */
+		data->frame_size = 1509;
+		g_at_chat_send(data->dlcs[AUX_DLC],
+				"AT+CMUX=0,0,,1509,10,3,30,,", NULL,
+				mux_setup_cb, modem, NULL);
+
+		data->mux_init_timeout = g_timeout_add_seconds(5,
+				mux_timeout_cb,	modem);
+	}
+}
+
 static int ifx_enable(struct ofono_modem *modem)
 {
 	struct ifx_data *data = ofono_modem_get_data(modem);
@@ -598,15 +672,16 @@ static int ifx_enable(struct ofono_modem *modem)
 	g_at_chat_send(chat, "ATE0 +CMEE=1", NULL,
 					NULL, NULL, NULL);
 
-	data->frame_size = 1509;
+	/* Execute Modem Self tests */
 
-	g_at_chat_send(chat, "AT+CMUX=0,0,,1509,10,3,30,,", NULL,
-					mux_setup_cb, modem, NULL);
+	data->dlcs[AUX_DLC] = chat;
+	data->self_test_idx = 0;
 
-	data->mux_init_timeout = g_timeout_add_seconds(5, mux_timeout_cb,
-								modem);
+	g_at_chat_send(data->dlcs[AUX_DLC], mst[data->self_test_idx].at_cmd,
+		empty_prefix, ifx_self_test_cb, modem, NULL);
 
-	data->dlcs[AUX_DLC] = chat;
+	data->self_test_timeout = g_timeout_add_seconds(IFX_SELF_TESTS_TIMEOUT,
+				self_test_timeout_cb,	modem);
 
 	return -EINPROGRESS;
 }
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] ifx: Adding modem selftest to Infineon modem
  2010-12-18  1:51 [PATCH v2] ifx: Adding modem selftest to Infineon modem Robertino Benis
@ 2010-12-18 18:25 ` Marcel Holtmann
  2010-12-18 19:58   ` Bastian, Waldo
  0 siblings, 1 reply; 4+ messages in thread
From: Marcel Holtmann @ 2010-12-18 18:25 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2436 bytes --]

Hi Robertino,

> diff --git a/plugins/ifx.c b/plugins/ifx.c
> index 2f4c65b..3647dbc 100644
> --- a/plugins/ifx.c
> +++ b/plugins/ifx.c
> @@ -71,6 +71,8 @@
>  #define GPRS3_DLC   4
>  #define AUX_DLC     5
>  
> +#define IFX_SELF_TESTS_TIMEOUT	5
> +

this is not what I meant actually. Adding a comment for the
g_timeout_add_seconds is just fine.

What I wanted to know is where the actual value came from. Is 5 seconds
enough? How do we know the time a test takes?

>  static char *dlc_prefixes[NUM_DLC] = { "Voice: ", "Net: ", "GPRS1: ",
>  					"GPRS2: ", "GPRS3: ", "Aux: " };
>  
> @@ -80,6 +82,18 @@ static const char *dlc_nodes[NUM_DLC] = { "/dev/ttyGSM1", "/dev/ttyGSM2",
>  
>  static const char *none_prefix[] = { NULL };
>  static const char *xdrv_prefix[] = { "+XDRV:", NULL };
> +static const char *empty_prefix[] = { "", NULL };

This is still wrong. See my comment from the original email. I am not
sure you really know what { "", NULL } means.

> +struct ifx_self_tests {
> +	char *test_desc;
> +	char *at_cmd;
> +};
> +
> +static const struct ifx_self_tests mst[] = {
> +		{ "RTC GTI Test", "at(a)rtc:rtc_gti_test_verify_32khz()" },
> +		{ "Device Version Test", "at(a)vers:device_version_id()" },
> +		{ NULL, NULL }
> +};

No need to declare the struct before assigning it. Just do it all in
once. And fix up the indentation for the values. Just one tab please.
 
>  struct ifx_data {
>  	GIOChannel *device;
> @@ -99,6 +113,8 @@ struct ifx_data {
>  	int audio_loopback;
>  	struct ofono_sim *sim;
>  	gboolean have_sim;
> +	guint self_test_timeout;
> +	int self_test_idx;
>  };
>  
>  static void ifx_debug(const char *str, void *user_data)
> @@ -545,6 +561,64 @@ static gboolean mux_timeout_cb(gpointer user_data)
>  	return FALSE;
>  }
>  
> +static gboolean self_test_timeout_cb(gpointer user_data)
> +{
> +	struct ofono_modem *modem = user_data;
> +	struct ifx_data *data = ofono_modem_get_data(modem);
> +
> +	ofono_error("Modem %s: TIMED OUT",
> +			mst[data->self_test_idx].test_desc);
> +
> +	g_source_remove(data->self_test_timeout);
> +	data->self_test_timeout = 0;
> +
> +	shutdown_device(data);
> +	ofono_modem_set_powered(modem, FALSE);
> +
> +	return FALSE;
> +}

I am stopping right here now actually. Please fix my review comments
from the initial review as well. This function is still broken.

Regards

Marcel



^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: [PATCH v2] ifx: Adding modem selftest to Infineon modem
  2010-12-18 18:25 ` Marcel Holtmann
@ 2010-12-18 19:58   ` Bastian, Waldo
  2010-12-18 20:48     ` Denis Kenzior
  0 siblings, 1 reply; 4+ messages in thread
From: Bastian, Waldo @ 2010-12-18 19:58 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 903 bytes --]

> > @@ -80,6 +82,18 @@ static const char *dlc_nodes[NUM_DLC] = { "/dev/ttyGSM1", "/dev/ttyGSM2",
> >  
> >  static const char *none_prefix[] = { NULL };
> >  static const char *xdrv_prefix[] = { "+XDRV:", NULL };
> > +static const char *empty_prefix[] = { "", NULL };
> 
> This is still wrong. See my comment from the original email. I am not
> sure you really know what { "", NULL } means.

The response doesn't really have a proper prefix (see example below), this way the entire response ends up in the callback. Is there a better way? Given that there aren't any URC registered yet, it will not interfere with any other response. It's obviously not a good idea to use it once the modem is powered up.

at(a)vers:device_version_id()
CHIP ID = XXX
FLASH TYPE = YYY
FLASH ID = 0x898881
SmartiUE2 = 37664
RF PMU = 10548
PA PMU = 40244
RF ASM = 0
FEM PA = 21812
OK

Cheers,
Waldo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] ifx: Adding modem selftest to Infineon modem
  2010-12-18 19:58   ` Bastian, Waldo
@ 2010-12-18 20:48     ` Denis Kenzior
  0 siblings, 0 replies; 4+ messages in thread
From: Denis Kenzior @ 2010-12-18 20:48 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 872 bytes --]

Hi Waldo,

On 12/18/2010 01:58 PM, Bastian, Waldo wrote:
>>> @@ -80,6 +82,18 @@ static const char *dlc_nodes[NUM_DLC] = { "/dev/ttyGSM1", "/dev/ttyGSM2",
>>>  
>>>  static const char *none_prefix[] = { NULL };
>>>  static const char *xdrv_prefix[] = { "+XDRV:", NULL };
>>> +static const char *empty_prefix[] = { "", NULL };
>>
>> This is still wrong. See my comment from the original email. I am not
>> sure you really know what { "", NULL } means.
> 
> The response doesn't really have a proper prefix (see example below), this way the entire response ends up in the callback. Is there a better way? Given that there aren't any URC registered yet, it will not interfere with any other response. It's obviously not a good idea to use it once the modem is powered up.
> 

Then simply passing NULL instead of empty_prefix is sufficient.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-12-18 20:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-18  1:51 [PATCH v2] ifx: Adding modem selftest to Infineon modem Robertino Benis
2010-12-18 18:25 ` Marcel Holtmann
2010-12-18 19:58   ` Bastian, Waldo
2010-12-18 20:48     ` Denis Kenzior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.