summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xpp/card_fxo.c2
-rw-r--r--xpp/xpp_zap.c47
-rw-r--r--xpp/xpp_zap.h1
3 files changed, 13 insertions, 37 deletions
diff --git a/xpp/card_fxo.c b/xpp/card_fxo.c
index 56ed05a..0a7da3d 100644
--- a/xpp/card_fxo.c
+++ b/xpp/card_fxo.c
@@ -204,11 +204,13 @@ static void mark_ring(xpd_t *xpd, lineno_t pos, bool on)
DBG("%s/%s/%d: START\n", xpd->xbus->busname, xpd->xpdname, pos);
xpd->ringing[pos] = 1;
MARK_BLINK(priv, pos, LED_GREEN, LED_BLINK);
+ update_zap_ring(xpd, pos, 1);
} else if(!on && xpd->ringing[pos]) {
DBG("%s/%s/%d: STOP\n", xpd->xbus->busname, xpd->xpdname, pos);
xpd->ringing[pos] = 0;
if(IS_BLINKING(priv, pos, LED_GREEN))
MARK_BLINK(priv, pos, LED_GREEN, 0);
+ update_zap_ring(xpd, pos, 0);
}
}
diff --git a/xpp/xpp_zap.c b/xpp/xpp_zap.c
index 3aad1d4..02604f5 100644
--- a/xpp/xpp_zap.c
+++ b/xpp/xpp_zap.c
@@ -79,7 +79,6 @@ DEF_PARM(bool, zap_autoreg, 1, "Register spans automatically (1) or not (0)");
static int zaptel_register_xpd(xpd_t *xpd);
static int zaptel_unregister_xpd(xpd_t *xpd);
-static void xpp_ring_generate(xpd_t *xpd);
static void xpp_transmitprep(xpd_t *xpd);
static void xpp_receiveprep(xpd_t *xpd);
static int xpd_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data);
@@ -178,8 +177,6 @@ void xpp_tick(unsigned long param)
CALL_XMETHOD(card_tick, xbus, xpd);
if(!SPAN_REGISTERED(xpd))
continue;
- if(xpd->direction == TO_PSTN)
- xpp_ring_generate(xpd);
xpp_transmitprep(xpd);
xpp_receiveprep(xpd);
}
@@ -638,43 +635,18 @@ void update_line_status(xpd_t *xpd, int pos, bool good)
#define RING_TIME 15 /* in ticks */
-static void xpp_ring_generate(xpd_t *xpd)
+void update_zap_ring(xpd_t *xpd, int pos, bool on)
{
- int i;
- static int bug_counter = 0;
- unsigned long flags;
+ struct zt_chan *chan;
BUG_ON(!xpd);
-
- spin_lock_irqsave(&xpd->lock, flags);
- if(xpd->direction != TO_PSTN && ((bug_counter++ % 1000) == 0)) {
- ERR("%s: %s: Only FXO can report ring changes\n", __FUNCTION__, xpd->xpdname);
- goto out;
- }
- if(!SPAN_REGISTERED(xpd)) {
- NOTICE("%s: %s is not registered. Skipping.\n", __FUNCTION__, xpd->xpdname);
- goto out;
- }
- /*
- * Ring detect logic:
- * fxo_power is toggled
- */
- for_each_line(xpd, i) {
- if(xpd->ringing[i] || xpd->ringer_on[i]) {
- // ring state is only changed once per second:
- if((xpd->timer_count % RING_TIME) == 0) {
- DBG("pos=%d ringing=%d ringer_on=%d\n", i, xpd->ringing[i], xpd->ringer_on[i]);
- if(xpd->ringer_on[i]) {
- zt_hooksig(&xpd->chans[i], ZT_RXSIG_OFFHOOK);
- } else {
- zt_hooksig(&xpd->chans[i], ZT_RXSIG_RING);
- }
- xpd->ringer_on[i] = !xpd->ringer_on[i];
- }
- }
- }
-out:
- spin_unlock_irqrestore(&xpd->lock, flags);
+ if(!SPAN_REGISTERED(xpd))
+ return;
+ chan = &xpd->chans[pos];
+ if(on)
+ zt_hooksig(chan, ZT_RXSIG_RING);
+ else
+ zt_hooksig(chan, ZT_RXSIG_OFFHOOK);
}
#ifdef CONFIG_PROC_FS
@@ -1583,6 +1555,7 @@ EXPORT_SYMBOL(xpd_alloc);
EXPORT_SYMBOL(xpd_disconnect);
EXPORT_SYMBOL(packet_send);
EXPORT_SYMBOL(update_xpd_status);
+EXPORT_SYMBOL(update_zap_ring);
EXPORT_SYMBOL(update_line_status);
EXPORT_SYMBOL(fill_beep);
EXPORT_SYMBOL(xpp_tick);
diff --git a/xpp/xpp_zap.h b/xpp/xpp_zap.h
index 4d884ad..920e76f 100644
--- a/xpp/xpp_zap.h
+++ b/xpp/xpp_zap.h
@@ -32,6 +32,7 @@ void card_detected(struct card_desc_struct *card_desc);
xpd_t *xpd_alloc(size_t privsize, xbus_t *xbus, int xpd_num, const xproto_table_t *proto_table, int channels, byte revision);
void xpd_remove(xpd_t *xpd);
void update_xpd_status(xpd_t *xpd, int alarm_flag);
+void update_zap_ring(xpd_t *xpd, int pos, bool on);
void update_line_status(xpd_t *xpd, int pos, bool good);
void fill_beep(u_char *buf, int duration);
void xpp_tick(unsigned long param);