summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wcb4xxp/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dahdi/wcb4xxp/base.c')
-rw-r--r--drivers/dahdi/wcb4xxp/base.c73
1 files changed, 52 insertions, 21 deletions
diff --git a/drivers/dahdi/wcb4xxp/base.c b/drivers/dahdi/wcb4xxp/base.c
index 0fea600..d07ce7c 100644
--- a/drivers/dahdi/wcb4xxp/base.c
+++ b/drivers/dahdi/wcb4xxp/base.c
@@ -114,6 +114,20 @@ struct devtype {
static struct devtype wcb4xxp = { "Wildcard B410P", 0 };
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+ struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
+
+static const struct dahdi_echocan_features my_ec_features = {
+ .NLP_automatic = 1,
+ .CED_tx_detect = 1,
+ .CED_rx_detect = 1,
+};
+
+static const struct dahdi_echocan_ops my_ec_ops = {
+ .name = "HWEC",
+ .echocan_free = echocan_free,
+};
#if 0
static const char *wcb4xxp_rcsdata = "$RCSfile: base.c,v $ $Revision$";
@@ -1884,33 +1898,50 @@ static void b4xxp_update_leds(struct b4xxp *b4)
}
}
-static int b4xxp_echocan(struct dahdi_chan *chan, int eclen)
+static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
+ struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
{
- struct b4xxp *b4 = chan->pvt;
+ struct b4xxp_span *bspan = chan->span->pvt;
int channel;
- int unit;
-
- if (chan->chanpos != 3)
- unit = chan->chanpos - 1;
- else
- return 0;
-
- channel = (chan->span->offset * 8) + ((chan->chanpos - 1) * 4) + 1;
-
- if (eclen) { /* Enable */
- if (DBG_EC)
- printk("Enabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
- ec_write(b4, unit, channel, 0x7e);
- } else { /* Disable */
- if (DBG_EC)
- printk("Disabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
- ec_write(b4, unit, channel, 0x01);
+
+ if (chan->chanpos == 3) {
+ printk(KERN_WARNING "Cannot enable echo canceller on D channel of span %d; failing request\n", chan->span->offset);
+ return -EINVAL;
}
+
+ if (ecp->param_count > 0) {
+ printk(KERN_WARNING "wcb4xxp echo canceller does not support parameters; failing request\n");
+ return -EINVAL;
+ }
+
+ *ec = &bspan->ec[chan->chanpos];
+ (*ec)->ops = &my_ec_ops;
+ (*ec)->features = my_ec_features;
+
+ if (DBG_EC)
+ printk("Enabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
+
+ channel = (chan->span->offset * 8) + ((chan->chanpos - 1) * 4) + 1;
- return 0;
+ ec_write(bspan->parent, chan->chanpos - 1, channel, 0x7e);
+ return 0;
}
+static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
+{
+ struct b4xxp_span *bspan = chan->span->pvt;
+ int channel;
+
+ memset(ec, 0, sizeof(*ec));
+
+ if (DBG_EC)
+ printk("Disabling echo cancellation on chan %d span %d\n", chan->chanpos, chan->span->offset);
+
+ channel = (chan->span->offset * 8) + ((chan->chanpos - 1) * 4) + 1;
+
+ ec_write(bspan->parent, chan->chanpos - 1, channel, 0x01);
+}
/*
* Filesystem and DAHDI interfaces
@@ -2140,7 +2171,7 @@ static void init_spans(struct b4xxp *b4)
bspan->span.ioctl = b4xxp_ioctl;
bspan->span.hdlc_hard_xmit = b4xxp_hdlc_hard_xmit;
if (vpmsupport)
- bspan->span.echocan = b4xxp_echocan;
+ bspan->span.echocan_create = echocan_create;
/* HDLC stuff */
bspan->sigchan = NULL;