[svn-commits] kpfleming: branch linux/kpfleming/modular_ec r4425 - /linux/team/kpfleming/mo...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Jun 20 10:42:44 CDT 2008


Author: kpfleming
Date: Fri Jun 20 10:42:43 2008
New Revision: 4425

URL: http://svn.digium.com/view/dahdi?view=rev&rev=4425
Log:
fix some very broken code

Modified:
    linux/team/kpfleming/modular_ec/drivers/dahdi/dahdi-base.c

Modified: linux/team/kpfleming/modular_ec/drivers/dahdi/dahdi-base.c
URL: http://svn.digium.com/view/dahdi/linux/team/kpfleming/modular_ec/drivers/dahdi/dahdi-base.c?view=diff&rev=4425&r1=4424&r2=4425
==============================================================================
--- linux/team/kpfleming/modular_ec/drivers/dahdi/dahdi-base.c (original)
+++ linux/team/kpfleming/modular_ec/drivers/dahdi/dahdi-base.c Fri Jun 20 10:42:43 2008
@@ -3607,6 +3607,34 @@
 			res =  spans[j]->shutdown(spans[j]);
 		spans[j]->flags &= ~DAHDI_FLAG_RUNNING;
 		return 0;
+	case DAHDI_ATTACH_ECHOCAN:
+	{
+		struct dahdi_attach_echocan ae;
+		const struct dahdi_echocan *new = NULL, *old;
+
+		if (copy_from_user(&ae, (struct dahdi_attach_echocan *) data, sizeof(ae))) {
+			return -EFAULT;
+		}
+
+		VALID_CHANNEL(ae.chan);
+
+		if (ae.echocan[0]) {
+			if (!(new = find_echocan(ae.echocan))) {
+				return -EINVAL;
+			}
+		}
+
+		spin_lock_irqsave(&chans[ae.chan]->lock, flags);
+		old = chans[ae.chan]->ec_factory;
+		chans[ae.chan]->ec_factory = new;
+		spin_unlock_irqrestore(&chans[ae.chan]->lock, flags);
+
+		if (old) {
+			release_echocan(old);
+		}
+
+		break;
+	}
 	case DAHDI_CHANCONFIG:
 	{
 		struct dahdi_chanconfig ch;
@@ -4638,7 +4666,7 @@
 			ret = chan->span->echocan(chan, ecp->tap_length);
 	}
 	
-	if (ret == -ENODEV) {
+	if ((ret == -ENODEV) && chan->ec_factory) {
 		const struct dahdi_echocan *ec_current;
 
 		switch (ecp->tap_length) {
@@ -4865,38 +4893,6 @@
 			fasthdlc_init(&chan->txhdlc);
 		}
 		break;
-	case DAHDI_ATTACH_ECHOCAN:
-	{
-		struct dahdi_attach_echocan ae;
-		const struct dahdi_echocan *new = NULL, *old;
-
-		if (!(chan->flags & DAHDI_FLAG_AUDIO)) {
-			return -EINVAL;
-		}
-
-		if (copy_from_user(&ae, (struct dahdi_attach_echocan *) data, sizeof(ae))) {
-			return -EFAULT;
-		}
-
-		VALID_CHANNEL(ae.chan);
-
-		if (ae.echocan[0]) {
-			if (!(new = find_echocan(ae.echocan))) {
-				return -EINVAL;
-			}
-		}
-
-		spin_lock_irqsave(&chan->lock, flags);
-		old = chan->ec_factory;
-		chan->ec_factory = new;
-		spin_unlock_irqrestore(&chan->lock, flags);
-
-		if (old) {
-			release_echocan(old);
-		}
-
-		break;
-	}
 	case DAHDI_ECHOCANCEL_PARAMS:
 	{
 		struct dahdi_echocanparams ecp;




More information about the svn-commits mailing list