--- /dev/null
+From 753649dbc49345a73a2454c770a3f2d54d11aec6 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Wed, 31 Mar 2010 13:30:19 +0200
+Subject: genirq: Force MSI irq handlers to run with interrupts disabled
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 753649dbc49345a73a2454c770a3f2d54d11aec6 upstream.
+
+Network folks reported that directing all MSI-X vectors of their multi
+queue NICs to a single core can cause interrupt stack overflows when
+enough interrupts fire at the same time.
+
+This is caused by the fact that we run interrupt handlers by default
+with interrupts enabled unless the driver reuqests the interrupt with
+the IRQF_DISABLED set. The NIC handlers do not set this flag, so
+simultaneous interrupts can nest unlimited and cause the stack
+overflow.
+
+The only safe counter measure is to run the interrupt handlers with
+interrupts disabled. We can't switch to this mode in general right
+now, but it is safe to do so for MSI interrupts.
+
+Force IRQF_DISABLED for MSI interrupt handlers.
+
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Andi Kleen <andi@firstfloor.org>
+Cc: Linus Torvalds <torvalds@osdl.org>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Ingo Molnar <mingo@elte.hu>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
+Cc: David Miller <davem@davemloft.net>
+Cc: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/irq/manage.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/kernel/irq/manage.c
++++ b/kernel/irq/manage.c
+@@ -753,6 +753,16 @@ __setup_irq(unsigned int irq, struct irq
+ if (new->flags & IRQF_ONESHOT)
+ desc->status |= IRQ_ONESHOT;
+
++ /*
++ * Force MSI interrupts to run with interrupts
++ * disabled. The multi vector cards can cause stack
++ * overflows due to nested interrupts when enough of
++ * them are directed to a core and fire at the same
++ * time.
++ */
++ if (desc->msi_desc)
++ new->flags |= IRQF_DISABLED;
++
+ if (!(desc->status & IRQ_NOAUTOEN)) {
+ desc->depth = 0;
+ desc->status &= ~IRQ_DISABLED;
--- /dev/null
+From 4c7d849204341dea19be941a3c1eb4bdffac9cc4 Mon Sep 17 00:00:00 2001
+From: Seth Heasley <seth.heasley@intel.com>
+Date: Thu, 25 Mar 2010 16:14:41 -0700
+Subject: WATCHDOG: iTCO_wdt: TCO Watchdog patch for additional Intel Cougar Point DeviceIDs
+
+From: Seth Heasley <seth.heasley@intel.com>
+
+commit 4c7d849204341dea19be941a3c1eb4bdffac9cc4 upstream.
+
+This patch adds the Intel Cougar Point PCH LPC Controller DeviceIDs for iTCO Watchdog.
+
+Signed-off-by: Seth Heasley <seth.heasley@intel.com>
+Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/watchdog/iTCO_wdt.c | 99 +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 93 insertions(+), 6 deletions(-)
+
+--- a/drivers/watchdog/iTCO_wdt.c
++++ b/drivers/watchdog/iTCO_wdt.c
+@@ -115,8 +115,37 @@ enum iTCO_chipsets {
+ TCO_3420, /* 3420 */
+ TCO_3450, /* 3450 */
+ TCO_EP80579, /* EP80579 */
+- TCO_CPTD, /* CPT Desktop */
+- TCO_CPTM, /* CPT Mobile */
++ TCO_CPT1, /* Cougar Point */
++ TCO_CPT2, /* Cougar Point Desktop */
++ TCO_CPT3, /* Cougar Point Mobile */
++ TCO_CPT4, /* Cougar Point */
++ TCO_CPT5, /* Cougar Point */
++ TCO_CPT6, /* Cougar Point */
++ TCO_CPT7, /* Cougar Point */
++ TCO_CPT8, /* Cougar Point */
++ TCO_CPT9, /* Cougar Point */
++ TCO_CPT10, /* Cougar Point */
++ TCO_CPT11, /* Cougar Point */
++ TCO_CPT12, /* Cougar Point */
++ TCO_CPT13, /* Cougar Point */
++ TCO_CPT14, /* Cougar Point */
++ TCO_CPT15, /* Cougar Point */
++ TCO_CPT16, /* Cougar Point */
++ TCO_CPT17, /* Cougar Point */
++ TCO_CPT18, /* Cougar Point */
++ TCO_CPT19, /* Cougar Point */
++ TCO_CPT20, /* Cougar Point */
++ TCO_CPT21, /* Cougar Point */
++ TCO_CPT22, /* Cougar Point */
++ TCO_CPT23, /* Cougar Point */
++ TCO_CPT24, /* Cougar Point */
++ TCO_CPT25, /* Cougar Point */
++ TCO_CPT26, /* Cougar Point */
++ TCO_CPT27, /* Cougar Point */
++ TCO_CPT28, /* Cougar Point */
++ TCO_CPT29, /* Cougar Point */
++ TCO_CPT30, /* Cougar Point */
++ TCO_CPT31, /* Cougar Point */
+ };
+
+ static struct {
+@@ -173,8 +202,37 @@ static struct {
+ {"3420", 2},
+ {"3450", 2},
+ {"EP80579", 2},
+- {"CPT Desktop", 2},
+- {"CPT Mobile", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
++ {"Cougar Point", 2},
+ {NULL, 0}
+ };
+
+@@ -259,8 +317,37 @@ static struct pci_device_id iTCO_wdt_pci
+ { ITCO_PCI_DEVICE(0x3b14, TCO_3420)},
+ { ITCO_PCI_DEVICE(0x3b16, TCO_3450)},
+ { ITCO_PCI_DEVICE(0x5031, TCO_EP80579)},
+- { ITCO_PCI_DEVICE(0x1c42, TCO_CPTD)},
+- { ITCO_PCI_DEVICE(0x1c43, TCO_CPTM)},
++ { ITCO_PCI_DEVICE(0x1c41, TCO_CPT1)},
++ { ITCO_PCI_DEVICE(0x1c42, TCO_CPT2)},
++ { ITCO_PCI_DEVICE(0x1c43, TCO_CPT3)},
++ { ITCO_PCI_DEVICE(0x1c44, TCO_CPT4)},
++ { ITCO_PCI_DEVICE(0x1c45, TCO_CPT5)},
++ { ITCO_PCI_DEVICE(0x1c46, TCO_CPT6)},
++ { ITCO_PCI_DEVICE(0x1c47, TCO_CPT7)},
++ { ITCO_PCI_DEVICE(0x1c48, TCO_CPT8)},
++ { ITCO_PCI_DEVICE(0x1c49, TCO_CPT9)},
++ { ITCO_PCI_DEVICE(0x1c4a, TCO_CPT10)},
++ { ITCO_PCI_DEVICE(0x1c4b, TCO_CPT11)},
++ { ITCO_PCI_DEVICE(0x1c4c, TCO_CPT12)},
++ { ITCO_PCI_DEVICE(0x1c4d, TCO_CPT13)},
++ { ITCO_PCI_DEVICE(0x1c4e, TCO_CPT14)},
++ { ITCO_PCI_DEVICE(0x1c4f, TCO_CPT15)},
++ { ITCO_PCI_DEVICE(0x1c50, TCO_CPT16)},
++ { ITCO_PCI_DEVICE(0x1c51, TCO_CPT17)},
++ { ITCO_PCI_DEVICE(0x1c52, TCO_CPT18)},
++ { ITCO_PCI_DEVICE(0x1c53, TCO_CPT19)},
++ { ITCO_PCI_DEVICE(0x1c54, TCO_CPT20)},
++ { ITCO_PCI_DEVICE(0x1c55, TCO_CPT21)},
++ { ITCO_PCI_DEVICE(0x1c56, TCO_CPT22)},
++ { ITCO_PCI_DEVICE(0x1c57, TCO_CPT23)},
++ { ITCO_PCI_DEVICE(0x1c58, TCO_CPT24)},
++ { ITCO_PCI_DEVICE(0x1c59, TCO_CPT25)},
++ { ITCO_PCI_DEVICE(0x1c5a, TCO_CPT26)},
++ { ITCO_PCI_DEVICE(0x1c5b, TCO_CPT27)},
++ { ITCO_PCI_DEVICE(0x1c5c, TCO_CPT28)},
++ { ITCO_PCI_DEVICE(0x1c5d, TCO_CPT29)},
++ { ITCO_PCI_DEVICE(0x1c5e, TCO_CPT30)},
++ { ITCO_PCI_DEVICE(0x1c5f, TCO_CPT31)},
+ { 0, }, /* End of list */
+ };
+ MODULE_DEVICE_TABLE(pci, iTCO_wdt_pci_tbl);