lkml.org 
[lkml]   [2004]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] fix PCI interrupt setting for ia64
Hi,

In ia64 kernel, IOSAPIC's RTEs for PCI interrupts are unmasked at the
boot time before installing device drivers. I think it is very dangerous.
If some PCI devices without device driver generate interrupts, interrupts
are generated repeatedly because these interrupt requests are never
cleared. I think RTEs for PCI interrupts should be unmasked by device
driver.

A following patch fixes this issue.

Regards,
Kenji Kaneshige


diff -Naur linux-2.6.4-rc2/arch/ia64/kernel/iosapic.c
linux-2.6.4-rc2-changed/arch/ia64/kernel/iosapic.c
--- linux-2.6.4-rc2/arch/ia64/kernel/iosapic.c 2004-03-05
15:13:53.155237277 +0900
+++ linux-2.6.4-rc2-changed/arch/ia64/kernel/iosapic.c 2004-03-05
16:48:31.856142526 +0900
@@ -170,7 +170,7 @@
}

static void
-set_rte (unsigned int vector, unsigned int dest)
+set_rte (unsigned int vector, unsigned int dest, int mask)
{
unsigned long pol, trigger, dmode;
u32 low32, high32;
@@ -205,6 +205,7 @@
low32 = ((pol << IOSAPIC_POLARITY_SHIFT) |
(trigger << IOSAPIC_TRIGGER_SHIFT) |
(dmode << IOSAPIC_DELIVERY_SHIFT) |
+ ((mask ? 1 : 0) << IOSAPIC_MASK_SHIFT) |
vector);

/* dest contains both id and eid */
@@ -509,7 +510,7 @@
(trigger == IOSAPIC_EDGE ? "edge" : "level"), dest, vector);

/* program the IOSAPIC routing table */
- set_rte(vector, dest);
+ set_rte(vector, dest, 0);
return vector;
}

@@ -557,7 +558,7 @@
(trigger == IOSAPIC_EDGE ? "edge" : "level"), dest, vector);

/* program the IOSAPIC routing table */
- set_rte(vector, dest);
+ set_rte(vector, dest, 0);
return vector;
}

@@ -583,7 +584,7 @@
trigger == IOSAPIC_EDGE ? "edge" : "level", dest, vector);

/* program the IOSAPIC routing table */
- set_rte(vector, dest);
+ set_rte(vector, dest, 0);
}

void __init
@@ -669,7 +670,7 @@
/* direct the interrupt vector to the running cpu id */
dest = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff;
#endif
- set_rte(vector, dest);
+ set_rte(vector, dest, 1);

printk(KERN_INFO "IOSAPIC: vector %d -> CPU 0x%04x, enabled\n",
vector, dest);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:01    [W:0.098 / U:1.500 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site