summaryrefslogtreecommitdiff
path: root/xpp/card_fxo.c
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-09-04 23:08:24 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2006-09-04 23:08:24 +0000
commit6e2fdc4fdd1f8be1c6d192d5230393489051e40d (patch)
tree048caacdd32831344b522e0a859a6b05d408721f /xpp/card_fxo.c
parent0305962c454019c63b6d69634e8301b9f199627b (diff)
Workaround spurious rings described in ticket:102 .
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@1392 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'xpp/card_fxo.c')
-rw-r--r--xpp/card_fxo.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c
index 25d3e95..d3bde57 100644
--- a/xpp/card_fxo.c
+++ b/xpp/card_fxo.c
@@ -253,7 +253,7 @@ static void do_sethook(xpd_t *xpd, int pos, bool offhook)
priv = xpd->priv;
BUG_ON(!priv);
if(!IS_SET(priv->battery, pos)) {
- DBG("%s/%s/%d: WARNING: called while battery is off\n", xpd->xbus->busname, xpd->xpdname, pos);
+ NOTICE("%s/%s/%d: WARNING: called while battery is off\n", xpd->xbus->busname, xpd->xpdname, pos);
}
spin_lock_irqsave(&xpd->lock, flags);
mark_ring(xpd, pos, 0); // No more rings
@@ -678,6 +678,11 @@ HANDLER_DEF(FXO, SIG_CHANGED)
spin_lock_irqsave(&xpd->lock, flags);
for_each_line(xpd, i) {
if(IS_SET(sig_toggles, i)) {
+ if(!IS_SET(priv->battery, i)) {
+ DBG("%s/%s/%d: battery is off. ignore false alarm.\n",
+ xbus->busname, xpd->xpdname, i);
+ continue;
+ }
if(IS_SET(sig_status, i)) {
#ifdef SOFT_RING
priv->ring_sig[i]=1; /* trigger register polling */
@@ -727,14 +732,14 @@ HANDLER_DEF(FXO, DAA_REPLY)
*/
if(IS_SET(priv->battery, i) && priv->battery_debounce[i]++ > BAT_DEBOUNCE) {
DBG("%s/%s: BATTERY OFF (%04X) voltage=%d\n", xpd->xbus->busname, xpd->xpdname, lines, bat);
- priv->battery &= ~lines;
+ BIT_CLR(priv->battery, i);
update_line_status(xpd, i, 0);
}
} else {
priv->battery_debounce[i] = 0;
if(!IS_SET(priv->battery, i)) {
DBG("%s/%s: BATTERY ON (%04X) voltage=%d\n", xpd->xbus->busname, xpd->xpdname, lines, bat);
- priv->battery |= lines;
+ BIT_SET(priv->battery, i);
update_line_status(xpd, i, 1);
}
}