diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-06-29 04:27:14 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-06-29 04:27:14 +0000 |
commit | 19b6e02ceaa74830357aa8b47f97cbd1707e573d (patch) | |
tree | 998a09bd1127f6e494cfd0b046089439789e0698 /zaptel.c | |
parent | 045580fe74b31768c97a2e2b772c5ba843fa0d6a (diff) |
Add signalling freeze/unfreeze ioctl (and get)
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@427 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'zaptel.c')
-rwxr-xr-x | zaptel.c | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -926,7 +926,7 @@ static void close_channel(struct zt_chan *chan) chan->txgain = defgain; chan->gainalloc = 0; chan->eventinidx = chan->eventoutidx = 0; - chan->flags &= ~(ZT_FLAG_LINEAR | ZT_FLAG_PPP); + chan->flags &= ~(ZT_FLAG_LINEAR | ZT_FLAG_PPP | ZT_FLAG_SIGFREEZE); zt_set_law(chan,0); @@ -3722,6 +3722,25 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm return -ENOSYS; switch(cmd) { + case ZT_SIGFREEZE: + get_user(j, (int *)data); + spin_lock_irqsave(&chan->lock, flags); + if (j) { + chan->flags |= ZT_FLAG_SIGFREEZE; + } else { + chan->flags &= ~ZT_FLAG_SIGFREEZE; + } + spin_unlock_irqrestore(&chan->lock, flags); + break; + case ZT_GETSIGFREEZE: + spin_lock_irqsave(&chan->lock, flags); + if (chan->flags & ZT_FLAG_SIGFREEZE) + j = 1; + else + j = 0; + spin_unlock_irqrestore(&chan->lock, flags); + put_user(j, (int *)data); + break; case ZT_AUDIOMODE: /* Only literal clear channels can be put in */ if (chan->sig != ZT_SIG_CLEAR) return (-EINVAL); @@ -4820,6 +4839,8 @@ static void __zt_hooksig_pvt(struct zt_chan *chan, zt_rxsig_t rxsig) called with chan->lock held */ if ((chan->rxhooksig) == rxsig) return; + + if ((chan->flags & ZT_FLAG_SIGFREEZE)) return; chan->rxhooksig = rxsig; switch(chan->sig) { @@ -4939,6 +4960,8 @@ void zt_rbsbits(struct zt_chan *chan, int cursig) if (cursig == chan->rxsig) return; + if ((chan->flags & ZT_FLAG_SIGFREEZE)) return; + spin_lock_irqsave(&chan->lock, flags); switch(chan->sig) { case ZT_SIG_FXOGS: /* FXO Groundstart */ |