From b88dcb40c9342fa0307e9c8d020db3fbba699c62 Mon Sep 17 00:00:00 2001 From: sruffell Date: Thu, 3 Apr 2008 21:11:24 +0000 Subject: svn merge -c3012 https://origsvn.digium.com/svn/zaptel/branches/1.4 . svn merge -c3701 https://origsvn.digium.com/svn/zaptel/branches/1.4 . svn merge -c3703 https://origsvn.digium.com/svn/zaptel/branches/1.4 . svn merge -c4050 https://origsvn.digium.com/svn/zaptel/branches/1.4/kernel . git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@4128 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- wctdm.c | 79 +++++++++++++++++++++++++++++++++++------------- wctdm24xxp/GpakApi.c | 6 +++- wctdm24xxp/base.c | 80 +++++++++++++++++++++++++++++++++++++------------ wctdm24xxp/wctdm24xxp.h | 9 +++++- wcte12xp/GpakApi.c | 6 +++- wcte12xp/base.c | 1 - zaptel-base.c | 37 ----------------------- 7 files changed, 138 insertions(+), 80 deletions(-) diff --git a/wctdm.c b/wctdm.c index 6d7ef11..2cfcf00 100644 --- a/wctdm.c +++ b/wctdm.c @@ -311,6 +311,7 @@ struct wctdm { int ring; #else int wasringing; + int lastrdtx; #endif int ringdebounce; int offhook; @@ -366,6 +367,7 @@ static void wctdm_release(struct wctdm *wc); static int battdebounce = DEFAULT_BATT_DEBOUNCE; static int battthresh = DEFAULT_BATT_THRESH; static int ringdebounce = DEFAULT_RING_DEBOUNCE; +static int fwringdetect = 0; static int debug = 0; static int robust = 0; static int timingonly = 0; @@ -852,30 +854,55 @@ static inline void wctdm_voicedaa_check_hook(struct wctdm *wc, int card) return; #ifndef AUDIO_RINGCHECK if (!wc->mod[card].fxo.offhook) { - res = wc->reg0shadow[card]; - if ((res & 0x60) && wc->mod[card].fxo.battery) { - wc->mod[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16); - if (wc->mod[card].fxo.ringdebounce >= ZT_CHUNKSIZE * ringdebounce) { - if (!wc->mod[card].fxo.wasringing) { - wc->mod[card].fxo.wasringing = 1; - zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); - if (debug) - printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + if (fwringdetect) { + res = wc->reg0shadow[card] & 0x60; + if (wc->mod[card].fxo.ringdebounce--) { + if (res && (res != wc->mod[card].fxo.lastrdtx) && wc->mod[card].fxo.battery) { + if (!wc->mod[card].fxo.wasringing) { + wc->mod[card].fxo.wasringing = 1; + if (debug) + printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); + } + wc->mod[card].fxo.lastrdtx = res; + wc->mod[card].fxo.ringdebounce = 10; + } else if (!res) { + if ((wc->mod[card].fxo.ringdebounce == 0) && wc->mod[card].fxo.wasringing) { + wc->mod[card].fxo.wasringing = 0; + if (debug) + printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); + } } - wc->mod[card].fxo.ringdebounce = ZT_CHUNKSIZE * ringdebounce; + } else if (res && wc->mod[card].fxo.battery) { + wc->mod[card].fxo.lastrdtx = res; + wc->mod[card].fxo.ringdebounce = 10; } } else { - wc->mod[card].fxo.ringdebounce -= ZT_CHUNKSIZE * 4; - if (wc->mod[card].fxo.ringdebounce <= 0) { - if (wc->mod[card].fxo.wasringing) { - wc->mod[card].fxo.wasringing = 0; - zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); - if (debug) - printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + res = wc->reg0shadow[card]; + if ((res & 0x60) && wc->mod[card].fxo.battery) { + wc->mod[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16); + if (wc->mod[card].fxo.ringdebounce >= ZT_CHUNKSIZE * ringdebounce) { + if (!wc->mod[card].fxo.wasringing) { + wc->mod[card].fxo.wasringing = 1; + zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); + if (debug) + printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + } + wc->mod[card].fxo.ringdebounce = ZT_CHUNKSIZE * ringdebounce; + } + } else { + wc->mod[card].fxo.ringdebounce -= ZT_CHUNKSIZE * 4; + if (wc->mod[card].fxo.ringdebounce <= 0) { + if (wc->mod[card].fxo.wasringing) { + wc->mod[card].fxo.wasringing = 0; + zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); + if (debug) + printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + } + wc->mod[card].fxo.ringdebounce = 0; } - wc->mod[card].fxo.ringdebounce = 0; } - } } #endif @@ -1455,7 +1482,17 @@ static int wctdm_init_voicedaa(struct wctdm *wc, int card, int fast, int manual, reg16 |= (fxo_modes[_opermode].rz << 1); reg16 |= (fxo_modes[_opermode].rt); wctdm_setreg(wc, card, 16, reg16); - + + if(fwringdetect) { + /* Enable ring detector full-wave rectifier mode */ + wctdm_setreg(wc, card, 18, 2); + wctdm_setreg(wc, card, 24, 0); + } else { + /* Set to the device defaults */ + wctdm_setreg(wc, card, 18, 0); + wctdm_setreg(wc, card, 24, 0x19); + } + /* Set DC Termination: Tip/Ring voltage adjust, minimum operational current, current limitation */ reg26 |= (fxo_modes[_opermode].dcv << 6); @@ -2406,6 +2443,7 @@ module_param(fxshonormode, int, 0600); module_param(battdebounce, int, 0600); module_param(battthresh, int, 0600); module_param(ringdebounce, int, 0600); +module_param(fwringdetect, int, 0600); module_param(alawoverride, int, 0600); #else MODULE_PARM(debug, "i"); @@ -2422,6 +2460,7 @@ MODULE_PARM(fxshonormode, "i"); MODULE_PARM(battdebounce, "i"); MODULE_PARM(battthresh, "i"); MODULE_PARM(ringdebounce, "i"); +MODULE_PARM(fwringdetect, "i"); MODULE_PARM(alawoverride, "i"); #endif MODULE_DESCRIPTION("Wildcard TDM400P Zaptel Driver"); diff --git a/wctdm24xxp/GpakApi.c b/wctdm24xxp/GpakApi.c index 8f03c7f..70d6b35 100644 --- a/wctdm24xxp/GpakApi.c +++ b/wctdm24xxp/GpakApi.c @@ -128,10 +128,12 @@ static int CheckDspReset( DSP_ADDRESS IfBlockPntr; /* Interface Block pointer */ DSP_WORD DspStatus; /* DSP Status */ DSP_WORD DspChannels; /* number of DSP channels */ + DSP_WORD Temp[2]; +#if 0 DSP_WORD DspConfs; /* number of DSP conferences */ DSP_ADDRESS PktBufrMem; /* address of Packet Buffer */ - DSP_WORD Temp[2]; unsigned short int i; /* loop index / counter */ +#endif /* Read the pointer to the Interface Block. */ gpakReadDspMemory(DspId, DSP_IFBLK_ADDRESS, 2, Temp); @@ -897,7 +899,9 @@ gpakReadEventFIFOMessageStat_t gpakReadEventFIFOMessage( DSP_WORD TakeIndex; /* event fifo take index */ DSP_WORD WordsReady; /* number words ready for read out of event fifo */ DSP_WORD EventError; /* flag indicating error with event fifo msg */ +#if 0 DSP_WORD *pDebugData; /* debug data buffer pointer in event data struct */ +#endif /* Make sure the DSP Id is valid. */ if (DspId >= MAX_DSP_CORES) diff --git a/wctdm24xxp/base.c b/wctdm24xxp/base.c index 5a63894..0d04d7f 100644 --- a/wctdm24xxp/base.c +++ b/wctdm24xxp/base.c @@ -264,6 +264,8 @@ static char *opermode = "FCC"; static int fxshonormode = 0; static int alawoverride = 0; static int fxo_addrs[4] = { 0x00, 0x08, 0x04, 0x0c }; +static int ringdebounce = DEFAULT_RING_DEBOUNCE; +static int fwringdetect = 0; #ifdef VPM_SUPPORT static int vpmsupport = 1; static int vpmdtmfsupport = 0; @@ -1216,30 +1218,56 @@ static inline void wctdm_voicedaa_check_hook(struct wctdm *wc, int card) wctdm_setreg_intr(wc, card, 5, 0x8); } if (!wc->mods[card].fxo.offhook) { - res = wc->cmdq[card].isrshadow[0]; /* Hook/Ring state */ - if ((res & 0x60) && wc->mods[card].fxo.battery) { - wc->mods[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 4); - if (wc->mods[card].fxo.ringdebounce >= ZT_CHUNKSIZE * RING_DEBOUNCE) { - if (!wc->mods[card].fxo.wasringing) { - wc->mods[card].fxo.wasringing = 1; - zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); - if (debug & DEBUG_CARD) - printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + if (fwringdetect) { + res = wc->cmdq[card].isrshadow[0] & 0x60; + if (wc->mods[card].fxo.ringdebounce--) { + if (res && (res != wc->mods[card].fxo.lastrdtx) && wc->mods[card].fxo.battery) { + if (!wc->mods[card].fxo.wasringing) { + wc->mods[card].fxo.wasringing = 1; + if (debug) + printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); + } + wc->mods[card].fxo.lastrdtx = res; + wc->mods[card].fxo.ringdebounce = 10; + } else if (!res) { + if ((wc->mods[card].fxo.ringdebounce == 0) && wc->mods[card].fxo.wasringing) { + wc->mods[card].fxo.wasringing = 0; + if (debug) + printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); + } } - wc->mods[card].fxo.ringdebounce = ZT_CHUNKSIZE * RING_DEBOUNCE; + } else if (res && wc->mods[card].fxo.battery) { + wc->mods[card].fxo.lastrdtx = res; + wc->mods[card].fxo.ringdebounce = 10; } } else { - wc->mods[card].fxo.ringdebounce -= ZT_CHUNKSIZE; - if (wc->mods[card].fxo.ringdebounce <= 0) { - if (wc->mods[card].fxo.wasringing) { - wc->mods[card].fxo.wasringing = 0; - zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); - if (debug & DEBUG_CARD) - printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + res = wc->cmdq[card].isrshadow[0]; + if ((res & 0x60) && wc->mods[card].fxo.battery) { + wc->mods[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16); + if (wc->mods[card].fxo.ringdebounce >= ZT_CHUNKSIZE * ringdebounce) { + if (!wc->mods[card].fxo.wasringing) { + wc->mods[card].fxo.wasringing = 1; + zt_hooksig(&wc->chans[card], ZT_RXSIG_RING); + if (debug) + printk("RING on %d/%d!\n", wc->span.spanno, card + 1); + } + wc->mods[card].fxo.ringdebounce = ZT_CHUNKSIZE * ringdebounce; } - wc->mods[card].fxo.ringdebounce = 0; + } else { + wc->mods[card].fxo.ringdebounce -= ZT_CHUNKSIZE * 4; + if (wc->mods[card].fxo.ringdebounce <= 0) { + if (wc->mods[card].fxo.wasringing) { + wc->mods[card].fxo.wasringing = 0; + zt_hooksig(&wc->chans[card], ZT_RXSIG_OFFHOOK); + if (debug) + printk("NO RING on %d/%d!\n", wc->span.spanno, card + 1); + } + wc->mods[card].fxo.ringdebounce = 0; + } + } - } } b = wc->cmdq[card].isrshadow[1]; /* Voltage */ @@ -1929,6 +1957,16 @@ static int wctdm_init_voicedaa(struct wctdm *wc, int card, int fast, int manual, reg16 |= (fxo_modes[_opermode].rz << 1); reg16 |= (fxo_modes[_opermode].rt); wctdm_setreg(wc, card, 16, reg16); + + if(fwringdetect) { + /* Enable ring detector full-wave rectifier mode */ + wctdm_setreg(wc, card, 18, 2); + wctdm_setreg(wc, card, 24, 0); + } else { + /* Set to the device defaults */ + wctdm_setreg(wc, card, 18, 0); + wctdm_setreg(wc, card, 24, 0x19); + } /* Set DC Termination: Tip/Ring voltage adjust, minimum operational current, current limitation */ @@ -3703,6 +3741,8 @@ module_param(fxshonormode, int, 0600); module_param(battdebounce, int, 0600); module_param(battthresh, int, 0600); module_param(alawoverride, int, 0600); +module_param(ringdebounce, int, 0600); +module_param(fwringdetect, int, 0600); #ifdef VPM_SUPPORT module_param(vpmsupport, int, 0600); module_param(vpmdtmfsupport, int, 0600); @@ -3725,6 +3765,8 @@ MODULE_PARM(fxshonormode, "i"); MODULE_PARM(battdebounce, "i"); MODULE_PARM(battthresh, "i"); MODULE_PARM(alawoverride, "i"); +MODULE_PARM(ringdebounce, "i"); +MODULE_PARM(fwringdetect, "i"); #ifdef VPM_SUPPORT MODULE_PARM(vpmsupport, "i"); MODULE_PARM(vpmdtmfsupport, "i"); diff --git a/wctdm24xxp/wctdm24xxp.h b/wctdm24xxp/wctdm24xxp.h index c5d6042..143ff60 100644 --- a/wctdm24xxp/wctdm24xxp.h +++ b/wctdm24xxp/wctdm24xxp.h @@ -31,7 +31,13 @@ #define WC_MAX_IFACES 128 -#define RING_DEBOUNCE 128 /* Ringer Debounce (in ms) */ +/*! + * \brief Default ringer debounce (in ms) + * + * \todo This value differs from that in wctdm. In that module, it is 64 ms + * instead of 128 ms. Which one is more appropriate? + */ +#define DEFAULT_RING_DEBOUNCE 128 #define DEFAULT_BATT_DEBOUNCE 64 /* Battery debounce (in ms) */ #define POLARITY_DEBOUNCE 64 /* Polarity debounce (in ms) */ #define DEFAULT_BATT_THRESH 3 /* Anything under this is "no battery" */ @@ -191,6 +197,7 @@ struct wctdm { union { struct { int wasringing; + int lastrdtx; int ringdebounce; int offhook; int battdebounce; diff --git a/wcte12xp/GpakApi.c b/wcte12xp/GpakApi.c index 8582350..8e280a4 100644 --- a/wcte12xp/GpakApi.c +++ b/wcte12xp/GpakApi.c @@ -128,10 +128,12 @@ static int CheckDspReset( DSP_ADDRESS IfBlockPntr; /* Interface Block pointer */ DSP_WORD DspStatus; /* DSP Status */ DSP_WORD DspChannels; /* number of DSP channels */ + DSP_WORD Temp[2]; +#if 0 DSP_WORD DspConfs; /* number of DSP conferences */ DSP_ADDRESS PktBufrMem; /* address of Packet Buffer */ - DSP_WORD Temp[2]; unsigned short int i; /* loop index / counter */ +#endif /* Read the pointer to the Interface Block. */ gpakReadDspMemory(DspId, DSP_IFBLK_ADDRESS, 2, Temp); @@ -897,7 +899,9 @@ gpakReadEventFIFOMessageStat_t gpakReadEventFIFOMessage( DSP_WORD TakeIndex; /* event fifo take index */ DSP_WORD WordsReady; /* number words ready for read out of event fifo */ DSP_WORD EventError; /* flag indicating error with event fifo msg */ +#if 0 DSP_WORD *pDebugData; /* debug data buffer pointer in event data struct */ +#endif /* Make sure the DSP Id is valid. */ if (DspId >= MAX_DSP_CORES) diff --git a/wcte12xp/base.c b/wcte12xp/base.c index 24e99da..ced5103 100644 --- a/wcte12xp/base.c +++ b/wcte12xp/base.c @@ -1724,7 +1724,6 @@ static inline void t1_transmitprep(struct t1 *wc, int dbl) static inline void cmd_retransmit(struct t1 *wc) { unsigned int x; - unsigned long flags; for (x = 0; x < sizeof(wc->cmdq.cmds) / sizeof(wc->cmdq.cmds[0]); x++) { if (!(wc->cmdq.cmds[x].flags & __CMD_FIN)) { diff --git a/zaptel-base.c b/zaptel-base.c index 1d44752..3b8d175 100644 --- a/zaptel-base.c +++ b/zaptel-base.c @@ -181,43 +181,6 @@ static struct class_simple *zap_class = NULL; static int deftaps = 64; -static -__u16 fcstab[256] = -{ - 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, - 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, - 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, - 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, - 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, - 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, - 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, - 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, - 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, - 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, - 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, - 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, - 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, - 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, - 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, - 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, - 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, - 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, - 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, - 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, - 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, - 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, - 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, - 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, - 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, - 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, - 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, - 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, - 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, - 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, - 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, - 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 -}; - static int debug; /* states for transmit signalling */ -- cgit v1.2.3