347
347
#define T4_VPM_PRESENT (1 << 28)
350
349
#ifdef VPM_SUPPORT
351
350
static void t4_vpm400_init(struct t4 *wc);
352
351
static void t4_vpm450_init(struct t4 *wc);
353
352
static void t4_vpm_set_dtmf_threshold(struct t4 *wc, unsigned int threshold);
354
static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
355
struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec);
356
static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec);
358
static const struct dahdi_echocan_features vpm400m_ec_features = {
364
static const struct dahdi_echocan_features vpm450m_ec_features = {
370
static const struct dahdi_echocan_ops vpm400m_ec_ops = {
372
.echocan_free = echocan_free,
375
static const struct dahdi_echocan_ops vpm450m_ec_ops = {
377
.echocan_free = echocan_free,
355
381
static void __set_clear(struct t4 *wc, int span);
356
382
static int t4_startup(struct dahdi_span *span);
357
383
static int t4_shutdown(struct dahdi_span *span);
1093
static int t4_echocan(struct dahdi_chan *chan, int eclen)
1119
static int echocan_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp,
1120
struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec)
1095
1122
struct t4 *wc = chan->pvt;
1123
struct t4_span *tspan = chan->span->pvt;
1125
const struct dahdi_echocan_ops *ops;
1126
const struct dahdi_echocan_features *features;
1100
1129
return -ENODEV;
1102
1131
if (chan->span->offset >= vpmspans)
1103
1132
return -ENODEV;
1106
channel = chan->chanpos;
1108
channel = chan->chanpos + 4;
1135
ops = &vpm450m_ec_ops;
1136
features = &vpm450m_ec_features;
1138
ops = &vpm400m_ec_ops;
1139
features = &vpm400m_ec_features;
1142
if (ecp->param_count > 0) {
1143
printk(KERN_WARNING "%s echo canceller does not support parameters; failing request\n", ops->name);
1147
*ec = tspan->ec[chan->chanpos - 1];
1149
(*ec)->features = *features;
1151
channel = wc->t1e1 ? chan->chanpos : chan->chanpos + 4;
1109
1153
if (wc->vpm450m) {
1110
1154
channel = channel << 2;
1111
1155
channel |= chan->span->offset;
1112
if(debug & DEBUG_ECHOCAN)
1156
if (debug & DEBUG_ECHOCAN)
1113
1157
printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, offset is %d length %d\n",
1114
wc->num, chan->chanpos, chan->span->offset, channel, eclen);
1115
vpm450m_setec(wc->vpm450m, channel, eclen);
1117
// msleep(100); // longer test
1158
wc->num, chan->chanpos, chan->span->offset, channel, ecp->tap_length);
1159
vpm450m_setec(wc->vpm450m, channel, ecp->tap_length);
1119
unit = t4_vpm_unit(chan->span->offset, channel);
1120
if(debug & DEBUG_ECHOCAN)
1161
int unit = t4_vpm_unit(chan->span->offset, channel);
1163
if (debug & DEBUG_ECHOCAN)
1121
1164
printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, unit is %d, unit offset is %d length %d\n",
1122
wc->num, chan->chanpos, chan->span->offset, unit, channel, eclen);
1124
t4_vpm_out(wc,unit,channel,0x3e);
1126
t4_vpm_out(wc,unit,channel,0x01);
1165
wc->num, chan->chanpos, chan->span->offset, unit, channel, ecp->tap_length);
1166
t4_vpm_out(wc, unit, channel, 0x3e);
1172
static void echocan_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec)
1174
struct t4 *wc = chan->pvt;
1177
memset(ec, 0, sizeof(*ec));
1179
channel = wc->t1e1 ? chan->chanpos : chan->chanpos + 4;
1182
channel = channel << 2;
1183
channel |= chan->span->offset;
1184
if (debug & DEBUG_ECHOCAN)
1185
printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, offset is %d length 0\n",
1186
wc->num, chan->chanpos, chan->span->offset, channel);
1187
vpm450m_setec(wc->vpm450m, channel, 0);
1189
int unit = t4_vpm_unit(chan->span->offset, channel);
1191
if (debug & DEBUG_ECHOCAN)
1192
printk(KERN_DEBUG "echocan: Card is %d, Channel is %d, Span is %d, unit is %d, unit offset is %d length 0\n",
1193
wc->num, chan->chanpos, chan->span->offset, unit, channel);
1194
t4_vpm_out(wc, unit, channel, 0x01);
1132
1199
static int t4_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long data)
3661
3736
init_spans(wc);
3663
/* Launch cards as appropriate */
3665
/* Find a card to activate */
3667
for (x = 0; cards[x]; x++) {
3668
if (cards[x]->order <= highestorder) {
3669
t4_launch(cards[x]);
3670
if (cards[x]->order == highestorder)
3737
/* get the current number of probed cards and run a slice of a tail
3739
for (x = 0; x < MAX_T4_CARDS; x++) {
3743
for ( ; x > 0; x--) {
3744
if (cards[x]->order < cards[x-1]->order) {
3745
struct t4 *tmp = cards[x];
3746
cards[x] = cards[x-1];
3749
/* if we're not moving it, we won't move any more
3750
* since all cards are sorted on addition */
3674
/* If we found at least one, increment the highest order and search again, otherwise stop */
3681
3755
printk(KERN_INFO "Found a Wildcard: %s\n", wc->variety);