From c80bd64179eb5f326ee184f19d24247b7d8e040c Mon Sep 17 00:00:00 2001 From: Noe Rubinstein Date: Fri, 15 Oct 2010 19:02:25 +0200 Subject: fixed FXO also various unsignificant changes to traces and stuff --- xivovp/base.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 7 deletions(-) diff --git a/xivovp/base.c b/xivovp/base.c index 7bd1457..59a4b0d 100644 --- a/xivovp/base.c +++ b/xivovp/base.c @@ -94,7 +94,7 @@ static struct xivovp_line* xivovp_line_from_ctx(VpLineCtxType* line_ctx) line_obj = line_ctx->pLineObj; - for (i = 0; i < ARRAY_SIZE(xivovp.line); i++) + for (i = 0; i < NB_LINES; i++) if (&xivovp.line[i].line_obj == line_obj) return &xivovp.line[i]; @@ -107,7 +107,7 @@ static void vp_set_debug_select_running(void) int i; uint32 debug_select; - for (i = 0; i < ARRAY_SIZE(xivovp.line); i++) { + for (i = 0; i < NB_LINES; i++) { debug_select = DEBUG_SELECT_RUNNING; VpSetOption(&xivovp.line[i].vp_ctx, NULL, VP_OPTION_ID_DEBUG_SELECT, @@ -127,9 +127,11 @@ static int xivovp_hooksig(struct dahdi_chan *chan, enum dahdi_txsig txsig) struct xivovp_line* line = chan->pvt; unsigned long flags; - if (line->txsig_queue_len >= ARRAY_SIZE(line->txsig_queue)) { + if (line->txsig_queue_len >= TXQUEUE_LEN) { printk(KERN_WARNING DRV_NAME "(chan %d): txsig overrun (%d)\n", chan->chanpos, txsig); return -1; + } else { + printk(KERN_DEBUG DRV_NAME "(chan %d): queuing txsig (%d) in position %d\n", chan->chanpos, txsig, line->txsig_queue_len); } spin_lock_irqsave(&line->lock, flags); @@ -192,7 +194,7 @@ static void xivovp_handle_txsig_queue(void) enum dahdi_txsig txsig_queue[TXQUEUE_LEN]; unsigned long flags; - for (i = 0; i < ARRAY_SIZE(xivovp.line); i++) { + for (i = 0; i < NB_LINES; i++) { if (xivovp.line[i].ready) { spin_lock_irqsave(&xivovp.line[i].lock, flags); for (j = 0; j < xivovp.line[i].txsig_queue_len; j++) @@ -267,7 +269,8 @@ static void vp_post_init(VpEventType *event) (int)vpst); } - /* No VpCalLine for FXO */ + xivovp.line[FXO_LINE].ready = 1; /* No VpCalLine for FXO */ + // XXX What happens if lines aren't connected? @@ -303,6 +306,33 @@ static void event_hook_on(VpEventType *event) dahdi_hooksig(&line->chan, DAHDI_RXSIG_ONHOOK); } +static void event_ring_on(VpEventType *event) +{ + struct xivovp_line *line = xivovp_line_from_ctx(event->pLineCtx); + printk(KERN_INFO DRV_NAME ": received ring on event on %s\n", line->chan.name); + dahdi_hooksig(&line->chan, DAHDI_RXSIG_RING); +} + +static void event_ring_off(VpEventType *event) +{ + struct xivovp_line *line = xivovp_line_from_ctx(event->pLineCtx); + printk(KERN_INFO DRV_NAME ": received ring off event on %s\n", line->chan.name); + dahdi_hooksig(&line->chan, DAHDI_RXSIG_ONHOOK); +} + +static void event_polarity_reversal(VpEventType *event) +{ + struct xivovp_line *line = xivovp_line_from_ctx(event->pLineCtx); + printk(KERN_INFO DRV_NAME ": received polarity reversal event on %s\n", line->chan.name); + dahdi_qevent_lock(&line->chan, DAHDI_EVENT_POLARITY); +} + +#define UNSUPPORTED(ev) \ + case ev: \ + printk(KERN_WARNING DRV_NAME \ + ": reveived unsupported event " #ev "\n"); \ + break; + static void vp_tick(const unsigned long data) { static VpEventType event; @@ -328,7 +358,7 @@ static void vp_tick(const unsigned long data) } if (ev_pending) { - printk(KERN_INFO "vp evt: %d %d\n", + printk(KERN_DEBUG "vp evt: %d %d\n", (int)event.eventCategory, (int)event.eventId); @@ -345,9 +375,21 @@ static void vp_tick(const unsigned long data) case VP_EVID_CAL_BUSY: event_calibration_fail(&event); break; + + UNSUPPORTED(VP_LINE_EVID_RD_OPTION); + UNSUPPORTED(VP_LINE_EVID_GAIN_CMP); + UNSUPPORTED(VP_LINE_EVID_LINE_INIT_CMP); + UNSUPPORTED(VP_DEV_EVID_IO_ACCESS_CMP); } break; case VP_EVCAT_FAULT: + switch(event.eventId) { + UNSUPPORTED(VP_DEV_EVID_BAT_FLT); + UNSUPPORTED(VP_DEV_EVID_CLK_FLT); + UNSUPPORTED(VP_LINE_EVID_THERM_FLT); + UNSUPPORTED(VP_LINE_EVID_DC_FLT); + UNSUPPORTED(VP_LINE_EVID_RES_LEAK_FLT); + } break; case VP_EVCAT_SIGNALING: switch (event.eventId) { @@ -357,6 +399,12 @@ static void vp_tick(const unsigned long data) case VP_LINE_EVID_HOOK_ON: event_hook_on(&event); break; + UNSUPPORTED(VP_LINE_EVID_GKEY_DET); + UNSUPPORTED(VP_LINE_EVID_GKEY_REL); + UNSUPPORTED(VP_LINE_EVID_FLASH); + UNSUPPORTED(VP_LINE_EVID_STARTPULSE); + UNSUPPORTED(VP_LINE_EVID_DTMF_DIG); + UNSUPPORTED(VP_LINE_EVID_PULSE_DIG); } break; case VP_EVCAT_TEST: @@ -364,6 +412,25 @@ static void vp_tick(const unsigned long data) case VP_EVCAT_PROCESS: break; case VP_EVCAT_FXO: + switch (event.eventId) { + case VP_LINE_EVID_RING_ON: + event_ring_on(&event); + break; + case VP_LINE_EVID_RING_OFF: + event_ring_off(&event); + break; + case VP_LINE_EVID_POLREV: + event_polarity_reversal(&event); + break; + UNSUPPORTED(VP_LINE_EVID_LIU); + UNSUPPORTED(VP_LINE_EVID_LNIU); + UNSUPPORTED(VP_LINE_EVID_FEED_DIS); + UNSUPPORTED(VP_LINE_EVID_FEED_EN); + UNSUPPORTED(VP_LINE_EVID_DISCONNECT); + UNSUPPORTED(VP_LINE_EVID_RECONNECT); + UNSUPPORTED(VP_LINE_EVID_POH); + UNSUPPORTED(VP_LINE_EVID_PNOH); + } break; } @@ -407,7 +474,7 @@ span_init(void) dahdi_copy_string(xivovp.span.devicetype, "Ve890", sizeof(xivovp.span.devicetype)); xivovp.span.ops = &xivovp_span_ops; - xivovp.span.channels = ARRAY_SIZE(xivovp.chans); + xivovp.span.channels = NB_LINES; xivovp.span.chans = xivovp.chans; xivovp.span.deflaw = alawoverride ? DAHDI_LAW_ALAW : DAHDI_LAW_MULAW; xivovp.span.flags = DAHDI_FLAG_RBS; -- cgit v1.2.3