|
@@ -1977,11 +1977,25 @@ static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
|
|
|
/*
|
|
|
* Disable PCI Bus Parking and PCI Master read caching on CX700
|
|
|
* which causes unspecified timing errors with a VT6212L on the PCI
|
|
|
- * bus leading to USB2.0 packet loss. The defaults are that these
|
|
|
- * features are turned off but some BIOSes turn them on.
|
|
|
+ * bus leading to USB2.0 packet loss.
|
|
|
+ *
|
|
|
+ * This quirk is only enabled if a second (on the external PCI bus)
|
|
|
+ * VT6212L is found -- the CX700 core itself also contains a USB
|
|
|
+ * host controller with the same PCI ID as the VT6212L.
|
|
|
*/
|
|
|
|
|
|
+ /* Count VT6212L instances */
|
|
|
+ struct pci_dev *p = pci_get_device(PCI_VENDOR_ID_VIA,
|
|
|
+ PCI_DEVICE_ID_VIA_8235_USB_2, NULL);
|
|
|
uint8_t b;
|
|
|
+
|
|
|
+ /* p should contain the first (internal) VT6212L -- see if we have
|
|
|
+ an external one by searching again */
|
|
|
+ p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235_USB_2, p);
|
|
|
+ if (!p)
|
|
|
+ return;
|
|
|
+ pci_dev_put(p);
|
|
|
+
|
|
|
if (pci_read_config_byte(dev, 0x76, &b) == 0) {
|
|
|
if (b & 0x40) {
|
|
|
/* Turn off PCI Bus Parking */
|
|
@@ -2008,7 +2022,7 @@ static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching);
|
|
|
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching);
|
|
|
|
|
|
/*
|
|
|
* For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the
|