diff options
author | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-08-16 20:02:58 +0000 |
---|---|---|
committer | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-08-16 20:02:58 +0000 |
commit | 22f5056196575c3ec7516c9acf55cb5786565d15 (patch) | |
tree | 5008f4a44622bf94be50a2583a33979c7a846ae9 | |
parent | 7f0b345c5620a144d103f5594d3e444bcd2e370e (diff) |
Fix for when voicebus based cards stop taking interrupts on some systems
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2857 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rw-r--r-- | wctdm24xxp/base.c | 13 | ||||
-rw-r--r-- | wcte12xp.c | 9 |
2 files changed, 19 insertions, 3 deletions
diff --git a/wctdm24xxp/base.c b/wctdm24xxp/base.c index f499707..8bc1fd4 100644 --- a/wctdm24xxp/base.c +++ b/wctdm24xxp/base.c @@ -1554,6 +1554,15 @@ ZAP_IRQ_HANDLER(wctdm_interrupt) wctdm_setctl(wc, 0x0008, 0x00000000); #endif } + + if (ints & 0x0000a3ae) { + /* This will allow us to recover if interrupts are held for a long period of time */ + if (debug & DEBUG_CARD) + printk("Abnormal interrupt %08x detected\n", ints); + wctdm_setctl(wc, 0x0008, 0x00000000); + wctdm_setctl(wc, 0x0010, 0x00000000); + } + #ifdef LINUX26 return IRQ_RETVAL(1); #endif @@ -3201,8 +3210,8 @@ static void wctdm_locate_modules(struct wctdm *wc) for (x=0;x<10;x++) schluffen(&wc->regq); printk("After resetting the modules...\n"); - /* Switch to caring only about receive interrupts */ - wctdm_setintmask(wc, 0x00010040); + + wctdm_setintmask(wc, 0x0001f7fe); /* Make sure all units go into daisy chain mode */ spin_lock_irqsave(&wc->reglock, flags); @@ -728,7 +728,7 @@ static void t1_start_dma(struct t1 *wc) for (x = 0; x < 10; x++) schluffen(&wc->regq); /* Switch to caring only about receive interrupts */ - t1_setintmask(wc, 0x00010040); + t1_setintmask(wc, 0x0001f7fe); } static void t1_stop_dma(struct t1 *wc) @@ -1861,6 +1861,13 @@ ZAP_IRQ_HANDLER(te12xp_interrupt) } while(res); } + if (ints & 0x0000a3ae) { + /* This will allow us to recover if interrupts are held for a long period of time */ + debug_printk(1, "Abnormal interrupt %08x detected\n", ints); + t1_setctl(wc, 0x0008, 0x00000000); + t1_setctl(wc, 0x0010, 0x00000000); + } + #ifdef LINUX26 return IRQ_RETVAL(1); #endif |