diff options
Diffstat (limited to 'xpp/card_fxo.c')
-rw-r--r-- | xpp/card_fxo.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c index 70d6018..ff87120 100644 --- a/xpp/card_fxo.c +++ b/xpp/card_fxo.c @@ -417,6 +417,23 @@ int FXO_card_hooksig(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig) return 0; } +static int FXO_card_open(xpd_t *xpd, lineno_t chan) +{ + struct FXO_priv_data *priv; + + BUG_ON(!xpd); + priv = xpd->priv; + /* + * We pretend to have battery. If this is really the case + * than next calls to update_battery_status() won't change it. + * If we don't have battery, than on the next calls to + * update_battery_status() a battery_debounce[] cycle would start. + * Than, if no-battery is persistent, asterisk would be notified. + */ + BIT_SET(priv->battery, chan); + return 0; +} + static void poll_battery(xbus_t *xbus, xpd_t *xpd) { int i; @@ -634,13 +651,17 @@ static void update_battery_status(xpd_t *xpd, byte data_low, lineno_t chipsel) if(IS_SET(priv->battery, chipsel) && priv->battery_debounce[chipsel]++ > BAT_DEBOUNCE) { DBG("%s/%s/%d: BATTERY OFF voltage=%d\n", xpd->xbus->busname, xpd->xpdname, chipsel, bat); BIT_CLR(priv->battery, chipsel); - update_line_status(xpd, chipsel, 0); + if(SPAN_REGISTERED(xpd)) + zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_ALARM); + } } else { priv->battery_debounce[chipsel] = 0; if(!IS_SET(priv->battery, chipsel)) { DBG("%s/%s/%d: BATTERY ON voltage=%d\n", xpd->xbus->busname, xpd->xpdname, chipsel, bat); BIT_SET(priv->battery, chipsel); + if(SPAN_REGISTERED(xpd)) + zt_qevent_lock(&xpd->chans[chipsel], ZT_EVENT_NOALARM); } } /* @@ -700,7 +721,6 @@ static void update_power_denial(xpd_t *xpd, byte data_low, lineno_t chipsel) HANDLER_DEF(FXO, DAA_REPLY) { reg_cmd_t *info = &RPACKET_FIELD(pack, FXO, DAA_REPLY, regcmd); - unsigned long flags; struct FXO_priv_data *priv; lineno_t chipsel; @@ -709,7 +729,6 @@ HANDLER_DEF(FXO, DAA_REPLY) __FUNCTION__, cmd->name, XPD_NUM(pack->addr)); return -EPROTO; } - spin_lock_irqsave(&xpd->lock, flags); priv = xpd->priv; BUG_ON(!priv); chipsel = REG_FIELD(info, chipsel); @@ -734,7 +753,6 @@ HANDLER_DEF(FXO, DAA_REPLY) REG_FIELD(&xpd->requested_reply, subreg) == REG_FIELD(info, subreg)) { xpd->last_reply = *info; } - spin_unlock_irqrestore(&xpd->lock, flags); return 0; } @@ -757,12 +775,11 @@ xproto_table_t PROTO_TABLE(FXO) = { .card_hooksig = FXO_card_hooksig, .card_tick = FXO_card_tick, .card_ioctl = FXO_card_ioctl, + .card_open = FXO_card_open, .RING = XPROTO_CALLER(FXO, RING), .RELAY_OUT = XPROTO_CALLER(FXO, RELAY_OUT), .XPD_STATE = XPROTO_CALLER(FXO, XPD_STATE), - - .SYNC_SOURCE = XPROTO_CALLER(GLOBAL, SYNC_SOURCE), }, .packet_is_valid = fxo_packet_is_valid, .packet_dump = fxo_packet_dump, |