Greg, Alan,

It looks like we can't win WRT USB handoff. There are some boxes that
need it and there are some that can't live with it but latter seems to
be a minority. Unfortunately there were box kinds of reports for both
UHCI and OHCI so we can't rely on controller type to decide whether
we should perform early handoff or not. So I think sensible way is to
have DMI table of boxes that can't stomach early handoff. What do you
think?

-- 
Dmitry


USB: disable early handoff on Dell Precision WorkStation 380

Early handoff makes keyboard controller dead on this box.
See bugzilla #6130 (reports form Mirza Pasovic).

Signed-off-by: Dmitry Torokhov <[EMAIL PROTECTED]>
---

 drivers/usb/host/pci-quirks.c |   41 ++++++++++++++++++++++++++++++++++-------
 1 files changed, 34 insertions(+), 7 deletions(-)

Index: work/drivers/usb/host/pci-quirks.c
===================================================================
--- work.orig/drivers/usb/host/pci-quirks.c
+++ work/drivers/usb/host/pci-quirks.c
@@ -334,19 +334,46 @@ static void __devinit quirk_usb_disable_
        writel(0x3f, op_reg_base + EHCI_USBSTS);
 
        iounmap(base);
+}
+
+#if defined(__i386__)
+
+#include <linux/dmi.h>
+
+static struct dmi_system_id no_usb_handoff_table[] __devinitdata = {
+       {
+               .ident = "Dell Precision 380",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME , "Precision WorkStation 
380"),
+               },
+       },
+       { }
+};
 
-       return;
+static inline int usb_early_handoff_enabled(void)
+{
+       return !dmi_check_system(no_usb_handoff_table);
 }
 
+#else
+
+static inline int usb_early_handoff_enabled(void)
+{
+       return 1;
+}
 
+#endif /* defined(__i386__) */
 
 static void __devinit quirk_usb_early_handoff(struct pci_dev *pdev)
 {
-       if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI)
-               quirk_usb_handoff_uhci(pdev);
-       else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI)
-               quirk_usb_handoff_ohci(pdev);
-       else if (pdev->class == PCI_CLASS_SERIAL_USB_EHCI)
-               quirk_usb_disable_ehci(pdev);
+       if (usb_early_handoff_enabled()) {
+               if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI)
+                       quirk_usb_handoff_uhci(pdev);
+               else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI)
+                       quirk_usb_handoff_ohci(pdev);
+               else if (pdev->class == PCI_CLASS_SERIAL_USB_EHCI)
+                       quirk_usb_disable_ehci(pdev);
+       }
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_usb_early_handoff);

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to