[svn-commits] sruffell: branch linux/sruffell/staging r6511 - in /linux/team/sruffell/stagi...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Apr 27 14:44:22 CDT 2009


Author: sruffell
Date: Mon Apr 27 14:44:18 2009
New Revision: 6511

URL: http://svn.digium.com/svn-view/dahdi?view=rev&rev=6511
Log:
echocan-squash: updating wctdm24xxp and wcte12xp.

Brings in [6494-6496] from echocan_work.

Modified:
    linux/team/sruffell/staging/drivers/dahdi/adt_lec.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi-base.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_jpah.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_kb1.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_mg2.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_oslec.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec.c
    linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec2.c
    linux/team/sruffell/staging/drivers/dahdi/hpec/dahdi_echocan_hpec.c
    linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.c
    linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.h
    linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/base.c
    linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/wcb4xxp.h
    linux/team/sruffell/staging/drivers/dahdi/wct4xxp/base.c
    linux/team/sruffell/staging/drivers/dahdi/wctdm24xxp/base.c
    linux/team/sruffell/staging/drivers/dahdi/wctdm24xxp/wctdm24xxp.h
    linux/team/sruffell/staging/drivers/dahdi/wcte12xp/base.c
    linux/team/sruffell/staging/drivers/dahdi/wcte12xp/wcte12xp.h
    linux/team/sruffell/staging/include/dahdi/kernel.h

Modified: linux/team/sruffell/staging/drivers/dahdi/adt_lec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/adt_lec.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/adt_lec.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/adt_lec.c Mon Apr 27 14:44:18 2009
@@ -39,6 +39,8 @@
 	unsigned int x;
 	char *c;
 
+	params->tap_length = ecp->tap_length;
+
 	for (x = 0; x < ecp->param_count; x++) {
 		for (c = p[x].name; *c; c++)
 			*c = tolower(*c);

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi-base.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi-base.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi-base.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi-base.c Mon Apr 27 14:44:18 2009
@@ -1076,25 +1076,6 @@
 }
 
 
-static inline int hw_echocancel_off(struct dahdi_chan *chan)
-{
-	int ret = 0;
-
-	if (!chan->span)
-		return -ENODEV;
-
-	if (chan->span->echocan) {
-		ret = chan->span->echocan(chan, 0);
-	} else if (chan->span->echocan_with_params) {
-		struct dahdi_echocanparams ecp = {
-			.tap_length = 0,
-		};
-		ret = chan->span->echocan_with_params(chan, &ecp, NULL);
-	}
-
-	return ret;
-}
-
 static const struct dahdi_echocan_factory *find_echocan(const char *name)
 {
 	struct ecfactory *cur;
@@ -1153,7 +1134,8 @@
 static void release_echocan(const struct dahdi_echocan_factory *ec)
 {
 #ifdef USE_ECHOCAN_REFCOUNT
-	module_put(ec->owner);
+	if (ec)
+		module_put(ec->owner);
 #endif
 }
 
@@ -1248,13 +1230,11 @@
 		chan->span->dacs(chan, NULL);
 
 	if (ec_state) {
-		ec_state->ops->echocan_free(ec_state);
+		ec_state->ops->echocan_free(chan, ec_state);
 		release_echocan(ec_current);
 	}
 
 	spin_unlock_irqrestore(&chan->lock, flags);
-
-	hw_echocancel_off(chan);
 
 	if (rxgain)
 		kfree(rxgain);
@@ -2554,15 +2534,13 @@
 	}
 
 	if (ec_state) {
-		ec_state->ops->echocan_free(ec_state);
+		ec_state->ops->echocan_free(chan, ec_state);
 		release_echocan(ec_current);
 	}
 
 	spin_unlock_irqrestore(&chan->lock, flags);
 
 	set_tone_zone(chan, -1);
-
-	hw_echocancel_off(chan);
 
 	if (rxgain)
 		kfree(rxgain);
@@ -4868,19 +4846,12 @@
 		chan->ec_current = NULL;
 		spin_unlock_irqrestore(&chan->lock, flags);
 		if (ec_state) {
-			ec_state->ops->echocan_free(ec_state);
+			ec_state->ops->echocan_free(chan, ec_state);
 			release_echocan(ec_current);
 		}
-		hw_echocancel_off(chan);
 
 		return 0;
 	}
-
-	/* if parameters were supplied and this channel's span provides an echocan,
-	   but not one that takes params, then we must punt here and return an error */
-	if (ecp->param_count && chan->span && chan->span->echocan &&
-	    !chan->span->echocan_with_params)
-		return -EINVAL;
 
 	params = kmalloc(sizeof(params[0]) * DAHDI_MAX_ECHOCANPARAMS, GFP_KERNEL);
 
@@ -4894,6 +4865,7 @@
 		goto exit_with_free;
 	}
 
+	/* free any echocan that may be on the channel already */
 	spin_lock_irqsave(&chan->lock, flags);
 	ec_state = chan->ec_state;
 	chan->ec_state = NULL;
@@ -4901,34 +4873,31 @@
 	chan->ec_current = NULL;
 	spin_unlock_irqrestore(&chan->lock, flags);
 	if (ec_state) {
-		ec_state->ops->echocan_free(ec_state);
+		ec_state->ops->echocan_free(chan, ec_state);
 		release_echocan(ec_current);
 	}
 
+	switch (ecp->tap_length) {
+	case 32:
+	case 64:
+	case 128:
+	case 256:
+	case 512:
+	case 1024:
+		break;
+	default:
+		ecp->tap_length = deftaps;
+	}
+
 	ret = -ENODEV;
+	ec_current = NULL;
 
 	/* 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 (chan->span->echocan_with_params)
-			ret = chan->span->echocan_with_params(chan, ecp, params);
-		else if (chan->span->echocan)
-			ret = chan->span->echocan(chan, ecp->tap_length);
-	}
+	if (chan->span && chan->span->echocan_create)
+		ret = chan->span->echocan_create(chan, ecp, params, &ec);
 
 	if ((ret == -ENODEV) && chan->ec_factory) {
-		switch (ecp->tap_length) {
-		case 32:
-		case 64:
-		case 128:
-		case 256:
-		case 512:
-		case 1024:
-			break;
-		default:
-			ecp->tap_length = deftaps;
-		}
-
 #ifdef USE_ECHOCAN_REFCOUNT
 		/* try to get another reference to the module providing
 		   this channel's echo canceler */
@@ -4942,7 +4911,7 @@
 		   an echo canceler instance if possible */
 		ec_current = chan->ec_factory;
 
-		ret = ec_current->echocan_create(ecp, params, &ec);
+		ret = ec_current->echocan_create(chan, ecp, params, &ec);
 		if (ret) {
 			release_echocan(ec_current);
 
@@ -4950,12 +4919,14 @@
 		}
 		if (!ec) {
 			module_printk(KERN_ERR, "%s failed to allocate an " \
-				"dahdi_echocan_state instance.\n",
-				ec_current->name);
+				      "dahdi_echocan_state instance.\n",
+				      ec_current->name);
 			ret = -EFAULT;
 			goto exit_with_free;
 		}
-
+	}
+
+	if (ec) {
 		spin_lock_irqsave(&chan->lock, flags);
 		chan->ec_current = ec_current;
 		chan->ec_state = ec;
@@ -5105,12 +5076,9 @@
 			spin_unlock_irqrestore(&chan->lock, flags);
 
 			if (ec_state) {
-				ec_state->ops->echocan_free(ec_state);
+				ec_state->ops->echocan_free(chan, ec_state);
 				release_echocan(ec_current);
 			}
-
-			/* Disable any native echo cancellation as well */
-			hw_echocancel_off(chan);
 
 			if (rxgain)
 				kfree(rxgain);
@@ -5159,10 +5127,9 @@
 					chan->gainalloc = 0;
 					chan->flags &= ~DAHDI_FLAG_AUDIO;
 					chan->flags |= (DAHDI_FLAG_PPP | DAHDI_FLAG_HDLC | DAHDI_FLAG_FCS);
-					hw_echocancel_off(chan);
 
 					if (tec) {
-						tec->ops->echocan_free(tec);
+						tec->ops->echocan_free(chan, tec);
 						release_echocan(ec_current);
 					}
 				} else
@@ -5521,13 +5488,6 @@
 		span->deflaw = DAHDI_LAW_MULAW;
 	}
 
-	if (span->echocan && span->echocan_with_params) {
-		module_printk(KERN_NOTICE, "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;
 		dahdi_chan_reg(span->chans[x]);
@@ -6679,19 +6639,25 @@
 				rxchunk[x] = DAHDI_LIN2X((int)rxlin, ss);
 			}
 		} else if (ss->ec_state->status.mode != ECHO_MODE_IDLE) {
-			short rxlins[DAHDI_CHUNKSIZE], txlins[DAHDI_CHUNKSIZE];
-
-			for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
-				rxlins[x] = DAHDI_XLAW(rxchunk[x], ss);
-				txlins[x] = DAHDI_XLAW(txchunk[x], ss);
-			}
 			ss->ec_state->events.all = 0;
-			ss->ec_state->ops->echocan_array_update(ss->ec_state, rxlins, txlins, DAHDI_CHUNKSIZE);
-			if (ss->ec_state->events.all) {
+
+			if (ss->ec_state->ops->echocan_process) {
+				short rxlins[DAHDI_CHUNKSIZE], txlins[DAHDI_CHUNKSIZE];
+
+				for (x = 0; x < DAHDI_CHUNKSIZE; x++) {
+					rxlins[x] = DAHDI_XLAW(rxchunk[x], ss);
+					txlins[x] = DAHDI_XLAW(txchunk[x], ss);
+				}
+				ss->ec_state->ops->echocan_process(ss->ec_state, rxlins, txlins, DAHDI_CHUNKSIZE);
+
+				for (x = 0; x < DAHDI_CHUNKSIZE; x++)
+					rxchunk[x] = DAHDI_LIN2X((int) rxlins[x], ss);
+			} else if (ss->ec_state->ops->echocan_events)
+				ss->ec_state->ops->echocan_events(ss->ec_state);
+
+			if (ss->ec_state->events.all)
 				process_echocan_events(ss);
-			}
-			for (x = 0; x < DAHDI_CHUNKSIZE; x++)
-				rxchunk[x] = DAHDI_LIN2X((int) rxlins[x], ss);
+
 		}
 #if defined(CONFIG_DAHDI_MMX) || defined(ECHO_CAN_FP)
 		kernel_fpu_end();

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_jpah.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_jpah.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_jpah.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_jpah.c Mon Apr 27 14:44:18 2009
@@ -40,10 +40,10 @@
 #define module_printk(level, fmt, args...) printk(level "%s: " fmt, THIS_MODULE->name, ## args)
 #define debug_printk(level, fmt, args...) if (debug >= level) printk("%s (%s): " fmt, THIS_MODULE->name, __FUNCTION__, ## args)
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 
 static const struct dahdi_echocan_factory my_factory = {
@@ -55,7 +55,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "JPAH",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 };
 
@@ -66,8 +66,8 @@
 
 #define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct ec_pvt *pvt;
 
@@ -86,14 +86,14 @@
 	return 0;
 }
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
 	kfree(pvt);
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 x;

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_kb1.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_kb1.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_kb1.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_kb1.c Mon Apr 27 14:44:18 2009
@@ -142,10 +142,10 @@
 	short *buf_d;			
 } echo_can_cb_s;
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 static void echocan_NLP_toggle(struct dahdi_echocan_state *ec, unsigned int enable);
 
@@ -162,7 +162,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "KB1",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 	.echocan_NLP_toggle = echocan_NLP_toggle,
 };
@@ -329,7 +329,7 @@
 
 }
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -615,7 +615,7 @@
 	return u;
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 x;
@@ -628,8 +628,8 @@
 	}
 }
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	int maxy;
 	int maxu;

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_mg2.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_mg2.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_mg2.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_mg2.c Mon Apr 27 14:44:18 2009
@@ -174,10 +174,10 @@
 	short *buf_d;			
 } echo_can_cb_s;
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 static void echocan_NLP_toggle(struct dahdi_echocan_state *ec, unsigned int enable);
 
@@ -194,7 +194,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "MG2",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 	.echocan_NLP_toggle = echocan_NLP_toggle,
 };
@@ -376,7 +376,7 @@
 
 }
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -755,7 +755,7 @@
 	return u;
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 x;
@@ -768,8 +768,8 @@
 	}
 }
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	int maxy;
 	int maxu;

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_oslec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_oslec.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_oslec.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_oslec.c Mon Apr 27 14:44:18 2009
@@ -37,10 +37,10 @@
 
 #define module_printk(level, fmt, args...) printk(level "%s: " fmt, THIS_MODULE->name, ## args)
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 
 static const struct dahdi_echocan_factory my_factory = {
@@ -52,7 +52,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "OSLEC",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 };
 
@@ -63,7 +63,7 @@
 
 #define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -71,7 +71,7 @@
 	kfree(pvt);
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 SampleNum;
@@ -84,8 +84,8 @@
 	}
 }
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct ec_pvt *pvt;
 

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec.c Mon Apr 27 14:44:18 2009
@@ -80,10 +80,10 @@
 #define MIN_RX_POWER_FOR_ADAPTION   64
 */
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 static void echocan_NLP_toggle(struct dahdi_echocan_state *ec, unsigned int enable);
 
@@ -100,7 +100,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "SEC",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 	.echocan_NLP_toggle = echocan_NLP_toggle,
 };
@@ -137,8 +137,8 @@
 
 #define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct ec_pvt *pvt;
 	size_t size;
@@ -175,7 +175,7 @@
 	return 0;
 }
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -291,7 +291,7 @@
 	return clean_rx;
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 x;

Modified: linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec2.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec2.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec2.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/dahdi_echocan_sec2.c Mon Apr 27 14:44:18 2009
@@ -76,10 +76,10 @@
 /* #define MIN_TX_POWER_FOR_ADAPTION 4096
 #define MIN_RX_POWER_FOR_ADAPTION 64 */
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
 static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 
 static const struct dahdi_echocan_factory my_factory = {
@@ -91,7 +91,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "SEC2",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 };
 
@@ -127,8 +127,8 @@
 
 #define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi)
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct ec_pvt *pvt;
 	size_t size;
@@ -293,7 +293,7 @@
 	return clean_rx;
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 	u32 x;

Modified: linux/team/sruffell/staging/drivers/dahdi/hpec/dahdi_echocan_hpec.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/hpec/dahdi_echocan_hpec.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/hpec/dahdi_echocan_hpec.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/hpec/dahdi_echocan_hpec.c Mon Apr 27 14:44:18 2009
@@ -36,10 +36,10 @@
 #include "hpec_user.h"
 #include "hpec.h"
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec);
-static void echo_can_free(struct dahdi_echocan_state *ec);
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, __u32 size);
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, __u32 size);
 static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val);
 
 static const struct dahdi_echocan_factory my_factory = {
@@ -57,7 +57,7 @@
 static const struct dahdi_echocan_ops my_ops = {
 	.name = "HPEC",
 	.echocan_free = echo_can_free,
-	.echocan_array_update = echo_can_array_update,
+	.echocan_process = echo_can_process,
 	.echocan_traintap = echo_can_traintap,
 };
 
@@ -99,7 +99,7 @@
 	kfree(ptr);
 }
 
-static void echo_can_free(struct dahdi_echocan_state *ec)
+static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -107,7 +107,7 @@
 	kfree(pvt);
 }
 
-static void echo_can_array_update(struct dahdi_echocan_state *ec, short *isig, const short *iref, __u32 size)
+static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, __u32 size)
 {
 	struct ec_pvt *pvt = dahdi_to_pvt(ec);
 
@@ -116,8 +116,8 @@
 
 DECLARE_MUTEX(alloc_lock);
 
-static int echo_can_create(struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p,
-			   struct dahdi_echocan_state **ec)
+static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct ec_pvt *pvt;
 

Modified: linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.c Mon Apr 27 14:44:18 2009
@@ -297,21 +297,9 @@
 	return;
 }
 #include "adt_lec.c"
-int vpmadt032_echocan_with_params(struct vpmadt032 *vpm, int channo,
-	struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p)
+static void vpmadt032_check_and_schedule_update(struct vpmadt032 *vpm, int channo)
 {
 	int update;
-	unsigned int ret;
-
-	ret = adt_lec_parse_params(&vpm->desiredecstate[channo], ecp, p);
-	if (ret)
-		return ret;
-
-	/* The driver cannot control the number of taps on the VPMADT032
-	 * module. Instead, it uses tap_length to enable or disable the echo
-	 * cancellation. */
-	vpm->desiredecstate[channo].tap_length = (ecp->tap_length) ? 1 : 0;
-
 	/* Only update the parameters if the new state of the echo canceller
 	 * is different than the current state. */
 	update = memcmp(&vpm->curecstate[channo],
@@ -326,10 +314,41 @@
 		 */
 		schedule_work(&vpm->work);
 	}
-
+}
+int vpmadt032_echocan_create(struct vpmadt032 *vpm, int channo,
+	struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p)
+{
+	unsigned int ret;
+
+	ret = adt_lec_parse_params(&vpm->desiredecstate[channo], ecp, p);
+	if (ret)
+		return ret;
+
+	if (vpm->options.debug & DEBUG_ECHOCAN) 
+		printk(KERN_DEBUG "echocan: Channel is %d length %d\n", channo, ecp->tap_length);
+
+	/* The driver cannot control the number of taps on the VPMADT032
+	 * module. Instead, it uses tap_length to enable or disable the echo
+	 * cancellation. */
+	vpm->desiredecstate[channo].tap_length = (ecp->tap_length) ? 1 : 0;
+
+	vpmadt032_check_and_schedule_update(vpm, channo);
 	return 0;
 }
-EXPORT_SYMBOL(vpmadt032_echocan_with_params);
+EXPORT_SYMBOL(vpmadt032_echocan_create);
+
+void vpmadt032_echocan_free(struct vpmadt032 *vpm, struct dahdi_chan *chan,
+	struct dahdi_echocan_state *ec)
+{
+	int channo = chan->chanpos - 1;
+	adt_lec_init_defaults(&vpm->desiredecstate[channo], 0);
+
+	if (vpm->options.debug & DEBUG_ECHOCAN) 
+		printk(KERN_DEBUG "echocan: Channel is %d length 0\n", channo);
+
+	vpmadt032_check_and_schedule_update(vpm, channo);
+}
+EXPORT_SYMBOL(vpmadt032_echocan_free);
 
 struct vpmadt032 *vpmadt032_alloc(struct vpmadt032_options *options)
 {

Modified: linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.h
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.h?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.h (original)
+++ linux/team/sruffell/staging/drivers/dahdi/voicebus/GpakCust.h Mon Apr 27 14:44:18 2009
@@ -121,15 +121,19 @@
 };
 
 struct voicebus;
+struct dahdi_chan;
 struct dahdi_echocanparams;
 struct dahdi_echocanparam;
+struct dahdi_echocan_state;
 
 char vpmadt032tone_to_zaptone(GpakToneCodes_t tone);
 int vpmadt032_init(struct vpmadt032 *vpm, struct voicebus *vb);
 struct vpmadt032 *vpmadt032_alloc(struct vpmadt032_options *options);
 void vpmadt032_free(struct vpmadt032 *vpm);
-int vpmadt032_echocan_with_params(struct vpmadt032 *vpm, int channo,
+int vpmadt032_echocan_create(struct vpmadt032 *vpm, int channo,
 	struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p);
+void vpmadt032_echocan_free(struct vpmadt032 *vpm, struct dahdi_chan *chan,
+	struct dahdi_echocan_state *ec);
 
 /* If there is a command ready to go to the VPMADT032, return it, otherwise NULL */
 static inline struct vpmadt032_cmd *vpmadt032_get_ready_cmd(struct vpmadt032 *vpm)

Modified: linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/base.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/base.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/base.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/base.c Mon Apr 27 14:44:18 2009
@@ -114,6 +114,20 @@
 
 static struct devtype wcb4xxp = { "Wildcard B410P", 0 };
 
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+
+static const struct dahdi_echocan_features my_ec_features = {
+	.NLP_automatic = 1,
+	.CED_tx_detect = 1,
+	.CED_rx_detect = 1,
+};
+
+static const struct dahdi_echocan_ops my_ec_ops = {
+	.name = "HWEC",
+	.echocan_free = echocan_free,
+};
 
 #if 0
 static const char *wcb4xxp_rcsdata = "$RCSfile: base.c,v $ $Revision$";
@@ -1884,33 +1898,50 @@
 	}
 }
 
-static int b4xxp_echocan(struct dahdi_chan *chan, int eclen)
-{
-	struct b4xxp *b4 = chan->pvt;
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			  struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
+{
+	struct b4xxp_span *bspan = chan->span->pvt;
 	int channel;
-	int unit; 
-	
-	if (chan->chanpos != 3) 
-		unit = chan->chanpos - 1;
-	else
-		return 0;
-	
+
+	if (chan->chanpos == 3) {
+		printk(KERN_WARNING "Cannot enable echo canceller on D channel of span %d; failing request\n", chan->span->offset);
+		return -EINVAL;
+	}
+
+	if (ecp->param_count > 0) {
+		printk(KERN_WARNING "wcb4xxp echo canceller does not support parameters; failing request\n");
+		return -EINVAL;
+	}
+
+	*ec = &bspan->ec[chan->chanpos];
+	(*ec)->ops = &my_ec_ops;
+	(*ec)->features = my_ec_features;
+
+	if (DBG_EC)
+		printk("Enabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
+
 	channel = (chan->span->offset * 8) + ((chan->chanpos - 1) * 4) + 1;
 	
-	if (eclen) { /* Enable */
-		if (DBG_EC)
-	        	printk("Enabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
-	        ec_write(b4, unit, channel, 0x7e);
-	} else { /* Disable */
-		if (DBG_EC)
-	        	printk("Disabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
-	        ec_write(b4, unit, channel, 0x01);
-	}
+	ec_write(bspan->parent, chan->chanpos - 1, channel, 0x7e);
+
+	return 0;
+}
+
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
+{
+	struct b4xxp_span *bspan = chan->span->pvt;
+	int channel;
+
+	memset(ec, 0, sizeof(*ec));
+
+	if (DBG_EC)
+		printk("Disabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
+
+	channel = (chan->span->offset * 8) + ((chan->chanpos - 1) * 4) + 1;
 	
-	return 0;
-
-}
-
+	ec_write(bspan->parent, chan->chanpos - 1, channel, 0x01);
+}
 
 /*
  * Filesystem and DAHDI interfaces
@@ -2140,7 +2171,7 @@
 		bspan->span.ioctl = b4xxp_ioctl;
 		bspan->span.hdlc_hard_xmit = b4xxp_hdlc_hard_xmit;
 		if (vpmsupport)
-			bspan->span.echocan = b4xxp_echocan;
+			bspan->span.echocan_create = echocan_create;
 
 /* HDLC stuff */
 		bspan->sigchan = NULL;

Modified: linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/wcb4xxp.h
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/wcb4xxp.h?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/wcb4xxp.h (original)
+++ linux/team/sruffell/staging/drivers/dahdi/wcb4xxp/wcb4xxp.h Mon Apr 27 14:44:18 2009
@@ -411,6 +411,7 @@
 
 	struct dahdi_span span;			/* zaptel span info for this span */
 	struct dahdi_chan *chans[WCB4XXP_CHANNELS_PER_SPAN]; /* Individual channels */
+	struct dahdi_echocan_state ec[WCB4XXP_CHANNELS_PER_SPAN]; /* echocan state for each channel */
 	struct dahdi_chan _chans[WCB4XXP_CHANNELS_PER_SPAN]; /* Backing memory */
 };
 

Modified: linux/team/sruffell/staging/drivers/dahdi/wct4xxp/base.c
URL: http://svn.digium.com/svn-view/dahdi/linux/team/sruffell/staging/drivers/dahdi/wct4xxp/base.c?view=diff&rev=6511&r1=6510&r2=6511
==============================================================================
--- linux/team/sruffell/staging/drivers/dahdi/wct4xxp/base.c (original)
+++ linux/team/sruffell/staging/drivers/dahdi/wct4xxp/base.c Mon Apr 27 14:44:18 2009
@@ -283,6 +283,7 @@
 	struct work_struct swork;
 #endif	
 	struct dahdi_chan *chans[32];		/* Individual channels */
+	struct dahdi_echocan_state *ec[32];	/* Echocan state for each channel */
 };
 
 struct t4 {
@@ -345,12 +346,38 @@
 
 #define T4_VPM_PRESENT (1 << 28)
 
-
 #ifdef VPM_SUPPORT
 static void t4_vpm400_init(struct t4 *wc);
 static void t4_vpm450_init(struct t4 *wc);
 static void t4_vpm_set_dtmf_threshold(struct t4 *wc, unsigned int threshold);
-#endif
+
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			   struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+
+static const struct dahdi_echocan_features vpm400m_ec_features = {
+	.NLP_automatic = 1,
+	.CED_tx_detect = 1,
+	.CED_rx_detect = 1,
+};
+
+static const struct dahdi_echocan_features vpm450m_ec_features = {
+	.NLP_automatic = 1,
+	.CED_tx_detect = 1,
+	.CED_rx_detect = 1,
+};
+
+static const struct dahdi_echocan_ops vpm400m_ec_ops = {
+	.name = "VPM400M",
+	.echocan_free = echocan_free,
+};
+
+static const struct dahdi_echocan_ops vpm450m_ec_ops = {
+	.name = "VPM450M",
+	.echocan_free = echocan_free,
+};
+#endif
+
 static void __set_clear(struct t4 *wc, int span);
 static int t4_startup(struct dahdi_span *span);
 static int t4_shutdown(struct dahdi_span *span);
@@ -1089,42 +1116,83 @@
 	return unit;
 }
 
-static int t4_echocan(struct dahdi_chan *chan, int eclen)
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+			  struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
 {
 	struct t4 *wc = chan->pvt;
+	struct t4_span *tspan = chan->span->pvt;
 	int channel;
-	int unit;
-	
+	const struct dahdi_echocan_ops *ops;
+	const struct dahdi_echocan_features *features;
+
 	if (!wc->vpm)
 		return -ENODEV;
 
 	if (chan->span->offset >= vpmspans)
 		return -ENODEV;
 
-	if (wc->t1e1)
-		channel = chan->chanpos;
-	else
-		channel = chan->chanpos + 4;
+	if (wc->vpm450m) {
+		ops = &vpm450m_ec_ops;
+		features = &vpm450m_ec_features;
+	} else {
+		ops = &vpm400m_ec_ops;
+		features = &vpm400m_ec_features;
+	}
+
+	if (ecp->param_count > 0) {
+		printk(KERN_WARNING "%s echo canceller does not support parameters; failing request\n", ops->name);
+		return -EINVAL;
+	}
+
+	*ec = tspan->ec[chan->chanpos - 1];
+	(*ec)->ops = ops;
+	(*ec)->features = *features;
+
+	channel = wc->t1e1 ? chan->chanpos : chan->chanpos + 4;
+
 	if (wc->vpm450m) {
 		channel = channel << 2;
 		channel |= chan->span->offset;
-		if(debug & DEBUG_ECHOCAN) 
+		if (debug & DEBUG_ECHOCAN) 
 			printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, offset is %d length %d\n", 
-				wc->num, chan->chanpos, chan->span->offset, channel, eclen);
-		vpm450m_setec(wc->vpm450m, channel, eclen);
-// Mark		msleep(10);
-//		msleep(100); // longer test
+			       wc->num, chan->chanpos, chan->span->offset, channel, ecp->tap_length);
+		vpm450m_setec(wc->vpm450m, channel, ecp->tap_length);
 	} else {
-		unit = t4_vpm_unit(chan->span->offset, channel);
-		if(debug & DEBUG_ECHOCAN) 
+		int unit = t4_vpm_unit(chan->span->offset, channel);
+
+		if (debug & DEBUG_ECHOCAN) 
 			printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, unit is %d, unit offset is %d length %d\n", 
-				wc->num, chan->chanpos, chan->span->offset, unit, channel, eclen);
-		if (eclen)
-			t4_vpm_out(wc,unit,channel,0x3e);
-		else
-			t4_vpm_out(wc,unit,channel,0x01);
-	}
+			       wc->num, chan->chanpos, chan->span->offset, unit, channel, ecp->tap_length);
+		t4_vpm_out(wc, unit, channel, 0x3e);
+	}
+
 	return 0;
+}
+
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
+{
+	struct t4 *wc = chan->pvt;
+	int channel;
+
+	memset(ec, 0, sizeof(*ec));
+
+	channel = wc->t1e1 ? chan->chanpos : chan->chanpos + 4;
+
+	if (wc->vpm450m) {
+		channel = channel << 2;
+		channel |= chan->span->offset;
+		if (debug & DEBUG_ECHOCAN) 
+			printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, offset is %d length 0\n", 
+			       wc->num, chan->chanpos, chan->span->offset, channel);
+		vpm450m_setec(wc->vpm450m, channel, 0);
+	} else {
+		int unit = t4_vpm_unit(chan->span->offset, channel);
+
+		if (debug & DEBUG_ECHOCAN) 
+			printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, unit is %d, unit offset is %d length 0\n", 
+			       wc->num, chan->chanpos, chan->span->offset, unit, channel);
+		t4_vpm_out(wc, unit, channel, 0x01);
+	}
 }
 #endif
 
@@ -1593,7 +1661,7 @@
 		ts->span.hdlc_hard_xmit = t4_hdlc_hard_xmit;
 		if (gen2) {
 #ifdef VPM_SUPPORT
-			ts->span.echocan = t4_echocan;
+			ts->span.echocan_create = echocan_create;
 #endif			
 			ts->span.dacs = t4_dacs;
 		}
@@ -3494,6 +3562,8 @@
 			if (wc->tspans[x]->chans[y]) {

[... 389 lines stripped ...]



More information about the svn-commits mailing list