[zaptel-commits] kpfleming: branch 1.4 r3718 - in /branches/1.4: ./ wctdm24xxp/

SVN commits to the Zaptel project zaptel-commits at lists.digium.com
Tue Jan 22 11:11:15 CST 2008


Author: kpfleming
Date: Mon Jan 21 15:51:39 2008
New Revision: 3718

URL: http://svn.digium.com/view/zaptel?view=rev&rev=3718
Log:
Report battery loss on FXO ports of analog cards as a 'red alarm' on the respective channel.

(closes issue #8290)
Reported by: tmarkov
Patches:
      8290-alarm-total_1_4_rev3705 uploaded by meneault
Tested by: flefoll


Modified:
    branches/1.4/wctdm.c
    branches/1.4/wctdm24xxp/base.c
    branches/1.4/zaptel-base.c

Change Statistics:
 0 files changed

Modified: branches/1.4/wctdm.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/wctdm.c?view=diff&rev=3718&r1=3717&r2=3718
==============================================================================
--- branches/1.4/wctdm.c (original)
+++ branches/1.4/wctdm.c Mon Jan 21 15:51:39 2008
@@ -862,7 +862,7 @@
 		if (fwringdetect) {
 			res = wc->reg0shadow[card] & 0x60;
 			if (wc->mod[card].fxo.ringdebounce--) {
-				if (res && (res != wc->mod[card].fxo.lastrdtx) && wc->mod[card].fxo.battery) {
+				if (res && (res != wc->mod[card].fxo.lastrdtx) && (wc->mod[card].fxo.battery == 1)) {
 					if (!wc->mod[card].fxo.wasringing) {
 						wc->mod[card].fxo.wasringing = 1;
 						if (debug)
@@ -879,13 +879,13 @@
 						zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK);
 					}
 				}
-			} else if (res && wc->mod[card].fxo.battery) {
+			} else if (res && (wc->mod[card].fxo.battery == 1)) {
 				wc->mod[card].fxo.lastrdtx = res;
 				wc->mod[card].fxo.ringdebounce = 10;
 			}
 		} else {
 			res = wc->reg0shadow[card];
-			if ((res & 0x60) && wc->mod[card].fxo.battery) {
+			if ((res & 0x60) && (wc->mod[card].fxo.battery == 1)) {
 				wc->mod[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16);
 				if (wc->mod[card].fxo.ringdebounce >= ZT_CHUNKSIZE * ringdebounce) {
 					if (!wc->mod[card].fxo.wasringing) {
@@ -924,7 +924,7 @@
 	if (abs(b) < battthresh) {
 		wc->mod[card].fxo.nobatttimer++;
 #if 0
-		if (wc->mod[card].fxo.battery)
+		if (wc->mod[card].fxo.battery == 1)
 			printk("Battery loss: %d (%d debounce)\n", b, wc->mod[card].fxo.battdebounce);
 #endif
 		if (wc->mod[card].fxo.battery && !wc->mod[card].fxo.battdebounce) {
@@ -942,12 +942,13 @@
 			}
 #else
 			zt_hooksig(&wc->chans[card], ZT_RXSIG_ONHOOK);
+			zt_alarm_channel(&wc->chans[card], ZT_ALARM_RED);
 #endif
 			wc->mod[card].fxo.battdebounce = battdebounce;
 		} else if (!wc->mod[card].fxo.battery)
 			wc->mod[card].fxo.battdebounce = battdebounce;
 	} else if (abs(b) > battthresh) {
-		if (!wc->mod[card].fxo.battery && !wc->mod[card].fxo.battdebounce) {
+		if ((wc->mod[card].fxo.battery < 1) && !wc->mod[card].fxo.battdebounce) {
 			if (debug)
 				printk("BATTERY on %d/%d (%s)!\n", wc->span.spanno, card + 1, 
 					(b < 0) ? "-" : "+");			    
@@ -960,11 +961,12 @@
 			}
 #else
 			zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK);
+			zt_alarm_channel(&wc->chans[card], ZT_ALARM_NONE);
 #endif
 			wc->mod[card].fxo.battery = 1;
 			wc->mod[card].fxo.nobatttimer = 0;
 			wc->mod[card].fxo.battdebounce = battdebounce;
-		} else if (wc->mod[card].fxo.battery)
+		} else if (wc->mod[card].fxo.battery == 1)
 			wc->mod[card].fxo.battdebounce = battdebounce;
 
 		if (wc->mod[card].fxo.lastpol >= 0) {
@@ -1605,6 +1607,9 @@
 	if(debug)
 		printk("DEBUG fxotxgain:%i.%i fxorxgain:%i.%i\n", (wctdm_getreg(wc, card, 38)/16)?-(wctdm_getreg(wc, card, 38) - 16) : wctdm_getreg(wc, card, 38), (wctdm_getreg(wc, card, 40)/16)? -(wctdm_getreg(wc, card, 40) - 16):wctdm_getreg(wc, card, 40), (wctdm_getreg(wc, card, 39)/16)? -(wctdm_getreg(wc, card, 39) - 16) : wctdm_getreg(wc, card, 39),(wctdm_getreg(wc, card, 41)/16)?-(wctdm_getreg(wc, card, 41) - 16):wctdm_getreg(wc, card, 41));
 
+	/* battery state still unknown */
+	wc->mod[card].fxo.battery = -1;
+	
 	return 0;
 		
 }
@@ -1617,16 +1622,16 @@
 	int x;
 	int fxsmode=0;
 
+	/* Sanity check the ProSLIC */
+	if (!sane && wctdm_proslic_insane(wc, card))
+		return -2;
+		
 	/* By default, don't send on hook */
 	if (reversepolarity)
 		wc->mod[card].fxs.idletxhookstate = 5;
 	else
 		wc->mod[card].fxs.idletxhookstate = 1;
 
-	/* Sanity check the ProSLIC */
-	if (!sane && wctdm_proslic_insane(wc, card))
-		return -2;
-		
 	if (sane) {
 		/* Make sure we turn off the DC->DC converter to prevent anything from blowing up */
 		wctdm_setreg(wc, card, 14, 0x10);

Modified: branches/1.4/wctdm24xxp/base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/wctdm24xxp/base.c?view=diff&rev=3718&r1=3717&r2=3718
==============================================================================
--- branches/1.4/wctdm24xxp/base.c (original)
+++ branches/1.4/wctdm24xxp/base.c Mon Jan 21 15:51:39 2008
@@ -1332,7 +1332,7 @@
 		if (fwringdetect) {
 			res =  wc->cmdq[card].isrshadow[0] & 0x60;
 			if (wc->mods[card].fxo.ringdebounce--) {
-				if (res && (res != wc->mods[card].fxo.lastrdtx) && wc->mods[card].fxo.battery) {
+				if (res && (res != wc->mods[card].fxo.lastrdtx) && (wc->mods[card].fxo.battery == 1)) {
 					if (!wc->mods[card].fxo.wasringing) {
 						wc->mods[card].fxo.wasringing = 1;
 						if (debug)
@@ -1349,13 +1349,13 @@
 						zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK);
 					}
 				}
-			} else if (res && wc->mods[card].fxo.battery) {
+			} else if (res && (wc->mods[card].fxo.battery == 1)) {
 				wc->mods[card].fxo.lastrdtx = res;
 				wc->mods[card].fxo.ringdebounce = 10;
 			}
 		} else {
 			res =  wc->cmdq[card].isrshadow[0];
-			if ((res & 0x60) && wc->mods[card].fxo.battery) {
+			if ((res & 0x60) && (wc->mods[card].fxo.battery == 1)) {
 				wc->mods[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16);
 				if (wc->mods[card].fxo.ringdebounce >= ZT_CHUNKSIZE * ringdebounce) {
 					if (!wc->mods[card].fxo.wasringing) {
@@ -1393,7 +1393,7 @@
 	if (abs(b) < battthresh) {
 		wc->mods[card].fxo.nobatttimer++;
 #if 0
-		if (wc->mods[card].fxo.battery)
+		if (wc->mods[card].fxo.battery == 1)
 			printk("Battery loss: %d (%d debounce)\n", b, wc->mods[card].fxo.battdebounce);
 #endif
 		if (wc->mods[card].fxo.battery && !wc->mods[card].fxo.battdebounce) {
@@ -1411,12 +1411,13 @@
 			}
 #else
 			zt_hooksig(&wc->chans[card], ZT_RXSIG_ONHOOK);
+			zt_alarm_channel(&wc->chans[card], ZT_ALARM_RED);
 #endif
 			wc->mods[card].fxo.battdebounce = battdebounce;
 		} else if (!wc->mods[card].fxo.battery)
 			wc->mods[card].fxo.battdebounce = battdebounce;
 	} else if (abs(b) > battthresh) {
-		if (!wc->mods[card].fxo.battery && !wc->mods[card].fxo.battdebounce) {
+		if ((wc->mods[card].fxo.battery < 1) && !wc->mods[card].fxo.battdebounce) {
 			if (debug & DEBUG_CARD)
 				printk("BATTERY on %d/%d (%s)!\n", wc->span.spanno, card + 1, 
 					(b < 0) ? "-" : "+");			    
@@ -1429,11 +1430,12 @@
 			}
 #else
 			zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK);
+			zt_alarm_channel(&wc->chans[card], ZT_ALARM_NONE);
 #endif
 			wc->mods[card].fxo.battery = 1;
 			wc->mods[card].fxo.nobatttimer = 0;
 			wc->mods[card].fxo.battdebounce = battdebounce;
-		} else if (wc->mods[card].fxo.battery)
+		} else if (wc->mods[card].fxo.battery == 1)
 			wc->mods[card].fxo.battdebounce = battdebounce;
 
 		if (wc->mods[card].fxo.lastpol >= 0) {
@@ -2183,6 +2185,9 @@
 	if(debug)
 		printk("DEBUG fxotxgain:%i.%i fxorxgain:%i.%i\n", (wctdm_getreg(wc, card, 38)/16) ? -(wctdm_getreg(wc, card, 38) - 16) : wctdm_getreg(wc, card, 38), (wctdm_getreg(wc, card, 40)/16) ? -(wctdm_getreg(wc, card, 40) - 16) : wctdm_getreg(wc, card, 40), (wctdm_getreg(wc, card, 39)/16) ? -(wctdm_getreg(wc, card, 39) - 16): wctdm_getreg(wc, card, 39), (wctdm_getreg(wc, card, 41)/16)?-(wctdm_getreg(wc, card, 41) - 16) : wctdm_getreg(wc, card, 41));
 	
+	/* battery state still unknown */
+	wc->mods[card].fxo.battery = -1;
+
 	return 0;
 		
 }
@@ -2197,14 +2202,14 @@
 
 	if (wc->modtype[card & 0xfc] == MOD_TYPE_QRV) return -2;
 
+	/* Sanity check the ProSLIC */
+	if (!sane && wctdm_proslic_insane(wc, card))
+		return -2;
+
 	/* By default, don't send on hook */
 	wc->mods[card].fxs.idletxhookstate = 1;
 	wc->mods[card].fxs.lasttxhook = 0x10;
 
-	/* Sanity check the ProSLIC */
-	if (!sane && wctdm_proslic_insane(wc, card))
-		return -2;
-		
 	if (sane) {
 		/* Make sure we turn off the DC->DC converter to prevent anything from blowing up */
 		wctdm_setreg(wc, card, 14, 0x10);

Modified: branches/1.4/zaptel-base.c
URL: http://svn.digium.com/view/zaptel/branches/1.4/zaptel-base.c?view=diff&rev=3718&r1=3717&r2=3718
==============================================================================
--- branches/1.4/zaptel-base.c (original)
+++ branches/1.4/zaptel-base.c Mon Jan 21 15:51:39 2008
@@ -2899,10 +2899,14 @@
 
 void zt_alarm_channel(struct zt_chan *chan, int alarms)
 {
+	unsigned long flags;
+
+	spin_lock_irqsave(&chan->lock, flags);
 	if (chan->chan_alarms != alarms) {
 		chan->chan_alarms = alarms;
-		zt_qevent_lock(chan, alarms ? ZT_EVENT_ALARM : ZT_EVENT_NOALARM);
-	}
+		zt_qevent_nolock(chan, alarms ? ZT_EVENT_ALARM : ZT_EVENT_NOALARM);
+	}
+	spin_unlock_irqrestore(&chan->lock, flags);
 }
 
 void zt_alarm_notify(struct zt_span *span)




More information about the zaptel-commits mailing list