[svn-commits] dbailey: branch 1.4 r4168 - /branches/1.4/kernel/zaptel-base.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Apr 10 17:25:31 CDT 2008


Author: dbailey
Date: Thu Apr 10 17:25:30 2008
New Revision: 4168

URL: http://svn.digium.com/view/zaptel?view=rev&rev=4168
Log:
Correct problem where drivers implementing echocan_with_params was not getting called
to disable the echo canceller

Modified:
    branches/1.4/kernel/zaptel-base.c

Modified: branches/1.4/kernel/zaptel-base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/kernel/zaptel-base.c?view=diff&rev=4168&r1=4167&r2=4168
==============================================================================
--- branches/1.4/kernel/zaptel-base.c (original)
+++ branches/1.4/kernel/zaptel-base.c Thu Apr 10 17:25:30 2008
@@ -995,6 +995,22 @@
 }
 
 
+static inline int hw_echocancel_off(struct zt_chan *chan)
+{
+	struct zt_echocanparams ecp;
+	
+	int ret = -ENODEV;
+	if (chan->span) {
+		if (chan->span->echocan) {
+			ret = chan->span->echocan(chan, 0);
+		} else if (chan->span->echocan_with_params) {
+			memset(&ecp, 0, sizeof(ecp));  /* Sets tap length to 0 */
+			ret = chan->span->echocan_with_params(chan, &ecp, NULL);
+		}
+	}
+	return ret;
+}
+
 static void close_channel(struct zt_chan *chan)
 {
 	unsigned long flags;
@@ -1074,8 +1090,7 @@
 
 	spin_unlock_irqrestore(&chan->lock, flags);
 
-	if (chan->span && chan->span->echocan)
-		chan->span->echocan(chan, 0);
+	hw_echocancel_off(chan);
 
 	if (rxgain)
 		kfree(rxgain);
@@ -2376,8 +2391,7 @@
 	spin_unlock_irqrestore(&chan->lock, flags);
 	set_tone_zone(chan, -1);
 
-	if (chan->span && chan->span->echocan)
-		chan->span->echocan(chan, 0);
+	hw_echocancel_off(chan);
 
 	if (rxgain)
 		kfree(rxgain);
@@ -4597,8 +4611,7 @@
 		chan->echolastupdate = 0;
 		chan->echotimer = 0;
 		spin_unlock_irqrestore(&chan->lock, flags);
-		if (chan->span && chan->span->echocan)
-			chan->span->echocan(chan, 0);
+		hw_echocancel_off(chan);
 		if (tec)
 			echo_can_free(tec);
 
@@ -4629,14 +4642,10 @@
 	/* attempt to use the span's echo canceler; fall back to built-in
 	   if it fails (but not if an error occurs) */
 	if (chan->span) {
-		if (ecp->param_count) {
-			if (chan->span->echocan_with_params)
-				ret = chan->span->echocan_with_params(chan, ecp, params);
-		} else if (chan->span->echocan) {
+		if (chan->span->echocan_with_params)
+			ret = chan->span->echocan_with_params(chan, ecp, params);
+		else if (!ecp->param_count && chan->span->echocan)
 			ret = chan->span->echocan(chan, ecp->tap_length);
-		} else if (chan->span->echocan_with_params) {
-			ret = chan->span->echocan_with_params(chan, ecp, NULL);
-		}
 	}
 	
 	if (ret == -ENODEV) {
@@ -4745,8 +4754,7 @@
 			/* Disable any native echo cancellation as well */
 			spin_unlock_irqrestore(&chan->lock, flags);
 
-			if (chan->span && chan->span->echocan)
-				chan->span->echocan(chan, 0);
+			hw_echocancel_off(chan);
 
 			if (rxgain)
 				kfree(rxgain);
@@ -4798,8 +4806,8 @@
 					chan->gainalloc = 0;
 					chan->flags &= ~ZT_FLAG_AUDIO;
 					chan->flags |= (ZT_FLAG_PPP | ZT_FLAG_HDLC | ZT_FLAG_FCS);
-					if (chan->span && chan->span->echocan)
-						chan->span->echocan(chan, 0);
+					hw_echocancel_off(chan);
+					
 					if (tec)
 						echo_can_free(tec);
 				} else
@@ -5120,6 +5128,11 @@
 		span->deflaw = ZT_LAW_MULAW;
 	}
 
+	if (span->echocan && span->echocan_with_params) {
+		printk("zaptel: Span %s implements both echocan and echocan_with_params functions, preserving only echocan_with_params, please fix driver!\n", span->name);
+		span->echocan = NULL;
+	}
+
 	for (x=0;x<span->channels;x++) {
 		span->chans[x].span = span;
 		zt_chan_reg(&span->chans[x]); 




More information about the svn-commits mailing list