diff options
author | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2008-08-11 16:22:24 +0000 |
---|---|---|
committer | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2008-08-11 16:22:24 +0000 |
commit | a79b126653e6df98085eddc586419dccf12b724c (patch) | |
tree | 8e1e84273875cac6e91486a0ba1a099e19209147 /drivers/dahdi/xpp/xbus-pcm.c | |
parent | d0106ae371aeaf18a7a632142f5daca57beb93b0 (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.c | 37 |
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); |