diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6099facecd79..a790b1771f9f 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -670,6 +670,25 @@ static void __devinit quirk_vt8235_acpi(struct pci_dev *dev) | |||
| 670 | } | 670 | } |
| 671 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); | 671 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi); |
| 672 | 672 | ||
| 673 | /* | ||
| 674 | * TI XIO2000a PCIe-PCI Bridge erroneously reports it supports fast back-to-back: | ||
| 675 | * Disable fast back-to-back on the secondary bus segment | ||
| 676 | */ | ||
| 677 | static void __devinit quirk_xio2000a(struct pci_dev *dev) | ||
| 678 | { | ||
| 679 | struct pci_dev *pdev; | ||
| 680 | u16 command; | ||
| 681 | |||
| 682 | dev_warn(&dev->dev, "TI XIO2000a quirk detected; " | ||
| 683 | "secondary bus fast back-to-back transfers disabled\n"); | ||
| 684 | list_for_each_entry(pdev, &dev->subordinate->devices, bus_list) { | ||
| 685 | pci_read_config_word(pdev, PCI_COMMAND, &command); | ||
| 686 | if (command & PCI_COMMAND_FAST_BACK) | ||
| 687 | pci_write_config_word(pdev, PCI_COMMAND, command & ~PCI_COMMAND_FAST_BACK); | ||
| 688 | } | ||
| 689 | } | ||
| 690 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2000A, | ||
| 691 | quirk_xio2000a); | ||
| 673 | 692 | ||
| 674 | #ifdef CONFIG_X86_IO_APIC | 693 | #ifdef CONFIG_X86_IO_APIC |
| 675 | 694 | ||
| @@ -2572,6 +2591,19 @@ void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) | |||
| 2572 | } | 2591 | } |
| 2573 | pci_do_fixups(dev, start, end); | 2592 | pci_do_fixups(dev, start, end); |
| 2574 | } | 2593 | } |
| 2594 | |||
| 2595 | static int __init pci_apply_final_quirks(void) | ||
| 2596 | { | ||
| 2597 | struct pci_dev *dev = NULL; | ||
| 2598 | |||
| 2599 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | ||
| 2600 | pci_fixup_device(pci_fixup_final, dev); | ||
| 2601 | } | ||
| 2602 | |||
| 2603 | return 0; | ||
| 2604 | } | ||
| 2605 | |||
| 2606 | fs_initcall_sync(pci_apply_final_quirks); | ||
| 2575 | #else | 2607 | #else |
| 2576 | void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) {} | 2608 | void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) {} |
| 2577 | #endif | 2609 | #endif |
