[PATCH] Fix i450NX handling of PCI peer buses when BIOS reports them correctly

TJ ubuntu at tjworld.net
Wed Apr 9 15:38:34 BST 2008

This is a fix for an issue that has affected Ubuntu since Gutsy (2.6.22)
especially on server platforms. I'm hoping we can get it into Hardy
since it is an LTS. The last Ubuntu version that doesn't suffer this
issue is Feisty with kernel 2.6.20. It should get into mainline shortly.

The problem is that on systems with Intel 450NX chipsets which provides
multiple PCI root buses, the 2nd and 3rd buses aren't enumerated because
the ACPI code ignores them, thinking they have already been enumerated.
This can lead to the issue reported in launchpad bug #149071


where RAID array controllers aren't discovered and therefore the server
won't boot. 

I extended that bug report somewhat and started afresh on the kernel
bugzilla with 2.6.25-rc8:


I was able to trace and identify the cause of the failure and produce a
very simple patch to fix it. The patch involves checking the DMI of the
system and if it is a Dell PowerEdge 6300 *not* applying the 450NX
fix-up. If other systems are discovered with the same problem their DMI
characteristics can be easily added as DMI_MATCH elements.

The proposed patch for mainline is attached to the bugzilla report. The
Hardy patch is attached here. I'll attach both the Gutsy and Hardy
patches to launchpad bug report #149071.


PCI: Don't scan i450NX secondary buses on Dell PowerEdge 6300

Signed off by: TJ <linux at tjworld.net>  

--- ubuntu-hardy.orig/arch/x86/pci/fixup.c	2008-04-09 15:24:25.000000000 +0100
+++ ubuntu-hardy/arch/x86/pci/fixup.c	2008-04-09 15:30:24.000000000 +0100
@@ -9,6 +9,19 @@
 #include "pci.h"
+/* TJ: Added to work around duplicate bus-scan and subsequent PERC 2 controller failure
+ * See http://bugzilla.kernel.org/show_bug.cgi?id=10396 */
+static struct dmi_system_id __devinitdata i450nx_dmi_table[] = {
+       {
+               .ident = "Dell-PowerEdge-6300",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 6300"),
+               },
+       },
+       {}
 static void __devinit pci_fixup_i450nx(struct pci_dev *d)
@@ -17,6 +30,18 @@
 	int pxb, reg;
 	u8 busno, suba, subb;
+	/* TJ: Added to work around duplicate bus-scan and subsequent Dell 
+	 * PERC 2 controller failure.
+	 * See http://bugzilla.kernel.org/show_bug.cgi?id=10396
+	 * 
+	 * NOTE: A matching entry causes a return without *doing anything* 
+	 * - the opposite of this logic in other cases.
+	 */
+		if (dmi_check_system(i450nx_dmi_table)) {
+			DBG("i450NX PXB fix-up ignored - found %s\n", i450nx_dmi_table.ident);
+			return; /* doesn't apply to matched systems */
+		}
 	printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
 	reg = 0xd0;
 	for(pxb=0; pxb<2; pxb++) {

More information about the kernel-team mailing list