summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xivovp/base.c83
1 files changed, 75 insertions, 8 deletions
diff --git a/xivovp/base.c b/xivovp/base.c
index 50c0248..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)) {
- printk(KERN_WARNING DRV_NAME "(chan %d): txsig overrun", chan->chanpos);
+ 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;