[zaptel-commits] tzafrir: trunk r1680 - in /trunk/xpp: ./ utils/

zaptel-commits at lists.digium.com zaptel-commits at lists.digium.com
Thu Nov 30 22:22:55 MST 2006


Author: tzafrir
Date: Thu Nov 30 23:22:55 2006
New Revision: 1680

URL: http://svn.digium.com/view/zaptel?view=rev&rev=1680
Log:
Merging from 1.2:
* Removing -DSOFT_RING: unused, useless code.
* Register init scripts are not as noisy by default.
* Register init scripts read configuration from a standard location.
* Fixed a FXO spinlock race.
(Log was lost on previos merge)

Modified:
    trunk/xpp/   (props changed)
    trunk/xpp/Makefile
    trunk/xpp/README.Astribank
    trunk/xpp/calibrate_slics
    trunk/xpp/card_fxo.c
    trunk/xpp/card_fxs.c
    trunk/xpp/card_global.c
    trunk/xpp/init_card_3_23
    trunk/xpp/init_card_4_23
    trunk/xpp/utils/Makefile
    trunk/xpp/xbus-core.c

Propchange: trunk/xpp/
------------------------------------------------------------------------------
--- svk:merge (original)
+++ svk:merge Thu Nov 30 23:22:55 2006
@@ -1,3 +1,7 @@
+283159da-0705-0410-b60c-f2062b4bb6ad:/components/xpp-zaptel/branches/RELEASE-1.2.0/xpp:2817
 283159da-0705-0410-b60c-f2062b4bb6ad:/components/xpp-zaptel/trunk/xpp:2600
-f558416c-6c06-0410-9f27-dde2687782d0:/branches/1.4/xpp:1590
+
+f558416c-6c06-0410-9f27-dde2687782d0:/branches/1.2/xpp:1666
+f558416c-6c06-0410-9f27-dde2687782d0:/branches/1.4/xpp:1674
+
 f558416c-6c06-0410-9f27-dde2687782d0:/team/tzafrir/xpp_1.2/xpp:1554

Propchange: trunk/xpp/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Thu Nov 30 23:22:55 2006
@@ -3,6 +3,5 @@
 *.o.cmd
 *.ko.cmd
 *.mod.c
-*.o
 .tmp_versions
 .*.swp

Modified: trunk/xpp/Makefile
URL: http://svn.digium.com/view/zaptel/trunk/xpp/Makefile?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/Makefile (original)
+++ trunk/xpp/Makefile Thu Nov 30 23:22:55 2006
@@ -1,4 +1,4 @@
-EXTRA_CFLAGS	= -g3 -I$(SUBDIRS) -DDEBUG -DPOLL_DIGITAL_INPUTS -DWITH_ECHO_SUPPRESSION # -DSOFT_RING
+EXTRA_CFLAGS	= -g3 -I$(SUBDIRS) -DDEBUG -DPOLL_DIGITAL_INPUTS -DWITH_ECHO_SUPPRESSION
 
 obj-m		+= xpp.o xpd_fxs.o xpd_fxo.o
 

Modified: trunk/xpp/README.Astribank
URL: http://svn.digium.com/view/zaptel/trunk/xpp/README.Astribank?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/README.Astribank (original)
+++ trunk/xpp/README.Astribank Thu Nov 30 23:22:55 2006
@@ -329,6 +329,34 @@
 (There are a bunch of other status files under /proc/xpp/ )
 
 
+Zaptel Init Configuration File
+""""""""""""""""""""""""""""""
+The zaptel init.d script, genzaptelconf and the XPD init scripts source 
+the file /etc/init.d/zaptel (on Debian) or /etc/sysconfig/zaptel (on 
+RedHats). A number of useful values for there:
+
+############################### 
+# Lines beginning with '#' are considered comments and ignored.
+
+# A two-letter country code. genzaptelconf uses it to better guess 
+# the configuration it generates. E.g: the signalling of E1 spans, and 
+# a few other country-specific settings.
+lc_country=us
+
+# See genzaptelconf(8) and the script itself for a longer list of 
+# variables.
+
+# Equivalent to the parameter opermode to the module wctdm: country-specific
+# settings to the FXO lines. For a complete list of possible values, see
+# /usr/share/zaptel/init_fxo_mode .
+#opermode=FCC
+#opermode=FRANCE
+
+# If you feel like flooding your logs with debug output of the calibration 
+# process:
+#DEBUG_CALIBRATION=1
+###############################
+
 Useful Module Parameters:
 """"""""""""""""""""""""
 zap_autoreg: (xpp)

Modified: trunk/xpp/calibrate_slics
URL: http://svn.digium.com/view/zaptel/trunk/xpp/calibrate_slics?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/calibrate_slics (original)
+++ trunk/xpp/calibrate_slics Thu Nov 30 23:22:55 2006
@@ -15,9 +15,19 @@
 	exit 1
 }
 
+my $debug = 0;
+# set DEBUG_CALIBRATION in /etc/default/zaptel or similar
+if (exists $ENV{DEBUG_CALIBRATION}) {
+	$debug = 1;
+}
+
 sub logger($) {
 	print STDERR "LOG: @_\n";
 	system("logger @_");
+}
+
+sub debug($) {
+	logger(@_) if ($debug);
 }
 
 sub write_to_slic_file($) {
@@ -45,11 +55,11 @@
 	my @reply = ();
 	while(<SLICS>){
 		#if (/^ /) {
-		#	print STDERR "answer line: $_";
+		#	debug "answer line: $_";
 		#}
 		if (/^ \d*\s+[RW][DIS]\s+[[:xdigit:]]+\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)/){
 			@reply = (hex($1), hex($2)); 
-			#print STDERR "got [$reply]\n";
+			#debug "got [$reply]\n";
 			last;
 		}
 	}
@@ -83,7 +93,7 @@
 		for my $slic (@SlicNums) {
 			$line .= " ".read_reg($slic, $i, 'D');
 		}
-		logger($line);
+		debug($line);
 	}
 }
 
@@ -209,17 +219,17 @@
 	# wait until all slics have finished calibration, or for timeout
 	while ($calibration_in_progress) {
 		$calibration_in_progress = 0; # until proven otherwise
-		print STDERR "ManualCalib:: ";
+		my $debug_calib_str = "ManualCalib:: ";
 		for my $slic(@SlicNums) {
 			my $value = read_reg($slic, $read_reg, 'D');
-			print STDERR " [$slic_counters[$slic]:$value]";
+			$debug_calib_str .= " [$slic_counters[$slic]:$value]";
 			if ($value != 0 && $slic_counters[$slic] >= 0) {
 				$calibration_in_progress = 1;
 				$slic_counters[$slic]--;
 				write_reg($slic,$write_reg,'D',$slic_counters[$slic]);
 			}
 		}
-		print STDERR "\n";
+		debug($debug_calib_str);
 		# TODO: unnecessary sleep in the last round:
 		sleep $ManualCalibrationSleepTime;
 	}
@@ -247,20 +257,20 @@
 	my $end_time=time() + 2;
 	my $timeout=0;
 	CALIB_LOOP: for my $slic (@SlicNums) {
-		logger("checking slic $slic");
+		debug("checking slic $slic");
 		while(1) {
 			if ((read_reg($slic, 60, 'D')) == 0) {
 				# move to next register
-				logger("slic $slic calibrated");
+				debug("slic $slic calibrated");
 				last;
 			}
 			my $time=time();
 			if ( $time > $end_time) {
 				$timeout=1;
-				logger("Exiting on timeout: $end_time < $time.");
+				debug("Exiting on timeout: $end_time < $time.");
 				last CALIB_LOOP;
 			}
-			logger("auto_calibrate not done yet: slic #$slic\n");
+			debug("auto_calibrate not done yet: slic #$slic\n");
 			sleep(0.1);
 		}
 	}
@@ -277,17 +287,17 @@
 #read_reg($slic, 0x0B, 'D'): 0x33
 #read_reg($slic, 0x40, 'D'): 0x00 (?)
 
-print STDERR "starting\n";
+debug "starting\n";
 
 init_indirect_registers();
-print STDERR "after init_indirect_registers\n";
+debug "after init_indirect_registers\n";
 init_early_direct_regs();
-print STDERR "after init_early_direct_regs\n";
+debug "after init_early_direct_regs\n";
 auto_calibrate(0x47, 0x1E);
-print STDERR "after auto_calibrate\n";
+debug "after auto_calibrate\n";
 manual_calibrate();
-print STDERR "after manul_calibrate\n";
+debug "after manul_calibrate\n";
 auto_calibrate(0x40, 0x01);
-print STDERR "after auto_calibrate 2\n";
-
-
+debug "after auto_calibrate 2\n";
+
+

Modified: trunk/xpp/card_fxo.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/card_fxo.c?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/card_fxo.c (original)
+++ trunk/xpp/card_fxo.c Thu Nov 30 23:22:55 2006
@@ -80,11 +80,6 @@
 #define	PROC_REGISTER_FNAME	"slics"
 #define	PROC_FXO_INFO_FNAME	"fxo_info"
 
-#ifdef SOFT_RING
-#define	POLL_RING_INTERVAL	2
-#define	RING_THRESHOLD		3
-#define	NORING_THRESHOLD	10
-#endif
 #define	DAA_RING_REGISTER	0x05
 
 struct FXO_priv_data {
@@ -96,15 +91,6 @@
 	xpp_line_t			ledstate[NUM_LEDS];	/* 0 - OFF, 1 - ON */
 	xpp_line_t			ledcontrol[NUM_LEDS];	/* 0 - OFF, 1 - ON */
 	int				blinking[NUM_LEDS][CHANNELS_PERXPD];
-#ifdef SOFT_RING
-	ushort				ring_thresh[CHANNELS_PERXPD];
-	ushort				noring_thresh[CHANNELS_PERXPD];
-	/* ring_sig is set when Reg5, bit 2 (Ring Detect) is set. 
-	 * While ring_sig=1 we check R5 bit 20H and 40H for ringing. 
-	 * When it drops to 0 that's the end of the ring sequence and 
-	 * we clear the ring detection variables */
-	ushort				ring_sig[CHANNELS_PERXPD];
-#endif
 };
 
 /*---------------- FXO: Static functions ----------------------------------*/
@@ -187,7 +173,7 @@
 	spin_unlock_irqrestore(&xpd->lock, flags);
 }
 
-static void mark_ring(xpd_t *xpd, lineno_t pos, bool on)
+static void mark_ring(xpd_t *xpd, lineno_t pos, bool on, bool update_zap)
 {
 	struct FXO_priv_data	*priv;
 
@@ -197,13 +183,15 @@
 		DBG("%s/%s/%d: START\n", xpd->xbus->busname, xpd->xpdname, pos);
 		xpd->ringing[pos] = 1;
 		MARK_BLINK(priv, pos, LED_GREEN, LED_BLINK);
-		update_zap_ring(xpd, pos, 1);
+		if(update_zap)
+			update_zap_ring(xpd, pos, on);
 	} else if(!on && xpd->ringing[pos]) {
 		DBG("%s/%s/%d: STOP\n", xpd->xbus->busname, xpd->xpdname, pos);
 		xpd->ringing[pos] = 0;
 		if(IS_BLINKING(priv, pos, LED_GREEN))
 			MARK_BLINK(priv, pos, LED_GREEN, 0);
-		update_zap_ring(xpd, pos, 0);
+		if(update_zap)
+			update_zap_ring(xpd, pos, on);
 	}
 }
 
@@ -224,14 +212,11 @@
 		NOTICE("%s/%s/%d: WARNING: called while battery is off\n", xbus->busname, xpd->xpdname, pos);
 	}
 	spin_lock_irqsave(&xpd->lock, flags);
-	mark_ring(xpd, pos, 0);				// No more rings
+	mark_ring(xpd, pos, 0, 0);				// No more rings
 	value = (to_offhook) ? 0x09 : 0x08;	/* Bit 3 is for CID */
 	DBG("%s/%s/%d: SETHOOK: value=0x%02X %s\n", xbus->busname, xpd->xpdname, pos, value, (to_offhook)?"OFFHOOK":"ONHOOK");
 	MARK_LED(xpd, pos, LED_GREEN, (to_offhook)?LED_ON:LED_OFF);
 	ret = DAA_DIRECT_REQUEST(xbus, xpd, pos, DAA_WRITE, DAA_RING_REGISTER, value);
-#ifdef	SOFT_RING
-	priv->ring_sig[pos] = 0;
-#endif
 	if(to_offhook) {
 		BIT_SET(xpd->offhook, pos);
 	} else {
@@ -362,7 +347,7 @@
 	MARK_LED(xpd, ALL_LINES, LED_GREEN, LED_OFF);
 	for_each_line(xpd, i) {
 		MARK_LED(xpd, i, LED_GREEN, LED_ON);
-		mdelay(50);
+		msleep(50);
 	}
 	return 0;
 }
@@ -381,7 +366,7 @@
 	DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
 	for_each_line(xpd, i) {
 		MARK_LED(xpd, i, LED_GREEN, LED_OFF);
-		mdelay(50);
+		msleep(50);
 	}
 	return 0;
 }
@@ -420,21 +405,6 @@
 	}
 }
 
-#ifdef	SOFT_RING
-static void poll_ring(xbus_t *xbus, xpd_t *xpd)
-{
-	int			i;
-	struct FXO_priv_data	*priv;
-
-	priv = xpd->priv;
-	BUG_ON(!priv);
-	for_each_line(xpd, i) {
-		if(priv->ring_sig[i])
-			DAA_DIRECT_REQUEST(xbus, xpd, i, DAA_READ, DAA_RING_REGISTER, 0);
-	}
-}
-#endif
-
 static int FXO_card_tick(xbus_t *xbus, xpd_t *xpd)
 {
 	struct FXO_priv_data	*priv;
@@ -445,10 +415,6 @@
 	if(poll_battery_interval != 0 && (priv->poll_counter % poll_battery_interval) == 0) {
 		poll_battery(xbus, xpd);
 	}
-#ifdef	SOFT_RING
-	if((priv->poll_counter % POLL_RING_INTERVAL) == 0)
-		poll_ring(xbus, xpd);
-#endif
 	handle_fxo_leds(xpd);
 	priv->poll_counter++;
 	return 0;
@@ -489,7 +455,7 @@
 				ret = handle_register_command(xpd, buf);
 				if(ret < 0)
 					return ret;
-				mdelay(1);
+				msleep(1);
 			}
 
 			DBG("-- Set echo registers successfully\n");
@@ -546,11 +512,11 @@
 	if(on) {
 		for_each_line(xpd, i) {
 			MARK_LED(xpd, i, LED_GREEN, LED_ON);
-			mdelay(20);
+			msleep(20);
 		}
 		for_each_line(xpd, i) {
 			MARK_LED(xpd, i, LED_GREEN, LED_OFF);
-			mdelay(20);
+			msleep(20);
 		}
 	}
 	return ret;
@@ -606,21 +572,7 @@
 					xbus->busname, xpd->xpdname, i);
 				continue;
 			}
-			if(IS_SET(sig_status, i)) {
-#ifdef	SOFT_RING
-				priv->ring_sig[i]=1;		/* trigger register polling */
-				/* reset ring check counters */
-				priv->ring_thresh[i] = 0;
-				priv->noring_thresh[i] = 0;
-#else
-				mark_ring(xpd, i, 1);
-#endif
-			} else {
-#ifdef	SOFT_RING
-				priv->ring_sig[i] = 0;
-#endif
-				mark_ring(xpd, i, 0);
-			}
+			mark_ring(xpd, i, IS_SET(sig_status, i), 1);
 		}
 	}
 	spin_unlock_irqrestore(&xpd->lock, flags);
@@ -667,25 +619,6 @@
 			}
 		}
 	}
-#ifdef	SOFT_RING
-	if(REG_FIELD(info, regnum) == DAA_RING_REGISTER && priv->ring_sig[chipsel]) {
-		bool		ringit = (REG_FIELD(info, data_low) & (0x20 | 0x40)) ? 1 : 0;	/* Ring positive | Ring negative */
-
-		if(ringit) {
-			if(priv->ring_thresh[chipsel] > RING_THRESHOLD) {
-				mark_ring(xpd, chipsel, 1);
-				priv->noring_thresh[chipsel] = 0;
-			} else
-				priv->ring_thresh[chipsel]++;
-		} else {
-			if(priv->noring_thresh[chipsel] > NORING_THRESHOLD) {
-				mark_ring(xpd, chipsel, 0);
-				priv->ring_thresh[chipsel] = 0;
-			} else
-				priv->noring_thresh[chipsel]++;
-		}
-	}
-#endif
 #if 0
 	DBG("DAA_REPLY: xpd #%d %s reg_num=0x%X, dataL=0x%X dataH=0x%X\n",
 			xpd->id, (info->size == 3)?"I":"D",
@@ -779,23 +712,6 @@
 		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
 			len += sprintf(page + len, "%2d ", IS_BLINKING(priv,i,LED_GREEN));
 	}
-#ifdef	SOFT_RING
-	len += sprintf(page + len, "\n\t%-17s: ", "ring_thresh");
-	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", priv->ring_thresh[i]);
-	}
-	len += sprintf(page + len, "\n\t%-17s: ", "noring_thresh");
-	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", priv->noring_thresh[i]);
-	}
-	len += sprintf(page + len, "\n\t%-17s: ", "ring_sig");
-	for_each_line(xpd, i) {
-		if(!IS_SET(xpd->digital_outputs, i) && !IS_SET(xpd->digital_inputs, i))
-			len += sprintf(page + len, "%2d ", priv->ring_sig[i]);
-	}
-#endif
 	len += sprintf(page + len, "\n\t%-17s: ", "battery");
 	for_each_line(xpd, i) {
 		len += sprintf(page + len, "%2d ", IS_SET(priv->battery, i));
@@ -942,7 +858,7 @@
 		ret = handle_register_command(xpd, buf);
 		if(ret < 0)
 			return ret;
-		mdelay(1);
+		msleep(1);
 	}
 	return count;
 }
@@ -982,11 +898,6 @@
 int __init card_fxo_startup(void)
 {
 	INFO("%s revision %s\n", THIS_MODULE->name, ZAPTEL_VERSION);
-#ifdef	SOFT_RING
-	INFO("FEATURE: %s with SOFT_RING\n", THIS_MODULE->name);
-#else
-	INFO("FEATURE: %s without SOFT_RING\n", THIS_MODULE->name);
-#endif
 	xproto_register(&PROTO_TABLE(FXO));
 	return 0;
 }

Modified: trunk/xpp/card_fxs.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/card_fxs.c?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/card_fxs.c (original)
+++ trunk/xpp/card_fxs.c Thu Nov 30 23:22:55 2006
@@ -343,7 +343,7 @@
 	spin_unlock_irqrestore(&xpd->lock, flags);
 	for_each_line(xpd, i) {
 		MARK_LED(priv, i, color, LED_ON);
-		mdelay(50);
+		msleep(50);
 	}
 	return 0;
 }
@@ -363,7 +363,7 @@
 	DBG("%s/%s (%d)\n", xbus->busname, xpd->xpdname, on);
 	for_each_line(xpd, i) {
 		MARK_LED(priv, i, color, LED_OFF);
-		mdelay(50);
+		msleep(50);
 	}
 	return 0;
 }
@@ -946,7 +946,7 @@
 		ret = handle_register_command(xpd, buf);
 		if(ret < 0)
 			return ret;
-		mdelay(1);
+		msleep(1);
 	}
 	return count;
 }

Modified: trunk/xpp/card_global.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/card_global.c?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/card_global.c (original)
+++ trunk/xpp/card_global.c Thu Nov 30 23:22:55 2006
@@ -30,15 +30,6 @@
 static const char rcsid[] = "$Id$";
 
 DEF_PARM(charp,initdir, "/usr/share/zaptel", "The directory of card initialization scripts");
-/*
- * BRI: Temporary software workaround for firmware limitation:
- *      - The BRI firmware count PCM channel number globally across subunits.
- *      - The module parameter 'bri_pcmshift' enables us to cheat and shift
- *        each B-channel, 4 bits for each subsequent subunit.
- *      - Eventually, this should be fixed in the firmware, otherwise we won't
- *        handle PRI (all the space we have is 32bits).
- */
-DEF_PARM(bool,bri_pcmshift, 1, "TESTING: shift bri PCM bits by subunit number");
 
 extern	int print_dbg;
 static bool pcm_valid(xpd_t *xpd, xpacket_t *pack);
@@ -94,7 +85,11 @@
 		}
 		buf += ZT_CHUNKSIZE;
 	}
-	if(bri_pcmshift) {	/* workaround for pcm problem in BRI */
+	/*
+	 * BRI: Software workaround for firmware limitation.
+	 *      The BRI firmware count PCM channel number globally across subunits.
+	 */
+	if(xpd->type == XPD_TYPE_BRI_NT || xpd->type == XPD_TYPE_BRI_TE) {
 		lines = lines << (xpd->addr.subunit * 4);
 		RPACKET_FIELD(pack, GLOBAL, PCM_WRITE, lines) = lines;
 	}
@@ -153,17 +148,22 @@
 	card_desc->type = type;
 	card_desc->rev = rev;
 	card_desc->xpd_addr = xpd_addr;
+	DBG("%s: xpd=%d-%d type=%d rev=%d line_status=0x%04X\n",
+			xbus->busname, xpd_addr.unit, xpd_addr.subunit, type, rev, line_status);
 	spin_lock_irqsave(&xbus->lock, flags);
-	DBG("xpd=%d-%d type=%d rev=%d line_status=0x%04X\n",
-			xpd_addr.unit, xpd_addr.subunit, type, rev, line_status);
 	if(type == XPD_TYPE_NOMODULE)
 		XBUS_COUNTER(xbus, DEV_DESC_EMPTY)++;
 	else
 		XBUS_COUNTER(xbus, DEV_DESC_FULL)++;
 	atomic_inc(&xbus->count_poll_answers);
-	wake_up(&xbus->wait_for_polls);
 	list_add_tail(&card_desc->card_list, &xbus->poll_results);
 	spin_unlock_irqrestore(&xbus->lock, flags);
+	/*
+	 * wake_up only after exiting our critical section.
+	 * We suspect that otherwise a spinlock nesting may occur
+	 * and cause a panic (if spinlock debugging is compiled in).
+	 */
+	wake_up(&xbus->wait_for_polls);
 	return 0;
 }
 
@@ -176,6 +176,7 @@
 	volatile u_char	*r;
 	unsigned long	flags;
 	int		i;
+	xpp_line_t	old_lines = lines;
 
 	BUG_ON(!xbus);
 	if(!xpd) {
@@ -188,11 +189,20 @@
 	}
 	// DBG("lines=0x%04X\n", lines);
 
-	if(bri_pcmshift) {	/* workaround for pcm problem in BRI */
+	/*
+	 * BRI: Software workaround for firmware limitation.
+	 *      The BRI firmware count PCM channel number globally across subunits.
+	 */
+	if(xpd->type == XPD_TYPE_BRI_NT || xpd->type == XPD_TYPE_BRI_TE) {
 		lines = (lines >> (xpd->addr.subunit * 4)) & 0x7;
 		RPACKET_FIELD(pack, GLOBAL, PCM_WRITE, lines) = lines;
 	}
 	if(!pcm_valid(xpd, pack)) {
+		static int	rate_limit;
+
+		if((rate_limit++ % 5001) == 0)
+			ERR("%s/%s: old_lines=0x%04X lines=0x%04X subunit=%d\n",
+				xpd->xbus->busname, xpd->xpdname, old_lines, lines, xpd->addr.subunit);
 		return -EPROTO;
 	}
 	spin_lock_irqsave(&xpd->lock, flags);
@@ -313,7 +323,8 @@
 
 		XPD_COUNTER(xpd, RECV_ERRORS)++;
 		if((rate_limit++ % 1000) <= 10) {
-			ERR("BAD PCM REPLY: pack->datalen=%d, count=%d\n", pack->datalen, count);
+			ERR("%s/%s: BAD PCM REPLY: pack->datalen=%d, count=%d\n",
+					xpd->xbus->busname, xpd->xpdname, pack->datalen, count);
 			dump_packet("BAD PCM REPLY", pack, 1);
 		}
 		return 0;

Modified: trunk/xpp/init_card_3_23
URL: http://svn.digium.com/view/zaptel/trunk/xpp/init_card_3_23?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/init_card_3_23 (original)
+++ trunk/xpp/init_card_3_23 Thu Nov 30 23:22:55 2006
@@ -46,10 +46,21 @@
 export XPP_BASE
 LOGGER="logger -s -t $me"
 
+ZAPTEL_BOOT_DEBIAN=${ZAPTEL_BOOT_DEBIAN:-/etc/default/zaptel}
+ZAPTEL_BOOT_FEDORA=${ZAPTEL_BOOT_FEDORA:-/etc/sysconfig/zaptel}
+
+# read default configuration from /etc/default/zaptel
+if [ -r $ZAPTEL_BOOT_DEBIAN ]; then . $ZAPTEL_BOOT_DEBIAN; fi
+if [ -r $ZAPTEL_BOOT_FEDORA ]; then . $ZAPTEL_BOOT_FEDORA; fi
+
+if [ "$DEBUG_CALIBRATION"=1 ]; then
+	LOGGER=":"
+fi
+
 # Always redirect stderr somewhere, otherwise the shell script will die
 # when it tries to do I/O related stuff on closed file descriptor.
 # Our default is to throw it down the bit-bucket.
-exec 2> /dev/null
+exec 2> /dev/console
 ## If you wish to trace this script:
 #exec 2> /tmp/xpp_init_$XPD_NAME
 ## Altenativly, if you have multiple XBUS'es:
@@ -65,8 +76,7 @@
 
 $LOGGER -p kern.info "$XPD_BUS/$XPD_NAME: Continue '$0'"
 
-sed -e 's/[;#].*$//' -e '/^[ 	]*$/d' <<END_OF_FILE
-
+echo "
 # Change SLICs states to "Open state"s  (Off,all transfers tristated to avoid data collision), Voltage sense
 31	WD	40	00
 
@@ -169,8 +179,7 @@
 
 #31	WD	4A 34
 #31	WD	4B 10
-
-END_OF_FILE
+" | sed -e 's/[;#].*$//' -e '/^[ 	]*$/d' 
 
 $LOGGER -p kern.info "$XPD_BUS/$XPD_NAME: Ending '$0'"
 exit 0

Modified: trunk/xpp/init_card_4_23
URL: http://svn.digium.com/view/zaptel/trunk/xpp/init_card_4_23?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/init_card_4_23 (original)
+++ trunk/xpp/init_card_4_23 Thu Nov 30 23:22:55 2006
@@ -44,10 +44,21 @@
 export XPP_BASE
 LOGGER="logger -s -t $me"
 
+ZAPTEL_BOOT_DEBIAN=${ZAPTEL_BOOT_DEBIAN:-/etc/default/zaptel}
+ZAPTEL_BOOT_FEDORA=${ZAPTEL_BOOT_FEDORA:-/etc/sysconfig/zaptel}
+
+# read default configuration from /etc/default/zaptel
+if [ -r $ZAPTEL_BOOT_DEBIAN ]; then . $ZAPTEL_BOOT_DEBIAN; fi
+if [ -r $ZAPTEL_BOOT_FEDORA ]; then . $ZAPTEL_BOOT_FEDORA; fi
+
+if [ "$DEBUG_CALIBRATION"=1 ]; then
+	LOGGER=":"
+fi
+
 # Always redirect stderr somewhere, otherwise the shell script will die
 # when it tries to do I/O related stuff on closed file descriptor.
 # Our default is to throw it down the bit-bucket.
-exec 2> /dev/null
+exec 2> /dev/console
 ## If you wish to trace this script:
 #exec 2> /tmp/xpp_init_$XPD_NAME
 ## Altenativly, if you have multiple XBUS'es:
@@ -69,12 +80,12 @@
 	. $INIT_DIR/init_fxo_modes
 	fi
 	# Our register numbers are HEXADECIMAL!
-	cat <<EOF
+	echo "
 31 WD 10 $reg16
 31 WD 1A $reg26
 31 WD 1E $reg30
 31 WD 1F $reg31
-EOF
+"
 	# for the FXS:
 	#if [ "$ring_osc" != '' ]; then
 	#	/bin/echo "31 WI __ $ring_osc"
@@ -86,7 +97,7 @@
 
 # Remove empty lines and commets. Not strictly necessary
 # but works around some limitations of the proc interface:
-sed -e 's/[;#].*$//' -e '/^[ 	]*$/d' <<END_OF_FILE
+echo "
 
 
 31	WD	21	28
@@ -141,8 +152,7 @@
 # Set tip to ring voltage to 3.5 volts while off-hook
 # instead of default of 3.1
 31	WD	1A	C0
-
-END_OF_FILE
+" | sed -e 's/[;#].*$//' -e '/^[ 	]*$/d'
 
 set_daa_country_params "$opermode"
 

Modified: trunk/xpp/utils/Makefile
URL: http://svn.digium.com/view/zaptel/trunk/xpp/utils/Makefile?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/utils/Makefile (original)
+++ trunk/xpp/utils/Makefile Thu Nov 30 23:22:55 2006
@@ -66,14 +66,14 @@
 test_parse: test_parse.o libhexfile.a
 	$(CC) -L. -o $@ $@.o $(EXTRA_LIBS) -lhexfile -lusb
 
-print_modes.o: print_modes.c wctdm_fxomodes.h
-	$(HOSTCC) $(CFLAGS) -c $<
+print_modes: print_modes.c wctdm_fxomodes.h
+	$(HOSTCC) -o $@ $(CFLAGS) $<
 
 wctdm_fxomodes.h: $(WCTDM)
 	perl -n -e 'print if (/^static struct fxo_mode {$$/ .. /};$$/)' $(WCTDM) >$@
 
 init_fxo_modes: print_modes
-	./$^ >$@
+	./$< >$@
 
 clean:
 	$(RM) *.o $(TARGETS)

Modified: trunk/xpp/xbus-core.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/xbus-core.c?view=diff&rev=1680&r1=1679&r2=1680
==============================================================================
--- trunk/xpp/xbus-core.c (original)
+++ trunk/xpp/xbus-core.c Thu Nov 30 23:22:55 2006
@@ -33,7 +33,7 @@
 #include <linux/ctype.h>
 #endif
 #include <linux/device.h>
-#include <linux/delay.h>	/* for mdelay() to debug */
+#include <linux/delay.h>	/* for msleep() to debug */
 #include "xpd.h"
 #include "xpp_zap.h"
 #include "xbus-core.h"
@@ -42,7 +42,7 @@
 static const char rcsid[] = "$Id$";
 
 /* Defines */
-#define	POLL_TIMEOUT		(MAX_XPDS)	/* in jiffies */
+#define	POLL_TIMEOUT		(2*MAX_XPDS)	/* in jiffies */
 #define	INITIALIZATION_TIMEOUT	(40*HZ)		/* in jiffies */
 #define	PROC_XBUSES		"xbuses"
 #define	PROC_XBUS_SUMMARY	"summary"
@@ -55,6 +55,7 @@
 
 /* Command line parameters */
 extern int print_dbg;
+DEF_PARM(uint, poll_timeout, POLL_TIMEOUT,"Timeout (in jiffies) waiting for units to reply (default " __stringify(POLL_TIMEOUT) ")");
 
 /* Forward declarations */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
@@ -226,7 +227,7 @@
 		ERR("%s is being removed...\n", xbus->busname);
 		return -EBUSY;
 	}
-	mdelay(2);	/* roundtrip for older polls */
+	msleep(2);	/* roundtrip for older polls */
 	spin_lock_irqsave(&xbus->lock, flags);
 	DBG("%s\n", xbus->busname);
 
@@ -250,16 +251,18 @@
 	/*
 	 * Wait for replies
 	 */
-	DBG("%s: Polled %d XPD's. Waiting for replies max %d jiffies\n", xbus->busname, MAX_XPDS, POLL_TIMEOUT);
-	ret = wait_event_interruptible_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, POLL_TIMEOUT);
+	DBG("%s: Polled %d XPD's. Waiting for replies max %d jiffies\n", xbus->busname, MAX_XPDS, poll_timeout);
+	ret = wait_event_interruptible_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, poll_timeout);
 	if(ret == 0) {
-		ERR("%s: Poll timeout\n", xbus->busname);
-		goto out;
+		ERR("%s: Poll timeout. Continuing anyway.\n", xbus->busname);
+		/*
+		 * Continue processing. Maybe some units did reply.
+		 */
 	} else if(ret < 0) {
 		ERR("%s: Poll interrupted %d\n", xbus->busname, ret);
 		goto out;
-	}
-	DBG("%s: Poll finished in %d jiffies. Start processing.\n", xbus->busname, POLL_TIMEOUT - ret);
+	} else
+		DBG("%s: Poll finished in %d jiffies.\n", xbus->busname, poll_timeout - ret);
 	/*
 	 * Build removals/additions lists
 	 */
@@ -288,6 +291,10 @@
 			kfree(card_desc);
 		}
 	}
+	/*
+	 * We set this *after* poll is finished, so wait_for_xpd_initialization can
+	 * tell we already know how many units we have.
+	 */
 	atomic_set(&xbus->count_xpds_to_initialize, count_added);
 	spin_unlock_irqrestore(&xbus->lock, flags);
 	INFO("%s: Poll results: removals=%d additions=%d\n", xbus->busname, count_removed, count_added);
@@ -659,7 +666,14 @@
 	if(!xbus)
 		goto out;
 	DBG("%s: Waiting for card initialization of %d XPD's max %d seconds\n", xbus->busname, MAX_XPDS, INITIALIZATION_TIMEOUT/HZ);
+	/*
+	 * xbus_poll sets count_xpds_to_initialize only when polling is finished.
+	 * To prevent race conditions we test both:
+	 *   - It is none zero -- meaning we already have the poll results.
+	 *   - And all units have finished initialization.
+	 */
 	ret = wait_event_interruptible_timeout(xbus->wait_for_xpd_initialization,
+			atomic_read(&xbus->count_xpds_to_initialize) &&
 			atomic_read(&xbus->count_xpds_initialized) >= atomic_read(&xbus->count_xpds_to_initialize),
 			INITIALIZATION_TIMEOUT);
 	if(ret == 0) {



More information about the zaptel-commits mailing list