[Prism54-devel] [Bug 60] 2.6 modprobe oops: request_irq/interrupt race

bugzilla-daemon@mcgrof.com bugzilla-daemon@mcgrof.com
Thu, 26 Feb 2004 19:03:46 +0000 (UTC)


http://prism54.org/cgi-bin/bugzilla/show_bug.cgi?id=60





------- Additional Comments From vda@port.imtp.ilyichevsk.odessa.ua  2004-02-26 19:03 -------
With patch below I was able to see the problem and test the solution.
syslog:
20:27:03 Loaded prism54 driver, version 1.0.2.2
20:27:03 PCI: Found IRQ 10 for device 0000:00:09.0
20:27:03 1 spurious IRQs 10 ignored
20:27:03 2 spurious IRQs 10 ignored
20:27:03 4 spurious IRQs 10 ignored
20:27:03 8 spurious IRQs 10 ignored
20:27:03 16 spurious IRQs 10 ignored
20:27:03 32 spurious IRQs 10 ignored
20:27:03 64 spurious IRQs 10 ignored
20:27:03 128 spurious IRQs 10 ignored
20:27:03 ISL38XX_INT_EN_REG = 0000001a, doing isl38xx_disable_interrupts()
20:27:03 eth1: prism54 driver detected card model: SMC2802W

patch:
--- prism54.2.more_oids/islpci_dev.c    Wed Feb 25 18:21:41 2004
+++ prism54.3.intr_race_fix/islpci_dev.c        Thu Feb 26 20:48:20 2004
@@ -73,6 +73,24 @@
                return IRQ_NONE;
        }

+       static unsigned int printk_limit = 1;
+       static unsigned int bug_count = 0;
+       if(islpci_get_state(priv) <= PRV_STATE_PREBOOT) {
+           /* vda: I've seen spurious intrs at request_irq time */
+           bug_count++;
+           if(bug_count>=printk_limit) {
+               printk("%d spurious IRQs %d ignored\n", bug_count, irq);
+               printk_limit*=2;
+               if(!printk_limit) printk_limit=1;
+           }
+           if(bug_count==250) {
+               reg = readl(device + ISL38XX_INT_EN_REG);
+               printk("ISL38XX_INT_EN_REG = %08x, doing
isl38xx_disable_interrupts()\n", reg);
+               isl38xx_disable_interrupts(device);
+           }
+           return IRQ_NONE; // ??
+       }
+
        if (islpci_get_state(priv) != PRV_STATE_SLEEP)
                powerstate = ISL38XX_PSM_ACTIVE_STATE;

Of course this patch isn't meant to be applied to mainline driver.
Proper fix is to put
        isl38xx_disable_interrupts(device);
just in front of request_irq().




------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.