summaryrefslogtreecommitdiff
path: root/drivers/dahdi/xpp/xbus-pcm.c
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2008-08-11 16:22:24 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2008-08-11 16:22:24 +0000
commita79b126653e6df98085eddc586419dccf12b724c (patch)
tree8e1e84273875cac6e91486a0ba1a099e19209147 /drivers/dahdi/xpp/xbus-pcm.c
parentd0106ae371aeaf18a7a632142f5daca57beb93b0 (diff)
xpp: CAS/E1 support in the PRI module, and minor fixes.
* Add support for CAS in the PRI module. Use firmware rev. 5975. * Debugging parameter pcmtx_chan now accepts a dahdi channel number. * Do initialize a reserved protocol field (card_global). * The name DAHDI as used in proc/xpp/sync has 5 (not 6) letters. * Fix DTMF "channel leak" regression in the FXS module. git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@4761 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi/xpp/xbus-pcm.c')
-rw-r--r--drivers/dahdi/xpp/xbus-pcm.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/drivers/dahdi/xpp/xbus-pcm.c b/drivers/dahdi/xpp/xbus-pcm.c
index eabd94e..030fbdf 100644
--- a/drivers/dahdi/xpp/xbus-pcm.c
+++ b/drivers/dahdi/xpp/xbus-pcm.c
@@ -780,12 +780,13 @@ void generic_card_pcm_fromspan(xbus_t *xbus, xpd_t *xpd, xpp_line_t lines, xpack
if(IS_SET(lines, i)) {
if(SPAN_REGISTERED(xpd)) {
#ifdef DEBUG_PCMTX
- if(pcmtx >= 0 && pcmtx_chan == i)
+ int channo = xpd->span.chans[i]->channo;
+
+ if(pcmtx >= 0 && pcmtx_chan == channo)
memset((u_char *)pcm, pcmtx, DAHDI_CHUNKSIZE);
else
#endif
memcpy((u_char *)pcm, chans[i]->writechunk, DAHDI_CHUNKSIZE);
- // fill_beep((u_char *)pcm, xpd->addr.subunit, 2);
} else
memset((u_char *)pcm, 0x7F, DAHDI_CHUNKSIZE);
pcm += DAHDI_CHUNKSIZE;
@@ -799,34 +800,42 @@ void generic_card_pcm_tospan(xbus_t *xbus, xpd_t *xpd, xpacket_t *pack)
{
byte *pcm;
xpp_line_t pcm_mask;
+ xpp_line_t pcm_mute;
unsigned long flags;
int i;
pcm = RPACKET_FIELD(pack, GLOBAL, PCM_READ, pcm);
pcm_mask = RPACKET_FIELD(pack, GLOBAL, PCM_READ, lines);
spin_lock_irqsave(&xpd->lock, flags);
+ /*
+ * Calculate the channels we want to mute
+ */
+ pcm_mute = ~xpd->wanted_pcm_mask;
+ pcm_mute |= xpd->mute_dtmf | xpd->silence_pcm;
if(!SPAN_REGISTERED(xpd))
goto out;
for (i = 0; i < xpd->channels; i++) {
volatile u_char *r = xpd->span.chans[i]->readchunk;
+ bool got_data = IS_SET(pcm_mask, i);
- if(!IS_SET(xpd->wanted_pcm_mask, i)) {
+ if(got_data && !IS_SET(pcm_mute, i)) {
+ /* We have and want real data */
+ // memset((u_char *)r, 0x5A, DAHDI_CHUNKSIZE); // DEBUG
+ memcpy((u_char *)r, pcm, DAHDI_CHUNKSIZE);
+ } else if(IS_SET(xpd->wanted_pcm_mask | xpd->silence_pcm, i)) {
+ /* Inject SILENCE */
+ memset((u_char *)r, 0x7F, DAHDI_CHUNKSIZE);
if(IS_SET(xpd->silence_pcm, i)) {
- memset((u_char *)r, 0x7F, DAHDI_CHUNKSIZE); // SILENCE
+ /*
+ * This will clear the EC buffers until next tick
+ * So we don't have noise residues from the past.
+ */
memset(xpd->ec_chunk2[i], 0x7F, DAHDI_CHUNKSIZE);
memset(xpd->ec_chunk1[i], 0x7F, DAHDI_CHUNKSIZE);
}
- continue;
}
- pcm_mask &= ~xpd->mute_dtmf;
- if(IS_SET(pcm_mask, i)) {
- // memset((u_char *)r, 0x5A, DAHDI_CHUNKSIZE); // DEBUG
- // fill_beep((u_char *)r, 1, 1); // DEBUG: BEEP
- memcpy((u_char *)r, pcm, DAHDI_CHUNKSIZE);
+ if(got_data)
pcm += DAHDI_CHUNKSIZE;
- } else {
- memset((u_char *)r, 0x7F, DAHDI_CHUNKSIZE); // SILENCE
- }
}
out:
XPD_COUNTER(xpd, PCM_READ)++;
@@ -1126,7 +1135,7 @@ static int proc_sync_write(struct file *file, const char __user *buffer, unsigne
if(copy_from_user(buf, buffer, count))
return -EFAULT;
buf[count] = '\0';
- if(strncmp("DAHDI", buf, 6) == 0) {
+ if(strncmp("DAHDI", buf, 5) == 0) {
DBG(SYNC, "DAHDI\n");
force_dahdi_sync=1;
update_sync_master(NULL);