diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 53ee09a592b1..ce35a8f956fe 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1611,6 +1611,34 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | |||
1611 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | 1611 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, |
1612 | quirk_nvidia_ck804_pcie_aer_ext_cap); | 1612 | quirk_nvidia_ck804_pcie_aer_ext_cap); |
1613 | 1613 | ||
1614 | static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev) | ||
1615 | { | ||
1616 | /* | ||
1617 | * Disable PCI Bus Parking and PCI Master read caching on CX700 | ||
1618 | * which causes unspecified timing errors with a VT6212L on the PCI | ||
1619 | * bus leading to USB2.0 packet loss. The defaults are that these | ||
1620 | * features are turned off but some BIOSes turn them on. | ||
1621 | */ | ||
1622 | |||
1623 | uint8_t b; | ||
1624 | if (pci_read_config_byte(dev, 0x76, &b) == 0) { | ||
1625 | if (b & 0x40) { | ||
1626 | /* Turn off PCI Bus Parking */ | ||
1627 | pci_write_config_byte(dev, 0x76, b ^ 0x40); | ||
1628 | |||
1629 | /* Turn off PCI Master read caching */ | ||
1630 | pci_write_config_byte(dev, 0x72, 0x0); | ||
1631 | pci_write_config_byte(dev, 0x75, 0x1); | ||
1632 | pci_write_config_byte(dev, 0x77, 0x0); | ||
1633 | |||
1634 | printk(KERN_INFO | ||
1635 | "PCI: VIA CX700 PCI parking/caching fixup on %s\n", | ||
1636 | pci_name(dev)); | ||
1637 | } | ||
1638 | } | ||
1639 | } | ||
1640 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching); | ||
1641 | |||
1614 | #ifdef CONFIG_PCI_MSI | 1642 | #ifdef CONFIG_PCI_MSI |
1615 | /* Some chipsets do not support MSI. We cannot easily rely on setting | 1643 | /* Some chipsets do not support MSI. We cannot easily rely on setting |
1616 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually | 1644 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually |