[PATCH] x445 usb legacy fix

From: john stultz
Date: Mon Jul 19 2004 - 20:13:54 EST


Greg, All,
Apparently there is an issue w/ the IBM x440/x445's BIOS's USB Legacy
support. Due to the delay in issuing SMI's across the IOAPICs, its
possible for I/O to ports 60/64 to cause register corruption.

The solution is to disable the BIOS's USB Legacy support early in boot
(via PCI quirks) for x440/x445 systems.

This is the same method posted to lkml here (Originally written by
Vojtech): http://www.ussg.iu.edu/hypermail/linux/kernel/0405.3/1712.html

(Use the following link for the raw mbox email)
http://lkml.org/lkml/mbox/2004/5/31/97

While Greg was cautious that this method couldn't always be used, I've
created a patch that applies on top of Vojtech's that creates a boot
option which allows you to specify "no-usb-legacy". Additionally this
patch enables the "no-usb-legacy" option by default for x440/x445
systems.

Please consider for inclusion (along with the patch linked to above)
into your tree.

thanks
-john

diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
--- a/Documentation/kernel-parameters.txt Mon Jul 19 18:06:40 2004
+++ b/Documentation/kernel-parameters.txt Mon Jul 19 18:06:40 2004
@@ -757,6 +757,8 @@

nousb [USB] Disable the USB subsystem

+ no-usb-legacy [USB] Disables BIOS SMM USB Legacy Support
+
nowb [ARM]

opl3= [HW,OSS]
diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c
--- a/drivers/pci/quirks.c Mon Jul 19 18:06:40 2004
+++ b/drivers/pci/quirks.c Mon Jul 19 18:06:40 2004
@@ -916,8 +916,18 @@
#define OHCI_CTRL_IR (1 << 8) /* interrupt routing */
#define OHCI_INTR_OC (1 << 30) /* ownership change */

+int disable_legacy_usb __initdata = 0;
+static int __init usb_legacy_disable(char *str)
+{
+ disable_legacy_usb = 1;
+ return 0;
+}
+__setup("no-usb-legacy", usb_legacy_disable);
+
static void __init quirk_usb_disable_smm_bios(struct pci_dev *pdev)
{
+ if (!disable_legacy_usb)
+ return;

if (pdev->class == ((PCI_CLASS_SERIAL_USB << 8) | 0x00)) { /* UHCI */
int i;
diff -Nru a/include/asm-i386/mach-summit/mach_mpparse.h b/include/asm-i386/mach-summit/mach_mpparse.h
--- a/include/asm-i386/mach-summit/mach_mpparse.h Mon Jul 19 18:06:40 2004
+++ b/include/asm-i386/mach-summit/mach_mpparse.h Mon Jul 19 18:06:40 2004
@@ -22,6 +22,7 @@
{
}

+extern int disable_legacy_usb;
static inline int mps_oem_check(struct mp_config_table *mpc, char *oem,
char *productid)
{
@@ -31,6 +32,7 @@
|| !strncmp(productid, "RUTHLESS SMP", 12))){
use_cyclone = 1; /*enable cyclone-timer*/
setup_summit();
+ disable_legacy_usb = 1;
return 1;
}
return 0;
@@ -44,6 +46,7 @@
|| !strncmp(oem_table_id, "EXA", 3))){
use_cyclone = 1; /*enable cyclone-timer*/
setup_summit();
+ disable_legacy_usb = 1;
return 1;
}
return 0;


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/