From b5ac7e6f7e0d1af9dbb4bdb56921ab04de4e1ade Mon Sep 17 00:00:00 2001 From: ppisa Date: Fri, 16 Jul 2004 15:44:20 +0000 Subject: [PATCH] EMS CPC-PCI fix correcting poorly undocumented PITA2 IRQ behavior. This workaround compiles only for 2.6.x kernels now and correct fix compatible with 2.4 requires driver wide changes. That is why CPC-PCI is not enabled by default. --- lincan/src/Makefile.std | 3 ++- lincan/src/ems_cpcpci.c | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lincan/src/Makefile.std b/lincan/src/Makefile.std index 01a6dd8..29a2b30 100644 --- a/lincan/src/Makefile.std +++ b/lincan/src/Makefile.std @@ -63,7 +63,8 @@ endif SUPPORTED_CARDS = pip pccan smartcan nsi cc_can104 \ pc_i03 pcm3680 aim104 m437 pcccan ssv \ bfadcan pikronisa kv_pcican msmcan virtual template \ - unican unican_cl2 ems_cpcpci + unican unican_cl2 +# ems_cpcpci # compiles only for 2.6 kernels now # hms30c7202_can c_can c_can_irq diff --git a/lincan/src/ems_cpcpci.c b/lincan/src/ems_cpcpci.c index 41441f3..da82fd3 100644 --- a/lincan/src/ems_cpcpci.c +++ b/lincan/src/ems_cpcpci.c @@ -191,22 +191,25 @@ can_irqreturn_t ems_cpcpci_irq_handler(int irq, void *dev_id, struct pt_regs *re struct candevice_t *candev=chip->hostdevice; int i; unsigned long icr; + int test_irq_again; icr=readl(candev->dev_base_addr + PITA2_ICR); - if(!(icr & PITA2_ICR_INT0)) return IRQ_NONE; + if(!(icr & PITA2_ICR_INT0)) return CAN_IRQ_NONE; /* correct way to handle interrupts from all chips connected to the one PITA-2 */ do { writel(PITA2_ICR_INT0_En | PITA2_ICR_INT0, candev->dev_base_addr + PITA2_ICR); + test_irq_again=0; for(i=0;inr_all_chips;i++){ chip=candev->chip[i]; if(!chip || !(chip->flags&CHIP_CONFIGURED)) continue; - sja1000p_irq_handler(irq, chip, regs); + if(sja1000p_irq_handler(irq, chip, regs)) + test_irq_again=1; } icr=readl(candev->dev_base_addr + PITA2_ICR); - } while(icr & PITA2_ICR_INT0); - return IRQ_HANDLED; + } while((icr & PITA2_ICR_INT0)||test_irq_again); + return CAN_IRQ_HANDLED; } int ems_cpcpci_reset(struct candevice_t *candev) -- 2.39.2