diff options
| -rw-r--r-- | drivers/pci/quirks.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e5aadf357ae7..dca58b9ba8c6 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -2836,6 +2836,75 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, | |||
| 2836 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, | 2836 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, |
| 2837 | PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); | 2837 | PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); |
| 2838 | 2838 | ||
| 2839 | /* Intel 5000 and 5100 Memory controllers have an errata with read completion | ||
| 2840 | * coalescing (which is enabled by default on some BIOSes) and MPS of 256B. | ||
| 2841 | * Since there is no way of knowing what the PCIE MPS on each fabric will be | ||
| 2842 | * until all of the devices are discovered and buses walked, read completion | ||
| 2843 | * coalescing must be disabled. Unfortunately, it cannot be re-enabled because | ||
| 2844 | * it is possible to hotplug a device with MPS of 256B. | ||
| 2845 | */ | ||
| 2846 | static void __devinit quirk_intel_mc_errata(struct pci_dev *dev) | ||
| 2847 | { | ||
| 2848 | int err; | ||
| 2849 | u16 rcc; | ||
| 2850 | |||
| 2851 | if (pcie_bus_config == PCIE_BUS_TUNE_OFF) | ||
| 2852 | return; | ||
| 2853 | |||
| 2854 | /* Intel errata specifies bits to change but does not say what they are. | ||
| 2855 | * Keeping them magical until such time as the registers and values can | ||
| 2856 | * be explained. | ||
| 2857 | */ | ||
| 2858 | err = pci_read_config_word(dev, 0x48, &rcc); | ||
| 2859 | if (err) { | ||
| 2860 | dev_err(&dev->dev, "Error attempting to read the read " | ||
| 2861 | "completion coalescing register.\n"); | ||
| 2862 | return; | ||
| 2863 | } | ||
| 2864 | |||
| 2865 | if (!(rcc & (1 << 10))) | ||
| 2866 | return; | ||
| 2867 | |||
| 2868 | rcc &= ~(1 << 10); | ||
| 2869 | |||
| 2870 | err = pci_write_config_word(dev, 0x48, rcc); | ||
| 2871 | if (err) { | ||
| 2872 | dev_err(&dev->dev, "Error attempting to write the read " | ||
| 2873 | "completion coalescing register.\n"); | ||
| 2874 | return; | ||
| 2875 | } | ||
| 2876 | |||
| 2877 | pr_info_once("Read completion coalescing disabled due to hardware " | ||
| 2878 | "errata relating to 256B MPS.\n"); | ||
| 2879 | } | ||
| 2880 | /* Intel 5000 series memory controllers and ports 2-7 */ | ||
| 2881 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25c0, quirk_intel_mc_errata); | ||
| 2882 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d0, quirk_intel_mc_errata); | ||
| 2883 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d4, quirk_intel_mc_errata); | ||
| 2884 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25d8, quirk_intel_mc_errata); | ||
| 2885 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_mc_errata); | ||
| 2886 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_mc_errata); | ||
| 2887 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_mc_errata); | ||
| 2888 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_mc_errata); | ||
| 2889 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_mc_errata); | ||
| 2890 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_mc_errata); | ||
| 2891 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_mc_errata); | ||
| 2892 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_mc_errata); | ||
| 2893 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_mc_errata); | ||
| 2894 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_mc_errata); | ||
| 2895 | /* Intel 5100 series memory controllers and ports 2-7 */ | ||
| 2896 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65c0, quirk_intel_mc_errata); | ||
| 2897 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e2, quirk_intel_mc_errata); | ||
| 2898 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e3, quirk_intel_mc_errata); | ||
| 2899 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e4, quirk_intel_mc_errata); | ||
| 2900 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e5, quirk_intel_mc_errata); | ||
| 2901 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e6, quirk_intel_mc_errata); | ||
| 2902 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65e7, quirk_intel_mc_errata); | ||
| 2903 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f7, quirk_intel_mc_errata); | ||
| 2904 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f8, quirk_intel_mc_errata); | ||
| 2905 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata); | ||
| 2906 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata); | ||
| 2907 | |||
| 2839 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, | 2908 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, |
| 2840 | struct pci_fixup *end) | 2909 | struct pci_fixup *end) |
| 2841 | { | 2910 | { |
