summaryrefslogtreecommitdiff
path: root/zaptel-base.c
diff options
context:
space:
mode:
authormattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-07-20 16:19:47 +0000
committermattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-07-20 16:19:47 +0000
commitb1acf2d381141c8b547821b2c15f0405380d1d08 (patch)
treedf25ce4ee633b1a20db7bff2125c7839349d30b5 /zaptel-base.c
parent5f9e02f2f237393c4be0ccddbca008087e1c2efe (diff)
New product support, new echo canceler and new boards
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2761 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'zaptel-base.c')
-rw-r--r--zaptel-base.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/zaptel-base.c b/zaptel-base.c
index 256a66a..6166759 100644
--- a/zaptel-base.c
+++ b/zaptel-base.c
@@ -1035,13 +1035,14 @@ static void close_channel(struct zt_chan *chan)
memset(chan->conflast1, 0, sizeof(chan->conflast1));
memset(chan->conflast2, 0, sizeof(chan->conflast2));
- if (chan->span && chan->span->echocan)
- chan->span->echocan(chan, 0);
if (chan->span && chan->span->dacs && oldconf)
chan->span->dacs(chan, NULL);
spin_unlock_irqrestore(&chan->lock, flags);
+ if (chan->span && chan->span->echocan)
+ chan->span->echocan(chan, 0);
+
if (rxgain)
kfree(rxgain);
if (ec)
@@ -2193,9 +2194,11 @@ static int initialize_channel(struct zt_chan *chan)
chan->ringcadence[0] = chan->starttime;
chan->ringcadence[1] = ZT_RINGOFFTIME;
}
+
+ spin_unlock_irqrestore(&chan->lock, flags);
+
if (chan->span && chan->span->echocan)
chan->span->echocan(chan, 0);
- spin_unlock_irqrestore(&chan->lock, flags);
if (rxgain)
kfree(rxgain);
@@ -4166,9 +4169,10 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
chan->txgain = defgain;
chan->gainalloc = 0;
/* Disable any native echo cancellation as well */
+ spin_unlock_irqrestore(&chan->lock, flags);
+
if (chan->span && chan->span->echocan)
chan->span->echocan(chan, 0);
- spin_unlock_irqrestore(&chan->lock, flags);
if (rxgain)
kfree(rxgain);
@@ -4272,10 +4276,13 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
tec = chan->ec;
chan->ec = NULL;
/* Attempt hardware native echo can */
+ spin_unlock_irqrestore(&chan->lock, flags);
+
if (chan->span && chan->span->echocan)
ret = chan->span->echocan(chan, j);
else
ret = -ENOTTY;
+
if (ret) {
/* Use built-in echo can */
if ((j == 32) ||
@@ -4286,7 +4293,6 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
} else {
j = deftaps;
}
- spin_unlock_irqrestore(&chan->lock, flags);
ec = echo_can_create(j, 0);
if (!ec)
return -ENOMEM;
@@ -4298,8 +4304,8 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
chan->echotimer = 0;
echo_can_disable_detector_init(&chan->txecdis);
echo_can_disable_detector_init(&chan->rxecdis);
+ spin_unlock_irqrestore(&chan->lock, flags);
}
- spin_unlock_irqrestore(&chan->lock, flags);
if (tec)
echo_can_free(tec);
} else {
@@ -4310,10 +4316,10 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
chan->echostate = ECHO_STATE_IDLE;
chan->echolastupdate = 0;
chan->echotimer = 0;
+ spin_unlock_irqrestore(&chan->lock, flags);
/* Attempt hardware native echo can */
if (chan->span && chan->span->echocan)
chan->span->echocan(chan, 0);
- spin_unlock_irqrestore(&chan->lock, flags);
if (tec)
echo_can_free(tec);
}