summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Meyerriecks <rmeyerreicks@digium.com>2010-07-26 20:14:48 +0000
committerRuss Meyerriecks <rmeyerreicks@digium.com>2010-07-26 20:14:48 +0000
commitd4bc33c24eedb87c405ed8f553d188ff23a23826 (patch)
tree788270548e4e4f020b37080eb9c16f0c3b054fda
parentb764ebded8f543d62e1a19463db7c2926b9b22e0 (diff)
Added the ability to trigger alarm simulation states in the
qfalc framer. Added some more verbose red alarm states in the upper byte of the alarm member of the dahdi_span structure Removed some unnecessary instrumentation regarding the enabling of the errored second and 1 second counters for performance collecting. Also added a couple comments. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@8997 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rw-r--r--drivers/dahdi/dahdi-base.c20
-rw-r--r--drivers/dahdi/wct4xxp/base.c57
-rw-r--r--drivers/dahdi/wct4xxp/wct4xxp.h9
-rw-r--r--include/dahdi/user.h24
4 files changed, 95 insertions, 15 deletions
diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c
index f3a677c..12d57a6 100644
--- a/drivers/dahdi/dahdi-base.c
+++ b/drivers/dahdi/dahdi-base.c
@@ -3483,6 +3483,7 @@ void dahdi_alarm_notify(struct dahdi_span *span)
int x;
span->alarms &= ~DAHDI_ALARM_LOOPBACK;
+ span->alarms &= ~DAHDI_ALARM_SYNC;
/* Determine maint status */
if (span->maintstat || span->mainttimer)
span->alarms |= DAHDI_ALARM_LOOPBACK;
@@ -3497,12 +3498,28 @@ void dahdi_alarm_notify(struct dahdi_span *span)
/* Switch to other master if current master in alarm */
for (x=1; x<maxspans; x++) {
if (spans[x] && !spans[x]->alarms && (spans[x]->flags & DAHDI_FLAG_RUNNING)) {
- if(master != spans[x])
+ if (master != spans[x]) {
module_printk(KERN_NOTICE, "Master changed to %s\n", spans[x]->name);
+ span->alarms |= DAHDI_ALARM_SYNC;
+ }
master = spans[x];
break;
}
}
+
+ /* XXX: Remove - Report more detailed alarms */
+ if (span->alarms & DAHDI_ALARM_LOS)
+ module_printk(KERN_NOTICE, "Span %d: Loss of signal\n", span->spanno);
+ if (span->alarms & DAHDI_ALARM_LFA)
+ module_printk(KERN_NOTICE, "Span %d: Loss of Frame Alignment\n", span->spanno);
+ if (span->alarms & DAHDI_ALARM_LMFA)
+ module_printk(KERN_NOTICE, "Span %d: Loss of Multi-Frame Alignment\n", span->spanno);
+ if (span->alarms & DAHDI_ALARM_XLS)
+ module_printk(KERN_NOTICE, "Span %d: Transmit Line Short\n", span->spanno);
+ if (span->alarms & DAHDI_ALARM_XLO)
+ module_printk(KERN_NOTICE, "Span %d: Transmit Line Open\n", span->spanno);
+ if (span->alarms & DAHDI_ALARM_SYNC)
+ module_printk(KERN_NOTICE, "Span %d: Change of syncronization signal\n", span->spanno);
}
}
@@ -4552,6 +4569,7 @@ static int dahdi_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long da
case DAHDI_MAINT_BIPOLAR_DEFECT:
case DAHDI_MAINT_PRBS:
case DAHDI_RESET_COUNTERS:
+ case DAHDI_MAINT_ALARM_SIM:
/* Prevent notifying an alarm state for generic
maintenance functions, unless the driver is
already in a maint state */
diff --git a/drivers/dahdi/wct4xxp/base.c b/drivers/dahdi/wct4xxp/base.c
index 77ef562..6d83c0e 100644
--- a/drivers/dahdi/wct4xxp/base.c
+++ b/drivers/dahdi/wct4xxp/base.c
@@ -462,6 +462,8 @@ static void t4_check_sigbits(struct t4 *wc, int span);
#define LIM1_T 0x37 /* Line interface mode 1 register */
#define LIM1_RL (1 << 1) /* Remote Loop */
+#define FMR0 0x1C /* Framer Mode Register 0 */
+#define FMR0_SIM (1 << 0) /* Alarm Simulation */
#define FMR1_T 0x1D /* Framer Mode Register 1 */
#define FMR1_ECM (1 << 2) /* Error Counter 1sec Interrupt Enable */
#define DEC_T 0x60 /* Diable Error Counter */
@@ -1437,6 +1439,7 @@ static int t4_maint(struct dahdi_span *span, int cmd)
struct t4_span *ts = container_of(span, struct t4_span, span);
struct t4 *wc = ts->owner;
unsigned int reg;
+ unsigned long flags;
if (ts->spantype == TYPE_E1) {
switch(cmd) {
@@ -1458,6 +1461,11 @@ static int t4_maint(struct dahdi_span *span, int cmd)
dev_info(&wc->dev->dev,
"Only local loop supported in E1 mode\n");
return -ENOSYS;
+ case DAHDI_MAINT_ALARM_SIM:
+ dev_info(&wc->dev->dev, "Invoking alarm state");
+ reg = t4_framer_in(wc, span->offset, FMR0);
+ t4_framer_out(wc, span->offset, FMR0, (reg|FMR0_SIM));
+ break;
default:
dev_info(&wc->dev->dev,
"Unknown E1 maint command: %d\n", cmd);
@@ -1545,6 +1553,25 @@ static int t4_maint(struct dahdi_span *span, int cmd)
case DAHDI_RESET_COUNTERS:
t4_reset_counters(span);
break;
+ case DAHDI_MAINT_ALARM_SIM:
+// dev_info(&wc->dev->dev, "Invoking alarm state\n");
+ reg = t4_framer_in(wc, span->offset, FMR0);
+ //dev_info(&wc->dev->dev, "FMR0: %X\n", reg);
+
+ // The alarm simulation state machine requires us to bring this bit
+ // up and down for at least 1 clock cycle
+ // lock register writes to ensure nobody else tries to write to FMR0, while we delay
+ spin_lock_irqsave(&wc->reglock, flags);
+ __t4_framer_out(wc, span->offset, FMR0, (reg|FMR0_SIM));
+ udelay(1);
+ __t4_framer_out(wc, span->offset, FMR0, (reg&~FMR0_SIM));
+ udelay(1);
+ spin_unlock_irqrestore(&wc->reglock, flags);
+
+ //dev_info(&wc->dev->dev, "FMR0: %X\n", reg|FMR0_SIM);
+ reg = t4_framer_in(wc, span->offset, 0x4e);
+ dev_info(&wc->dev->dev, "FRS2(alarm state): %d\n", ((reg&0xe0)>> 5));
+ break;
default:
dev_info(&wc->dev->dev, "Unknown T1 maint command:%d\n",
cmd);
@@ -1952,12 +1979,9 @@ static void init_spans(struct t4 *wc)
/* Enable 1sec timer interrupt */
reg = t4_framer_in(wc, x, FMR1_T);
t4_framer_out(wc, x, FMR1_T, (reg | FMR1_ECM));
- dev_info(&wc->dev->dev, "Enabled 1sec error counter "\
- "interrupt\n");
/* Enable Errored Second interrupt */
t4_framer_out(wc, x, ESM, 0);
- dev_info(&wc->dev->dev, "Enabled errored second interrupt\n");
t4_reset_counters(&ts->span);
@@ -2883,6 +2907,7 @@ static void t4_check_alarms(struct t4 *wc, int span)
alarms |= DAHDI_ALARM_NOTOPEN;
}
+ /* Loss of Frame Alignment */
if (c & 0x20) {
if (ts->alarmcount >= alarmdebounce) {
@@ -2903,7 +2928,8 @@ static void t4_check_alarms(struct t4 *wc, int span)
} else
ts->alarmcount = 0;
- if (c & 0x80) { /* LOS */
+ /* Loss of Signal */
+ if (c & 0x80) {
if (ts->losalarmcount >= losalarmdebounce) {
/* Disable Slip Interrupts */
e = __t4_framer_in(wc, span, 0x17);
@@ -2922,7 +2948,8 @@ static void t4_check_alarms(struct t4 *wc, int span)
} else
ts->losalarmcount = 0;
- if (c & 0x40) { /* AIS */
+ /* Alarm Indication Signal */
+ if (c & 0x40) {
if (ts->aisalarmcount >= aisalarmdebounce)
alarms |= DAHDI_ALARM_BLUE;
else {
@@ -2937,6 +2964,19 @@ static void t4_check_alarms(struct t4 *wc, int span)
} else
ts->aisalarmcount = 0;
+ /* Add detailed alarm status information to a red alarm state */
+ if (alarms & DAHDI_ALARM_RED) {
+ if (c & FRS0_LOS)
+ alarms |= DAHDI_ALARM_LOS;
+ if (c & FRS0_LFA)
+ alarms |= DAHDI_ALARM_LFA;
+ if (c & FRS0_LMFA)
+ alarms |= DAHDI_ALARM_LMFA;
+ if (d & FRS1_XLS)
+ alarms |= DAHDI_ALARM_XLS;
+ if (d & FRS1_XLO)
+ alarms |= DAHDI_ALARM_XLO;
+ }
if (((!ts->span.alarms) && alarms) ||
(ts->span.alarms && (!alarms)))
@@ -3112,6 +3152,7 @@ static inline void t4_framer_interrupt(struct t4 *wc, int span)
gis, isr0, isr1, isr2, isr3, isr4, wc->intcount);
}
+ /* Collect performance counters once per second */
if (isr3 & ISR3_SEC) {
ts->span.count.fe += t4_framer_in(wc, span, FECL_T);
ts->span.count.crc4 += t4_framer_in(wc, span, CEC1L_T);
@@ -3121,6 +3162,7 @@ static inline void t4_framer_interrupt(struct t4 *wc, int span)
ts->span.count.prbs = t4_framer_in(wc, span, FRS1_T);
}
+ /* Collect errored second counter once per second */
if (isr3 & ISR3_ES) {
ts->span.count.errsec += 1;
}
@@ -3145,7 +3187,10 @@ static inline void t4_framer_interrupt(struct t4 *wc, int span)
} else {
/* T1 checks */
if (isr2 || (isr3 & 0x08)) {
- printk("card %d span %d: isr2=%x isr3=%x\n", wc->num, span, isr2, isr3);
+ if (debug & DEBUG_MAIN) {
+ printk("card %d span %d: isr2=%x isr3=%x\n",
+ wc->num, span, isr2, isr3);
+ }
t4_check_alarms(wc, span);
}
}
diff --git a/drivers/dahdi/wct4xxp/wct4xxp.h b/drivers/dahdi/wct4xxp/wct4xxp.h
index fb12173..7a53238 100644
--- a/drivers/dahdi/wct4xxp/wct4xxp.h
+++ b/drivers/dahdi/wct4xxp/wct4xxp.h
@@ -96,6 +96,15 @@
#define FRMR_SIS_XFW 0x40
#define FRMR_TXFIFO 0x00
+#define FRS0 0x4c
+#define FRS0_LOS (1<<7)
+#define FRS0_LFA (1<<5)
+#define FRS0_LMFA (1<<1)
+
+#define FRS1 0x4d
+#define FRS1_XLS (1<<1)
+#define FRS1_XLO (1<<0)
+
#define NUM_REGS 0xa9
#define NUM_PCI 12
diff --git a/include/dahdi/user.h b/include/dahdi/user.h
index 84cae22..6417e79 100644
--- a/include/dahdi/user.h
+++ b/include/dahdi/user.h
@@ -314,13 +314,20 @@ enum {
#define DAHDI_CONF_PSEUDO_TALKER 0x800 /* pseudo is a talker on the conference */
/* Alarm Condition bits */
-#define DAHDI_ALARM_NONE 0 /* No alarms */
-#define DAHDI_ALARM_RECOVER 1 /* Recovering from alarm */
-#define DAHDI_ALARM_LOOPBACK 2 /* In loopback */
-#define DAHDI_ALARM_YELLOW 4 /* Yellow Alarm */
-#define DAHDI_ALARM_RED 8 /* Red Alarm */
-#define DAHDI_ALARM_BLUE 16 /* Blue Alarm */
-#define DAHDI_ALARM_NOTOPEN 32
+#define DAHDI_ALARM_NONE 0 /* No alarms */
+#define DAHDI_ALARM_RECOVER (1 << 0) /* Recovering from alarm */
+#define DAHDI_ALARM_LOOPBACK (1 << 1) /* In loopback */
+#define DAHDI_ALARM_YELLOW (1 << 2) /* Yellow Alarm */
+#define DAHDI_ALARM_RED (1 << 3) /* Red Alarm */
+#define DAHDI_ALARM_BLUE (1 << 4) /* Blue Alarm */
+#define DAHDI_ALARM_NOTOPEN (1 << 5)
+/* Verbose alarm states (upper byte) */
+#define DAHDI_ALARM_LOS (1 << 8) /* Loss of Signal */
+#define DAHDI_ALARM_LFA (1 << 9) /* Loss of Frame Alignment */
+#define DAHDI_ALARM_LMFA (1 << 10) /* Loss of Multi-Frame Alignment */
+#define DAHDI_ALARM_XLS (1 << 11) /* Transmit line Short */
+#define DAHDI_ALARM_XLO (1 << 12) /* Transmit line Open */
+#define DAHDI_ALARM_SYNC (1 << 13) /* Loss of Sync source */
/* Maintenance modes */
#define DAHDI_MAINT_NONE 0 /* Normal Mode */
@@ -338,7 +345,8 @@ enum {
#define DAHDI_MAINT_BIPOLAR_DEFECT 11 /* insert a FAS defect */
#define DAHDI_MAINT_PRBS 12 /* enable the PRBS gen/mon */
#define DAHDI_MAINT_NETWORKPAYLOADLOOP 13 /* Remote Loopback */
-#define DAHDI_RESET_COUNTERS 14 /* clear the error counters */
+#define DAHDI_RESET_COUNTERS 14 /* Clear the error counters */
+#define DAHDI_MAINT_ALARM_SIM 15 /* Simulate alarms */
/* Flag Value for IOMUX, read avail */
#define DAHDI_IOMUX_READ 1