[Asterisk-cvs] zaptel wctdm.c,1.125,1.126
markster
markster
Mon Sep 26 16:14:46 CDT 2005
Update of /usr/cvsroot/zaptel
In directory mongoose.digium.com:/tmp/cvs-serv22343
Modified Files:
wctdm.c
Log Message:
Fix issue with CPU spiking
Index: wctdm.c
===================================================================
RCS file: /usr/cvsroot/zaptel/wctdm.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -u -d -r1.125 -r1.126
--- wctdm.c 25 Sep 2005 22:11:57 -0000 1.125
+++ wctdm.c 26 Sep 2005 20:11:36 -0000 1.126
@@ -255,9 +255,9 @@
(the interrupt cycles around the four modules), so the periods are
specified in _4 millisecond_ increments
*/
-#define RING_DEBOUNCE 16 /* Ringer Debounce (64 ms) */
-#define DEFAULT_BATT_DEBOUNCE 16 /* Battery debounce (64 ms) */
-#define POLARITY_DEBOUNCE 16 /* Polarity debounce (64 ms) */
+#define RING_DEBOUNCE 4 /* Ringer Debounce (64 ms) */
+#define DEFAULT_BATT_DEBOUNCE 4 /* Battery debounce (64 ms) */
+#define POLARITY_DEBOUNCE 4 /* Polarity debounce (64 ms) */
#define DEFAULT_BATT_THRESH 3 /* Anything under this is "no battery" */
#define OHT_TIMER 6000 /* How long after RING to retain OHT */
@@ -338,6 +338,8 @@
/* Receive hook state and debouncing */
int modtype[NUM_CARDS];
+ unsigned char reg0shadow[NUM_CARDS];
+ unsigned char reg1shadow[NUM_CARDS];
unsigned long ioaddr;
dma_addr_t readdma;
@@ -803,13 +805,13 @@
{
int res;
/* Check loopback */
- res = wctdm_getreg(wc, card, 8);
- if (res) {
- printk("Ouch, part reset, quickly restoring reality (%d)\n", card);
- wctdm_init_proslic(wc, card, 1, 0, 1);
- } else {
- res = wctdm_getreg(wc, card, 64);
- if (!res && (res != wc->mod[card].fxs.lasttxhook)) {
+ res = wc->reg1shadow[card];
+ if (!res && (res != wc->mod[card].fxs.lasttxhook)) {
+ res = wctdm_getreg(wc, card, 8);
+ if (res) {
+ printk("Ouch, part reset, quickly restoring reality (%d)\n", card);
+ wctdm_init_proslic(wc, card, 1, 0, 1);
+ } else {
if (wc->mod[card].fxs.palarms++ < MAX_ALARMS) {
printk("Power alarm on module %d, resetting!\n", card + 1);
if (wc->mod[card].fxs.lasttxhook == 4)
@@ -831,7 +833,7 @@
signed char b;
int poopy = 0;
/* Try to track issues that plague slot one FXO's */
- b = wctdm_getreg(wc, card, 5);
+ b = wc->reg0shadow[card];
if ((b & 0x2) || !(b & 0x8)) {
/* Not good -- don't look at anything else */
if (debug)
@@ -850,9 +852,9 @@
return;
#ifndef AUDIO_RINGCHECK
if (!wc->mod[card].fxo.offhook) {
- res = wctdm_getreg(wc, card, 5);
+ res = wc->reg0shadow[card];
if ((res & 0x60) && wc->mod[card].fxo.battery) {
- wc->mod[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 4);
+ wc->mod[card].fxo.ringdebounce += (ZT_CHUNKSIZE * 16);
if (wc->mod[card].fxo.ringdebounce >= ZT_CHUNKSIZE * 64) {
if (!wc->mod[card].fxo.wasringing) {
wc->mod[card].fxo.wasringing = 1;
@@ -863,10 +865,10 @@
wc->mod[card].fxo.ringdebounce = ZT_CHUNKSIZE * 64;
}
} else {
- wc->mod[card].fxo.ringdebounce -= ZT_CHUNKSIZE;
+ 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;
+ 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);
@@ -877,7 +879,7 @@
}
}
#endif
- b = wctdm_getreg(wc, card, 29);
+ b = wc->reg1shadow[card];
#if 0
{
static int count = 0;
@@ -955,13 +957,13 @@
wc->mod[card].fxo.polaritydebounce--;
if (wc->mod[card].fxo.polaritydebounce < 1) {
if (wc->mod[card].fxo.lastpol != wc->mod[card].fxo.polarity) {
- if (debug)
- printk("%lu Polarity reversed (%d -> %d)\n", jiffies,
- wc->mod[card].fxo.polarity,
- wc->mod[card].fxo.lastpol);
- if (wc->mod[card].fxo.polarity)
- zt_qevent_lock(&wc->chans[card], ZT_EVENT_POLARITY);
- wc->mod[card].fxo.polarity = wc->mod[card].fxo.lastpol;
+ if (debug)
+ printk("%lu Polarity reversed (%d -> %d)\n", jiffies,
+ wc->mod[card].fxo.polarity,
+ wc->mod[card].fxo.lastpol);
+ if (wc->mod[card].fxo.polarity)
+ zt_qevent_lock(&wc->chans[card], ZT_EVENT_POLARITY);
+ wc->mod[card].fxo.polarity = wc->mod[card].fxo.lastpol;
}
}
}
@@ -975,7 +977,7 @@
/* For some reason we have to debounce the
hook detector. */
- res = wctdm_getreg(wc, card, 68);
+ res = wc->reg0shadow[card];
hook = (res & 1);
if (hook != wc->mod[card].fxs.lastrxhook) {
/* Reset the debounce (must be multiple of 4ms) */
@@ -985,7 +987,7 @@
#endif
} else {
if (wc->mod[card].fxs.debounce > 0) {
- wc->mod[card].fxs.debounce-= 4 * ZT_CHUNKSIZE;
+ wc->mod[card].fxs.debounce-= 16 * ZT_CHUNKSIZE;
#if 0
printk("Sustaining hook %d, %d\n", hook, wc->mod[card].fxs.debounce);
#endif
@@ -1029,6 +1031,7 @@
struct wctdm *wc = dev_id;
unsigned char ints;
int x;
+ int mode;
ints = inb(wc->ioaddr + WC_INTSTAT);
outb(ints, wc->ioaddr + WC_INTSTAT);
@@ -1094,14 +1097,37 @@
if (ints & 0x0f) {
wc->intcount++;
- x = wc->intcount % 4;
+ x = wc->intcount & 0x3;
+ mode = wc->intcount & 0xc;
if (wc->cardflag & (1 << x)) {
- if (wc->modtype[x] == MOD_TYPE_FXS) {
- wctdm_proslic_check_hook(wc, x);
- if (!(wc->intcount & 0xfc))
- wctdm_proslic_recheck_sanity(wc, x);
- } else if (wc->modtype[x] == MOD_TYPE_FXO) {
- wctdm_voicedaa_check_hook(wc, x);
+ switch(mode) {
+ case 0:
+ /* Rest */
+ break;
+ case 4:
+ /* Read first shadow reg */
+ if (wc->modtype[x] == MOD_TYPE_FXS)
+ wc->reg0shadow[x] = wctdm_getreg(wc, x, 68);
+ else if (wc->modtype[x] == MOD_TYPE_FXO)
+ wc->reg0shadow[x] = wctdm_getreg(wc, x, 5);
+ break;
+ case 8:
+ /* Read second shadow reg */
+ if (wc->modtype[x] == MOD_TYPE_FXS)
+ wc->reg1shadow[x] = wctdm_getreg(wc, x, 64);
+ else if (wc->modtype[x] == MOD_TYPE_FXO)
+ wc->reg1shadow[x] = wctdm_getreg(wc, x, 29);
+ break;
+ case 12:
+ /* Perform processing */
+ if (wc->modtype[x] == MOD_TYPE_FXS) {
+ wctdm_proslic_check_hook(wc, x);
+ if (!(wc->intcount & 0xf0))
+ wctdm_proslic_recheck_sanity(wc, x);
+ } else if (wc->modtype[x] == MOD_TYPE_FXO) {
+ wctdm_voicedaa_check_hook(wc, x);
+ }
+ break;
}
}
if (!(wc->intcount % 10000)) {
More information about the svn-commits
mailing list