summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wct4xxp/base.c
diff options
context:
space:
mode:
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;