diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-28 17:20:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-28 17:20:44 -0400 |
commit | 0e59e7e7feb5a12938fbf9135147eeda3238c6c4 (patch) | |
tree | dbe994369ca9cad6893f0fd710f75791bc84b816 /drivers/pci/quirks.c | |
parent | 46b51ea2099fa2082342e52b8284aa828429b80b (diff) | |
parent | a513a99a7cebfb452839cc09c9c0586f72d96414 (diff) |
Merge branch 'next-rebase' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci
* 'next-rebase' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci:
PCI: Clean-up MPS debug output
pci: Clamp pcie_set_readrq() when using "performance" settings
PCI: enable MPS "performance" setting to properly handle bridge MPS
PCI: Workaround for Intel MPS errata
PCI: Add support for PASID capability
PCI: Add implementation for PRI capability
PCI: Export ATS functions to modules
PCI: Move ATS implementation into own file
PCI / PM: Remove unnecessary error variable from acpi_dev_run_wake()
PCI hotplug: acpiphp: Prevent deadlock on PCI-to-PCI bridge remove
PCI / PM: Extend PME polling to all PCI devices
PCI quirk: mmc: Always check for lower base frequency quirk for Ricoh 1180:e823
PCI: Make pci_setup_bridge() non-static for use by arch code
x86: constify PCI raw ops structures
PCI: Add quirk for known incorrect MPSS
PCI: Add Solarflare vendor ID and SFC4000 device IDs
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 111 |
1 files changed, 97 insertions, 14 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index b23856aaf6eb..7285145ac1c9 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -2745,20 +2745,6 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) | |||
2745 | /* disable must be done via function #0 */ | 2745 | /* disable must be done via function #0 */ |
2746 | if (PCI_FUNC(dev->devfn)) | 2746 | if (PCI_FUNC(dev->devfn)) |
2747 | return; | 2747 | return; |
2748 | |||
2749 | pci_read_config_byte(dev, 0xCB, &disable); | ||
2750 | |||
2751 | if (disable & 0x02) | ||
2752 | return; | ||
2753 | |||
2754 | pci_read_config_byte(dev, 0xCA, &write_enable); | ||
2755 | pci_write_config_byte(dev, 0xCA, 0x57); | ||
2756 | pci_write_config_byte(dev, 0xCB, disable | 0x02); | ||
2757 | pci_write_config_byte(dev, 0xCA, write_enable); | ||
2758 | |||
2759 | dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n"); | ||
2760 | dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); | ||
2761 | |||
2762 | /* | 2748 | /* |
2763 | * RICOH 0xe823 SD/MMC card reader fails to recognize | 2749 | * RICOH 0xe823 SD/MMC card reader fails to recognize |
2764 | * certain types of SD/MMC cards. Lowering the SD base | 2750 | * certain types of SD/MMC cards. Lowering the SD base |
@@ -2781,6 +2767,20 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) | |||
2781 | 2767 | ||
2782 | dev_notice(&dev->dev, "MMC controller base frequency changed to 50Mhz.\n"); | 2768 | dev_notice(&dev->dev, "MMC controller base frequency changed to 50Mhz.\n"); |
2783 | } | 2769 | } |
2770 | |||
2771 | pci_read_config_byte(dev, 0xCB, &disable); | ||
2772 | |||
2773 | if (disable & 0x02) | ||
2774 | return; | ||
2775 | |||
2776 | pci_read_config_byte(dev, 0xCA, &write_enable); | ||
2777 | pci_write_config_byte(dev, 0xCA, 0x57); | ||
2778 | pci_write_config_byte(dev, 0xCB, disable | 0x02); | ||
2779 | pci_write_config_byte(dev, 0xCA, write_enable); | ||
2780 | |||
2781 | dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n"); | ||
2782 | dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); | ||
2783 | |||
2784 | } | 2784 | } |
2785 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | 2785 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
2786 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); | 2786 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
@@ -2822,6 +2822,89 @@ static void __devinit fixup_ti816x_class(struct pci_dev* dev) | |||
2822 | } | 2822 | } |
2823 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_TI, 0xb800, fixup_ti816x_class); | 2823 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_TI, 0xb800, fixup_ti816x_class); |
2824 | 2824 | ||
2825 | /* Some PCIe devices do not work reliably with the claimed maximum | ||
2826 | * payload size supported. | ||
2827 | */ | ||
2828 | static void __devinit fixup_mpss_256(struct pci_dev *dev) | ||
2829 | { | ||
2830 | dev->pcie_mpss = 1; /* 256 bytes */ | ||
2831 | } | ||
2832 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, | ||
2833 | PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256); | ||
2834 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, | ||
2835 | PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256); | ||
2836 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, | ||
2837 | PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); | ||
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 | |||
2825 | 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, |
2826 | struct pci_fixup *end) | 2909 | struct pci_fixup *end) |
2827 | { | 2910 | { |