summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/dahdi/wct4xxp/base.c71
-rw-r--r--drivers/dahdi/wcte12xp/base.c44
2 files changed, 67 insertions, 48 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;
diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c
index a255ad0..6c6078f 100644
--- a/drivers/dahdi/wcte12xp/base.c
+++ b/drivers/dahdi/wcte12xp/base.c
@@ -76,6 +76,7 @@ static int vpmnlpmaxsupp = DEFAULT_NLPMAXSUPP;
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 int t1xxp_clear_maint(struct dahdi_span *span);
static const struct dahdi_echocan_features vpm150m_ec_features = {
.NLP_automatic = 1,
@@ -1109,23 +1110,14 @@ static int t1xxp_maint(struct dahdi_span *span, int cmd)
if (wc->spantype == TYPE_E1) {
switch (cmd) {
case DAHDI_MAINT_NONE:
- t1_info(wc, "XXX Turn off local and remote "
- "loops E1 XXX\n");
+ t1_info(wc, "Clearing all maint modes\n");
break;
case DAHDI_MAINT_LOCALLOOP:
- t1_info(wc, "XXX Turn on local loopback E1 XXX\n");
- break;
case DAHDI_MAINT_REMOTELOOP:
- t1_info(wc, "XXX Turn on remote loopback E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPUP:
- t1_info(wc, "XXX Send loopup code E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPDOWN:
- t1_info(wc, "XXX Send loopdown code E1 XXX\n");
- break;
case DAHDI_MAINT_LOOPSTOP:
- t1_info(wc, "XXX Stop sending loop codes E1 XXX\n");
+ t1_info(wc, "Looping not supported in E1 mode\n");
break;
default:
t1_info(wc, "Unknown E1 maint command: %d\n", cmd);
@@ -1134,33 +1126,33 @@ static int t1xxp_maint(struct dahdi_span *span, int cmd)
} else {
switch (cmd) {
case DAHDI_MAINT_NONE:
- /* Turn off local loop */
- reg = t1_getreg(wc, LIM0);
- t1_setreg(wc, LIM0, reg & ~LIM0_LL);
-
- /* Turn off remote loop & jitter attenuator */
- reg = t1_getreg(wc, LIM1);
- t1_setreg(wc, LIM1, reg & ~(LIM1_RL | LIM1_JATT));
+ t1xxp_clear_maint(span);
break;
case DAHDI_MAINT_LOCALLOOP:
+ t1xxp_clear_maint(span);
reg = t1_getreg(wc, LIM0);
t1_setreg(wc, LIM0, reg | LIM0_LL);
break;
case DAHDI_MAINT_NETWORKLINELOOP:
+ t1xxp_clear_maint(span);
reg = t1_getreg(wc, LIM1);
t1_setreg(wc, LIM1, reg | LIM1_RL);
break;
case DAHDI_MAINT_NETWORKPAYLOADLOOP:
+ t1xxp_clear_maint(span);
reg = t1_getreg(wc, LIM1);
t1_setreg(wc, LIM1, reg | (LIM1_RL | LIM1_JATT));
break;
case DAHDI_MAINT_LOOPUP:
+ t1xxp_clear_maint(span);
t1_setreg(wc, 0x21, 0x50);
break;
case DAHDI_MAINT_LOOPDOWN:
+ t1xxp_clear_maint(span);
t1_setreg(wc, 0x21, 0x60);
break;
case DAHDI_MAINT_LOOPSTOP:
+ t1xxp_clear_maint(span);
t1_setreg(wc, 0x21, 0x40);
break;
default:
@@ -1172,6 +1164,22 @@ static int t1xxp_maint(struct dahdi_span *span, int cmd)
return 0;
}
+static int t1xxp_clear_maint(struct dahdi_span *span)
+{
+ struct t1 *wc = span->pvt;
+ int reg = 0;
+
+ /* Turn off local loop */
+ reg = t1_getreg(wc, LIM0);
+ t1_setreg(wc, LIM0, reg & ~LIM0_LL);
+
+ /* Turn off remote loop & jitter attenuator */
+ reg = t1_getreg(wc, LIM1);
+ t1_setreg(wc, LIM1, reg & ~(LIM1_RL | LIM1_JATT));
+ return 0;
+}
+
+
static int t1xxp_open(struct dahdi_chan *chan)
{
return 0;