summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wct4xxp/base.c
diff options
context:
space:
mode:
authorRuss Meyerriecks <rmeyerreicks@digium.com>2010-03-08 16:49:50 +0000
committerRuss Meyerriecks <rmeyerreicks@digium.com>2010-03-08 16:49:50 +0000
commit65d996aea1dec7dfc9e84fd789d60671355d3960 (patch)
tree780d91096b3c8e111b39cd0717a1ef5749b76197 /drivers/dahdi/wct4xxp/base.c
parent2c722eb3f844cb3365079d76dd63204572e07c60 (diff)
wct4xxp: wcte12xp: Revised maint clearing
Looping modes are now mutually exclusive. If two looping modes are enabled simultaneously it tends to hose up our framer chip. Now, all looping modes are cleared in the driver before any are set. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8274 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/wct4xxp/base.c')
-rw-r--r--drivers/dahdi/wct4xxp/base.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/drivers/dahdi/wct4xxp/base.c b/drivers/dahdi/wct4xxp/base.c
index 116b0e3..62456f4 100644
--- a/drivers/dahdi/wct4xxp/base.c
+++ b/drivers/dahdi/wct4xxp/base.c
@@ -412,6 +412,7 @@ static int t4_startup(struct dahdi_span *span);
static int t4_shutdown(struct dahdi_span *span);
static int t4_rbsbits(struct dahdi_chan *chan, int bits);
static int t4_maint(struct dahdi_span *span, int cmd);
+static int t4_clear_maint(struct dahdi_span *span);
static int t4_reset_counters(struct dahdi_span *span);
#ifdef SUPPORT_GEN1
static int t4_reset_dma(struct t4 *wc);
@@ -1435,78 +1436,61 @@ static int t4_maint(struct dahdi_span *span, int cmd)
if (ts->spantype == TYPE_E1) {
switch(cmd) {
case DAHDI_MAINT_NONE:
- printk(KERN_INFO "XXX Turn off local and remote loops E1 XXX\n");
+ dev_info(&wc->dev->dev, "Clearing all maint modes\n");
break;
case DAHDI_MAINT_LOCALLOOP:
- printk(KERN_INFO "XXX Turn on local loopback E1 XXX\n");
- break;
case DAHDI_MAINT_REMOTELOOP:
- printk(KERN_INFO "XXX Turn on remote loopback E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPUP:
- printk(KERN_INFO "XXX Send loopup code E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPDOWN:
- printk(KERN_INFO "XXX Send loopdown code E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPSTOP:
- printk(KERN_INFO "XXX Stop sending loop codes E1 XXX\n");
+ dev_info(&wc->dev->dev,
+ "Looping not supported in E1 mode\n");
break;
default:
- printk(KERN_NOTICE "TE%dXXP: Unknown E1 maint command: %d\n", wc->numspans, cmd);
+ dev_info(&wc->dev->dev,
+ "Unknown E1 maint command: %d\n", cmd);
break;
}
} else {
switch(cmd) {
case DAHDI_MAINT_NONE:
- dev_info(&wc->dev->dev, "Turning off all looping\n");
-
- reg = t4_framer_in(wc, span->offset, LIM0_T);
- t4_framer_out(wc, span->offset,
- LIM0_T, (reg & ~LIM0_LL));
-
- reg = t4_framer_in(wc, span->offset, LIM1_T);
- t4_framer_out(wc, span->offset, LIM1_T,
- (reg & ~LIM1_RL));
-
- reg = t4_framer_in(wc, span->offset, LCR1_T);
- t4_framer_out(wc, span->offset, LCR1_T,
- (reg & ~(XPRBS | EPRM)));
-
- reg = t4_framer_in(wc, span->offset, FMR2_T);
- t4_framer_out(wc, span->offset, FMR2_T,
- (reg & ~FMR2_PLB));
-
- span->mainttimer = 0;
+ dev_info(&wc->dev->dev, "Clearing all maint modes\n");
+ t4_clear_maint(span);
break;
case DAHDI_MAINT_LOCALLOOP:
dev_info(&wc->dev->dev,
"Turning on local loopback\n");
+ t4_clear_maint(span);
reg = t4_framer_in(wc, span->offset, LIM0_T);
t4_framer_out(wc, span->offset, LIM0_T, (reg|LIM0_LL));
break;
case DAHDI_MAINT_NETWORKLINELOOP:
dev_info(&wc->dev->dev,
"Turning on network line loopback\n");
+ t4_clear_maint(span);
reg = t4_framer_in(wc, span->offset, LIM1_T);
t4_framer_out(wc, span->offset, LIM1_T, (reg|LIM1_RL));
break;
case DAHDI_MAINT_NETWORKPAYLOADLOOP:
dev_info(&wc->dev->dev,
"Turning on network payload loopback\n");
+ t4_clear_maint(span);
reg = t4_framer_in(wc, span->offset, FMR2_T);
t4_framer_out(wc, span->offset, FMR2_T, (reg|FMR2_PLB));
break;
case DAHDI_MAINT_LOOPUP:
dev_info(&wc->dev->dev, "Transmitting loopup code\n");
+ t4_clear_maint(span);
t4_framer_out(wc, span->offset, 0x21, 0x50);
break;
case DAHDI_MAINT_LOOPDOWN:
dev_info(&wc->dev->dev, "Transmitting loopdown code\n");
+ t4_clear_maint(span);
t4_framer_out(wc, span->offset, 0x21, 0x60);
break;
case DAHDI_MAINT_LOOPSTOP:
dev_info(&wc->dev->dev, "Transmitting loopstop code\n");
+ t4_clear_maint(span);
t4_framer_out(wc, span->offset, 0x21, 0x40);
break;
case DAHDI_MAINT_FAS_DEFECT:
@@ -1558,6 +1542,33 @@ static int t4_maint(struct dahdi_span *span, int cmd)
return 0;
}
+static int t4_clear_maint(struct dahdi_span *span)
+{
+ struct t4_span *ts = span->pvt;
+ struct t4 *wc = ts->owner;
+ unsigned int reg;
+
+ /* Clear local loop */
+ reg = t4_framer_in(wc, span->offset, LIM0_T);
+ t4_framer_out(wc, span->offset, LIM0_T, (reg & ~LIM0_LL));
+
+ /* Clear Remote Loop */
+ reg = t4_framer_in(wc, span->offset, LIM1_T);
+ t4_framer_out(wc, span->offset, LIM1_T, (reg & ~LIM1_RL));
+
+ /* Clear Remote Payload Loop */
+ reg = t4_framer_in(wc, span->offset, FMR2_T);
+ t4_framer_out(wc, span->offset, FMR2_T, (reg & ~FMR2_PLB));
+
+ /* Clear PRBS */
+ reg = t4_framer_in(wc, span->offset, LCR1_T);
+ t4_framer_out(wc, span->offset, LCR1_T, (reg & ~(XPRBS | EPRM)));
+
+ span->mainttimer = 0;
+
+ return 0;
+}
+
static int t4_reset_counters(struct dahdi_span *span)
{
struct t4_span *ts = span->pvt;