2007-05-26 22:01:18

by Jay Cliburn

[permalink] [raw]
Subject: [stable][PATCH] pci: quirk disable MSI on via vt3351


The Via VT3351 APIC does not play well with MSI and unleashes a flood
of APIC errors when MSI is used to deliver interrupts. The problem
was recently exposed when the atl1 network device driver, which enables
MSI by default, stimulated APIC errors on an Asus M2V mainboard, which
employs the Via VT3351.
See http://bugzilla.kernel.org/show_bug.cgi?id=8472 for additional
details on this bug.

Signed-off-by: Jay Cliburn <[email protected]>
---
drivers/pci/quirks.c | 1 +
include/linux/pci_ids.h | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 5af9125..e2d81af 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1751,6 +1751,7 @@ static void __init quirk_disable_all_msi(struct pci_dev *dev)
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);

/* Disable MSI on chipsets that are known to not support it */
static void __devinit quirk_disable_msi(struct pci_dev *dev)
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 600308f..2a0a70d 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1287,6 +1287,7 @@
#define PCI_DEVICE_ID_VIA_P4M800CE 0x0314
#define PCI_DEVICE_ID_VIA_P4M890 0x0327
#define PCI_DEVICE_ID_VIA_VT3336 0x0336
+#define PCI_DEVICE_ID_VIA_VT3351 0x0351
#define PCI_DEVICE_ID_VIA_8371_0 0x0391
#define PCI_DEVICE_ID_VIA_8501_0 0x0501
#define PCI_DEVICE_ID_VIA_82C561 0x0561


2007-05-27 00:21:11

by Adrian Bunk

[permalink] [raw]
Subject: Re: [stable][PATCH] pci: quirk disable MSI on via vt3351

On Sat, May 26, 2007 at 05:01:04PM -0500, Jay Cliburn wrote:
>
> The Via VT3351 APIC does not play well with MSI and unleashes a flood
> of APIC errors when MSI is used to deliver interrupts. The problem
> was recently exposed when the atl1 network device driver, which enables
> MSI by default, stimulated APIC errors on an Asus M2V mainboard, which
> employs the Via VT3351.
> See http://bugzilla.kernel.org/show_bug.cgi?id=8472 for additional
> details on this bug.
>...

Please get patches included in Linus' tree _before_ submitting them for
-stable.

Adding a fix to 2.6.21 that is not yet in 2.6.22-rc would create a
regression in 2.6.22.

cu
Adrian

--

"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon Seed

2007-05-27 01:50:24

by Jay Cliburn

[permalink] [raw]
Subject: Re: [stable][PATCH] pci: quirk disable MSI on via vt3351

On Sun, 27 May 2007 02:20:52 +0200
Adrian Bunk <[email protected]> wrote:

> On Sat, May 26, 2007 at 05:01:04PM -0500, Jay Cliburn wrote:
> >
> > The Via VT3351 APIC does not play well with MSI and unleashes a
> > flood of APIC errors when MSI is used to deliver interrupts. The
> > problem was recently exposed when the atl1 network device driver,
> > which enables MSI by default, stimulated APIC errors on an Asus M2V
> > mainboard, which employs the Via VT3351.
> > See http://bugzilla.kernel.org/show_bug.cgi?id=8472 for additional
> > details on this bug.
> >...
>
> Please get patches included in Linus' tree _before_ submitting them
> for -stable.
>
> Adding a fix to 2.6.21 that is not yet in 2.6.22-rc would create a
> regression in 2.6.22.

Okay, thanks Adrian. I didn't realize I was making a mistake. I've
been waiting for the below patch to make it upstream, but it landed
in stable first, so I guess there's a regression as you indicate. My
patch depends upon this one.


Subject: [patch 41/69] pci-quirks: disable MSI on RS400-200 and RS480
Date: Mon, 21 May 2007 12:16:53 -0700
Sender: [email protected]
User-Agent: quilt/0.46-1

-stable review patch. If anyone has any objections, please let us know.
---------------------

From: Tejun Heo <[email protected]>

MSI doesn't work on RS400-200 and RS480 requiring pci=nomsi kernel boot
parameter for ahci to work. This patch renames quirk_svw_msi() to
quirk_disable_all_msi() and use it to disable MSI on those chips.

http://thread.gmane.org/gmane.linux.ide/17820
http://thread.gmane.org/gmane.linux.ide/17516
https://bugzilla.novell.com/show_bug.cgi?id=263893

Signed-off-by: Tejun Heo <[email protected]>
Cc: Matí-as Alejandro Torres <[email protected]>
Cc: Greg K-H <[email protected]>
Cc: Jeff Garzik <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Chris Wright <[email protected]>
---

drivers/pci/quirks.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)

--- linux-2.6.21.1.orig/drivers/pci/quirks.c
+++ linux-2.6.21.1/drivers/pci/quirks.c
@@ -1737,18 +1737,20 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_N
quirk_nvidia_ck804_pcie_aer_ext_cap);

#ifdef CONFIG_PCI_MSI
-/* The Serverworks PCI-X chipset does not support MSI. We cannot
easily rely
- * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are
actually
- * some other busses controlled by the chipset even if Linux is not
aware of it.
- * Instead of setting the flag on all busses in the machine, simply
disable MSI
- * globally.
+/* Some chipsets do not support MSI. We cannot easily rely on setting
+ * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually
+ * some other busses controlled by the chipset even if Linux is not
+ * aware of it. Instead of setting the flag on all busses in the
+ * machine, simply disable MSI globally.
*/
-static void __init quirk_svw_msi(struct pci_dev *dev)
+static void __init quirk_disable_all_msi(struct pci_dev *dev)
{
pci_no_msi();
printk(KERN_WARNING "PCI: MSI quirk detected. MSI
deactivated.\n"); }
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS,
PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS,
PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI,
PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480,
quirk_disable_all_msi); /* Disable MSI on chipsets that are known to
not support it */ static void __devinit quirk_disable_msi(struct
pci_dev *dev)

--