r2131 - trunk/src/target/gsm/src/gsmd

laforge at sita.openmoko.org laforge at sita.openmoko.org
Sat Jun 2 16:00:29 CEST 2007


Author: laforge
Date: 2007-06-02 16:00:28 +0200 (Sat, 02 Jun 2007)
New Revision: 2131

Modified:
   trunk/src/target/gsm/src/gsmd/gsmd.c
Log:
* add timeout to initial modem detection
* make sure we only fork into background after the modem has been detected
* clean up the loglevel of some log statements


Modified: trunk/src/target/gsm/src/gsmd/gsmd.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/gsmd.c	2007-06-02 13:45:46 UTC (rev 2130)
+++ trunk/src/target/gsm/src/gsmd/gsmd.c	2007-06-02 14:00:28 UTC (rev 2131)
@@ -48,6 +48,9 @@
 #define GSMD_ALIVE_INTERVAL	5*60
 #define GSMD_ALIVE_TIMEOUT	30
 
+static struct gsmd g;
+static int daemonize = 0;
+
 /* alive checking */
 
 struct gsmd_alive_priv {
@@ -59,11 +62,8 @@
 {
 	struct gsmd_alive_priv *alp = ctx;
 
-	DEBUGP("alp=%p - `%s' returned `%s'\n", alp, cmd->buf, resp);
-	if (!strcmp(resp, "OK")) {
-		DEBUGP("`%s' returned `%s': OK\n", cmd->buf, resp);
+	if (!strcmp(resp, "OK"))
 		alp->alive_responded = 1;
-	}
 	return 0;
 }
 
@@ -71,13 +71,13 @@
 {
 	struct gsmd_alive_priv *alp = data;
 
-	DEBUGP("alp=%p gsmd_alive timer expired\n", alp);
+	DEBUGP("gsmd_alive timer expired\n", alp);
 
 	if (alp->alive_responded == 0) {
-		DEBUGP("modem dead!\n");
+		gsmd_log(GSMD_FATAL, "modem dead!\n");
 		exit(3);
 	} else
-		DEBUGP("modem alive!\n");
+		gsmd_log(GSMD_INFO, "modem alive!\n");
 
 	/* FIXME: update some global state */
 
@@ -98,7 +98,6 @@
 	alp->gsmd = gsmd;
 	alp->alive_responded = 0;
 
-	tv.tv_sec = GSMD_ALIVE_TIMEOUT;
 	cmd = atcmd_fill(GSMD_ALIVECMD, strlen(GSMD_ALIVECMD)+1, 
 			 &gsmd_alive_cb, alp, 0);
 	if (!cmd) {
@@ -106,6 +105,7 @@
 		return -ENOMEM;
 	}
 
+	tv.tv_sec = GSMD_ALIVE_TIMEOUT;
 	tv.tv_usec = 0;
 	gsmd_timer_create(&tv, &alive_tmr_cb, alp);
 	
@@ -194,25 +194,55 @@
 		return rc;
 }
 
+static int firstcmd_response = 0;
+
 /* we submit the first atcmd and wait synchronously for a valid response */
 static int firstcmd_atcb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
 {
 	struct gsmd *gsmd = ctx;
-	DEBUGP("`%s' returned `%s'\n", cmd->buf, resp);
+
 	if (strcmp(resp, "OK")) {
-		fprintf(stderr, "response '%s' to initial command invalid", resp);
-		exit(1);
+		gsmd_log(GSMD_FATAL, "response '%s' to initial command invalid", resp);
+		exit(5);
 	}
+
+	firstcmd_response = 1;
+
+	if (daemonize) {
+		if (fork()) {
+			exit(0);
+		}
+		fclose(stdout);
+		fclose(stderr);
+		fclose(stdin);
+		setsid();
+	}
+
 	return gsmd_initsettings2(gsmd);
 }
 
+static void firstcmd_tmr_cb(struct gsmd_timer *tmr, void *data)
+{
+	if (firstcmd_response == 0) {
+		gsmd_log(GSMD_FATAL, "No response from GSM Modem");
+		exit(4);
+	}
+	gsmd_timer_free(tmr);
+}
+
 int gsmd_initsettings(struct gsmd *gsmd)
 {
 	struct gsmd_atcmd *cmd;
+	struct timeval tv;
+
 	cmd = atcmd_fill("ATE0V1", strlen("ATE0V1")+1, &firstcmd_atcb, gsmd, 0);
 	if (!cmd)
 		return -ENOMEM;
 	
+	tv.tv_sec = GSMD_ALIVE_TIMEOUT;
+	tv.tv_usec = 0;
+	gsmd_timer_create(&tv, &firstcmd_tmr_cb, NULL);
+
 	return atcmd_submit(gsmd, cmd);
 }
 
@@ -263,9 +293,6 @@
 	return tcsetattr(fd, 0, &ti);
 }
 
-
-static struct gsmd g;
-
 static int gsmd_initialize(struct gsmd *g)
 {
 	INIT_LLIST_HEAD(&g->users);
@@ -329,7 +356,6 @@
 {
 	int fd, argch; 
 
-	int daemonize = 0;
 	int bps = 115200;
 	int hwflow = 0;
 	char *device = NULL;
@@ -440,16 +466,6 @@
 		exit(1);
 	}
 
-	if (daemonize) {
-		if (fork()) {
-			exit(0);
-		}
-		fclose(stdout);
-		fclose(stderr);
-		fclose(stdin);
-		setsid();
-	}
-
 	/* select a vendor plugin */
 	gsmd_vendor_plugin_find(&g);
 





More information about the commitlog mailing list