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 245d2cdb4765..1812ae7698de 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -2595,9 +2595,37 @@ void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) | |||
2595 | static int __init pci_apply_final_quirks(void) | 2595 | static int __init pci_apply_final_quirks(void) |
2596 | { | 2596 | { |
2597 | struct pci_dev *dev = NULL; | 2597 | struct pci_dev *dev = NULL; |
2598 | u8 cls = 0; | ||
2599 | u8 tmp; | ||
2600 | |||
2601 | if (pci_cache_line_size) | ||
2602 | printk(KERN_DEBUG "PCI: CLS %u bytes\n", | ||
2603 | pci_cache_line_size << 2); | ||
2598 | 2604 | ||
2599 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 2605 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
2600 | pci_fixup_device(pci_fixup_final, dev); | 2606 | pci_fixup_device(pci_fixup_final, dev); |
2607 | /* | ||
2608 | * If arch hasn't set it explicitly yet, use the CLS | ||
2609 | * value shared by all PCI devices. If there's a | ||
2610 | * mismatch, fall back to the default value. | ||
2611 | */ | ||
2612 | if (!pci_cache_line_size) { | ||
2613 | pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &tmp); | ||
2614 | if (!cls) | ||
2615 | cls = tmp; | ||
2616 | if (!tmp || cls == tmp) | ||
2617 | continue; | ||
2618 | |||
2619 | printk(KERN_DEBUG "PCI: CLS mismatch (%u != %u), " | ||
2620 | "using %u bytes\n", cls << 2, tmp << 2, | ||
2621 | pci_dfl_cache_line_size << 2); | ||
2622 | pci_cache_line_size = pci_dfl_cache_line_size; | ||
2623 | } | ||
2624 | } | ||
2625 | if (!pci_cache_line_size) { | ||
2626 | printk(KERN_DEBUG "PCI: CLS %u bytes, default %u\n", | ||
2627 | cls << 2, pci_dfl_cache_line_size << 2); | ||
2628 | pci_cache_line_size = cls; | ||
2601 | } | 2629 | } |
2602 | 2630 | ||
2603 | return 0; | 2631 | return 0; |