[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.