diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-07-08 16:08:49 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-07-08 16:08:49 +0000 |
commit | 307685b3a6c9510462c313394be58b698cb6ce9c (patch) | |
tree | da8817f5c3cf7e61d4e0ea22bf97724f69dd3c08 | |
parent | 2003-07-08 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-307685b3a6c9510462c313394be58b698cb6ce9c.tar.bz2 |
2003-07-08 Joel Sherrill <joel@OARcorp.com>
PR 416/bsps
* ppc403/ictrl/ictrl.c (ictrl_isr): We acknolwegde the interrupt in
interrupt controller (clr_exisr(mask)) before calling the interrupt
handler that will acnowledge the interrupt source. This results in
the interrupt beeing seen a second time by the interrupt controller.
Reported and fixed by El Kolli Yacine <yacine.elkolli@crf.canon.fr>.
-rw-r--r-- | c/src/lib/libcpu/powerpc/ChangeLog | 9 | ||||
-rw-r--r-- | c/src/lib/libcpu/powerpc/ppc403/ictrl/ictrl.c | 3 |
2 files changed, 11 insertions, 1 deletions
diff --git a/c/src/lib/libcpu/powerpc/ChangeLog b/c/src/lib/libcpu/powerpc/ChangeLog index fe9814f92e..07f491052d 100644 --- a/c/src/lib/libcpu/powerpc/ChangeLog +++ b/c/src/lib/libcpu/powerpc/ChangeLog @@ -1,3 +1,12 @@ +2003-07-08 Joel Sherrill <joel@OARcorp.com> + + PR 416/bsps + * ppc403/ictrl/ictrl.c (ictrl_isr): We acknolwegde the interrupt in + interrupt controller (clr_exisr(mask)) before calling the interrupt + handler that will acnowledge the interrupt source. This results in + the interrupt beeing seen a second time by the interrupt controller. + Reported and fixed by El Kolli Yacine <yacine.elkolli@crf.canon.fr>. + 2003-03-25 Thomas Doerfler <Thomas.Doerfler@imd-systems.de> PR 368/filesystems diff --git a/c/src/lib/libcpu/powerpc/ppc403/ictrl/ictrl.c b/c/src/lib/libcpu/powerpc/ppc403/ictrl/ictrl.c index eb8bcb7bd8..769f200822 100644 --- a/c/src/lib/libcpu/powerpc/ppc403/ictrl/ictrl.c +++ b/c/src/lib/libcpu/powerpc/ppc403/ictrl/ictrl.c @@ -195,13 +195,14 @@ ictrl_isr(rtems_vector_number vector,CPU_Interrupt_frame *cpu_frame) for (exvec = 0;exvec < PPC_IRQ_EXT_MAX;exvec++) { mask = VEC_TO_EXMSK(exvec); if (0 != (istat & mask)) { - clr_exisr(mask); + /*clr_exisr(mask); too early to ack*/ handler = ictrl_vector_table[exvec]; if (handler) { istat &= ~mask; global_vec = exvec + PPC_IRQ_EXT_BASE; (handler)(global_vec); } + clr_exisr(mask);/* now we can ack*/ } } if (istat != 0) { /* anything left? then we have a spurious interrupt */ |