summaryrefslogtreecommitdiff
path: root/drivers/dahdi/xpp/card_pri.c
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2011-06-28 18:23:00 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2011-06-28 18:23:00 +0000
commit71234e254b574d31d442703e04fdbdcba653010c (patch)
tree0a657a4e9601bc59dfa5fc40880492f69779b8e1 /drivers/dahdi/xpp/card_pri.c
parent1fa5fa9a723b314f72db9b52114eebf01111c5f0 (diff)
xpd_echo: XPP Octasic echo canceler module
* xpd_echo (card_echo.c) - a module to handle an Astribank hardware echo canceller module. * All other XPDs are now of type 'telephony_device'. Only a telephony device XPD provides a span to register. * The EC module will typically show up as XPD-40 and will always show up as Unregistered in 'dahdi_hardware -v' Signed-off-by: Oron Peled <oron.peled@xorcom.com> Signed-off-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9993 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/xpp/card_pri.c')
-rw-r--r--drivers/dahdi/xpp/card_pri.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/dahdi/xpp/card_pri.c b/drivers/dahdi/xpp/card_pri.c
index 8d7e76d..604163a 100644
--- a/drivers/dahdi/xpp/card_pri.c
+++ b/drivers/dahdi/xpp/card_pri.c
@@ -1213,6 +1213,8 @@ static const struct dahdi_span_ops PRI_span_ops = {
.close = xpp_close,
.ioctl = xpp_ioctl,
.maint = xpp_maint,
+ .echocan_create = xpp_echocan_create,
+ .echocan_name = xpp_echocan_name,
#ifdef DAHDI_SYNC_TICK
.sync_tick = dahdi_sync_tick,
#endif
@@ -1793,7 +1795,38 @@ int PRI_timing_priority(xpd_t *xpd)
return -ENOENT;
}
+static int PRI_echocancel_timeslot(xpd_t *xpd, int pos)
+{
+ /*
+ * Skip ts=0 (used for PRI sync)
+ */
+ return (1 + pos) * 4 + xpd->addr.subunit;
+}
+static int PRI_echocancel_setmask(xpd_t *xpd, xpp_line_t ec_mask)
+{
+ struct PRI_priv_data *priv;
+ int i;
+
+ BUG_ON(!xpd);
+ priv = xpd->priv;
+ BUG_ON(!priv);
+ XPD_DBG(GENERAL, xpd, "0x%8X\n", ec_mask);
+ if (!ECHOOPS(xpd->xbus)) {
+ XPD_DBG(GENERAL, xpd,
+ "No echo canceller in XBUS: Doing nothing.\n");
+ return -EINVAL;
+ }
+ for (i = 0; i < PHONEDEV(xpd).channels; i++) {
+ int on = BIT(i) & ec_mask;
+
+ if (i == PRI_DCHAN_IDX(priv))
+ on = 0;
+ CALL_EC_METHOD(ec_set, xpd->xbus, xpd, i, on);
+ }
+ CALL_EC_METHOD(ec_update, xpd->xbus, xpd->xbus);
+ return 0;
+}
/*---------------- PRI: HOST COMMANDS -------------------------------------*/
@@ -2111,6 +2144,8 @@ static const struct phoneops pri_phoneops = {
.card_pcm_recompute = PRI_card_pcm_recompute,
.card_pcm_fromspan = PRI_card_pcm_fromspan,
.card_pcm_tospan = PRI_card_pcm_tospan,
+ .echocancel_timeslot = PRI_echocancel_timeslot,
+ .echocancel_setmask = PRI_echocancel_setmask,
.card_timing_priority = PRI_timing_priority,
.card_ioctl = PRI_card_ioctl,
.card_close = PRI_card_close,