|
@@ -66,6 +66,8 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
|
{
|
|
{
|
|
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
|
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
|
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
|
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
|
|
|
+ struct pci_dev *p_smbus;
|
|
|
|
+ u8 rev;
|
|
u32 temp;
|
|
u32 temp;
|
|
int retval;
|
|
int retval;
|
|
|
|
|
|
@@ -166,6 +168,25 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
|
pci_write_config_byte(pdev, 0x4b, tmp | 0x20);
|
|
pci_write_config_byte(pdev, 0x4b, tmp | 0x20);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
+ case PCI_VENDOR_ID_ATI:
|
|
|
|
+ /* SB700 old version has a bug in EHCI controller,
|
|
|
|
+ * which causes usb devices lose response in some cases.
|
|
|
|
+ */
|
|
|
|
+ if (pdev->device == 0x4396) {
|
|
|
|
+ p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
|
|
|
|
+ PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
|
|
|
+ NULL);
|
|
|
|
+ if (!p_smbus)
|
|
|
|
+ break;
|
|
|
|
+ rev = p_smbus->revision;
|
|
|
|
+ if ((rev == 0x3a) || (rev == 0x3b)) {
|
|
|
|
+ u8 tmp;
|
|
|
|
+ pci_read_config_byte(pdev, 0x53, &tmp);
|
|
|
|
+ pci_write_config_byte(pdev, 0x53, tmp | (1<<3));
|
|
|
|
+ }
|
|
|
|
+ pci_dev_put(p_smbus);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
ehci_reset(ehci);
|
|
ehci_reset(ehci);
|