[svn-commits] sruffell: linux/trunk r9902 - /linux/trunk/drivers/dahdi/wcte12xp/base.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Apr 14 14:11:16 CDT 2011


Author: sruffell
Date: Thu Apr 14 14:11:14 2011
New Revision: 9902

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9902
Log:
wcte12xp: If we cannot read the mode selection pins fail the module load.

Alexandre reported that on a particular server he would get a server
crash when loading the wcte12xp driver after receiving a line about a
timeout when trying to read the mode selection jumpers.

If the driver times out when trying to read the mode selection bits
there is a serious problem and it should not try to continue on with
configuration / registration.

Reported-and-Tested-by: Alexandre Abreu <alexandre.abreu at redt.com.br>
Signed-off-by: Shaun Ruffell <sruffell at digium.com>

Modified:
    linux/trunk/drivers/dahdi/wcte12xp/base.c

Modified: linux/trunk/drivers/dahdi/wcte12xp/base.c
URL: http://svnview.digium.com/svn/dahdi/linux/trunk/drivers/dahdi/wcte12xp/base.c?view=diff&rev=9902&r1=9901&r2=9902
==============================================================================
--- linux/trunk/drivers/dahdi/wcte12xp/base.c (original)
+++ linux/trunk/drivers/dahdi/wcte12xp/base.c Thu Apr 14 14:11:14 2011
@@ -600,11 +600,21 @@
 	submit_cmd(wc, cmd);
 }
 
-static inline int t1_getpins(struct t1 *wc, int inisr)
+/**
+ * t1_getpins - Returns the value of the jumpers on the card.
+ * @wc:	The card to read from.
+ * @pins: Pointer to u8 character to hold the pins value.
+ *
+ * Returns 0 on success, otherwise an error code.
+ *
+ */
+static int t1_getpins(struct t1 *wc, u8 *pins)
 {
 	struct command *cmd;
 	unsigned long flags;
 	unsigned long ret;
+
+	*pins = 0;
 
 	cmd = get_free_cmd(wc);
 	BUG_ON(!cmd);
@@ -628,9 +638,9 @@
 		}
 		return ret;
 	}
-	ret = cmd->data;
+	*pins = cmd->data;
 	free_cmd(wc, cmd);
-	return ret;
+	return 0;
 }
 
 static void __t1xxp_set_clear(struct t1 *wc)
@@ -1597,6 +1607,7 @@
 
 static int t1_hardware_post_init(struct t1 *wc)
 {
+	int res;
 	unsigned int reg;
 	int x;
 
@@ -1607,10 +1618,12 @@
 		else
 			wc->spantype = TYPE_T1;
 	} else {
-		if (t1_getpins(wc,0) & 0x01) /* returns 1 for T1 mode */
-			wc->spantype = TYPE_T1;
-		else	
-			wc->spantype = TYPE_E1;
+		u8 pins;
+		res = t1_getpins(wc, &pins);
+		if (res)
+			return res;
+
+		wc->spantype = (pins & 0x01) ? TYPE_T1 : TYPE_E1;
 	}
 	debug_printk(wc, 1, "spantype: %s\n", 1 == wc->spantype ? "T1" : "E1");
 	
@@ -2323,7 +2336,13 @@
 		free_wc(wc);
 		return -EIO;
 	}
-	t1_hardware_post_init(wc);
+
+	res = t1_hardware_post_init(wc);
+	if (res) {
+		voicebus_release(&wc->vb);
+		free_wc(wc);
+		return res;
+	}
 
 	for (x = 0; x < (wc->spantype == TYPE_E1 ? 31 : 24); x++) {
 		if (!(wc->chans[x] = kmalloc(sizeof(*wc->chans[x]), GFP_KERNEL))) {




More information about the svn-commits mailing list