diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d378478612fb..4364d793f73b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -24,6 +24,17 @@ | |||
| 24 | #include <linux/acpi.h> | 24 | #include <linux/acpi.h> |
| 25 | #include "pci.h" | 25 | #include "pci.h" |
| 26 | 26 | ||
| 27 | /* The Mellanox Tavor device gives false positive parity errors | ||
| 28 | * Mark this device with a broken_parity_status, to allow | ||
| 29 | * PCI scanning code to "skip" this now blacklisted device. | ||
| 30 | */ | ||
| 31 | static void __devinit quirk_mellanox_tavor(struct pci_dev *dev) | ||
| 32 | { | ||
| 33 | dev->broken_parity_status = 1; /* This device gives false positives */ | ||
| 34 | } | ||
| 35 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor); | ||
| 36 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor); | ||
| 37 | |||
| 27 | /* Deal with broken BIOS'es that neglect to enable passive release, | 38 | /* Deal with broken BIOS'es that neglect to enable passive release, |
| 28 | which can cause problems in combination with the 82441FX/PPro MTRRs */ | 39 | which can cause problems in combination with the 82441FX/PPro MTRRs */ |
| 29 | static void __devinit quirk_passive_release(struct pci_dev *dev) | 40 | static void __devinit quirk_passive_release(struct pci_dev *dev) |
| @@ -878,27 +889,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_e | |||
| 878 | * when a PCI-Soundcard is added. The BIOS only gives Options | 889 | * when a PCI-Soundcard is added. The BIOS only gives Options |
| 879 | * "Disabled" and "AUTO". This Quirk Sets the corresponding | 890 | * "Disabled" and "AUTO". This Quirk Sets the corresponding |
| 880 | * Register-Value to enable the Soundcard. | 891 | * Register-Value to enable the Soundcard. |
| 892 | * | ||
| 893 | * FIXME: Presently this quirk will run on anything that has an 8237 | ||
| 894 | * which isn't correct, we need to check DMI tables or something in | ||
| 895 | * order to make sure it only runs on the MSI-K8T-Neo2Fir. Because it | ||
| 896 | * runs everywhere at present we suppress the printk output in most | ||
| 897 | * irrelevant cases. | ||
| 881 | */ | 898 | */ |
| 882 | static void __init k8t_sound_hostbridge(struct pci_dev *dev) | 899 | static void __init k8t_sound_hostbridge(struct pci_dev *dev) |
| 883 | { | 900 | { |
| 884 | unsigned char val; | 901 | unsigned char val; |
| 885 | 902 | ||
| 886 | printk(KERN_INFO "PCI: Quirk-MSI-K8T Soundcard On\n"); | ||
| 887 | pci_read_config_byte(dev, 0x50, &val); | 903 | pci_read_config_byte(dev, 0x50, &val); |
| 888 | if (val == 0x88 || val == 0xc8) { | 904 | if (val == 0x88 || val == 0xc8) { |
| 905 | /* Assume it's probably a MSI-K8T-Neo2Fir */ | ||
| 906 | printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, attempting to turn soundcard ON\n"); | ||
| 889 | pci_write_config_byte(dev, 0x50, val & (~0x40)); | 907 | pci_write_config_byte(dev, 0x50, val & (~0x40)); |
| 890 | 908 | ||
| 891 | /* Verify the Change for Status output */ | 909 | /* Verify the Change for Status output */ |
| 892 | pci_read_config_byte(dev, 0x50, &val); | 910 | pci_read_config_byte(dev, 0x50, &val); |
| 893 | if (val & 0x40) | 911 | if (val & 0x40) |
| 894 | printk(KERN_INFO "PCI: MSI-K8T soundcard still off\n"); | 912 | printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, soundcard still off\n"); |
| 895 | else | 913 | else |
| 896 | printk(KERN_INFO "PCI: MSI-K8T soundcard on\n"); | 914 | printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, soundcard on\n"); |
| 897 | } else { | ||
| 898 | printk(KERN_INFO "PCI: Unexpected Value in PCI-Register: " | ||
| 899 | "no Change!\n"); | ||
| 900 | } | 915 | } |
| 901 | |||
| 902 | } | 916 | } |
| 903 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_hostbridge); | 917 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_hostbridge); |
| 904 | 918 | ||
| @@ -1485,6 +1499,25 @@ static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev) | |||
| 1485 | } | 1499 | } |
| 1486 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io); | 1500 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io); |
| 1487 | 1501 | ||
| 1502 | /* Under some circumstances, AER is not linked with extended capabilities. | ||
| 1503 | * Force it to be linked by setting the corresponding control bit in the | ||
| 1504 | * config space. | ||
| 1505 | */ | ||
| 1506 | static void __devinit quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev) | ||
| 1507 | { | ||
| 1508 | uint8_t b; | ||
| 1509 | if (pci_read_config_byte(dev, 0xf41, &b) == 0) { | ||
| 1510 | if (!(b & 0x20)) { | ||
| 1511 | pci_write_config_byte(dev, 0xf41, b | 0x20); | ||
| 1512 | printk(KERN_INFO | ||
| 1513 | "PCI: Linking AER extended capability on %s\n", | ||
| 1514 | pci_name(dev)); | ||
| 1515 | } | ||
| 1516 | } | ||
| 1517 | } | ||
| 1518 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | ||
| 1519 | quirk_nvidia_ck804_pcie_aer_ext_cap); | ||
| 1520 | |||
| 1488 | EXPORT_SYMBOL(pcie_mch_quirk); | 1521 | EXPORT_SYMBOL(pcie_mch_quirk); |
| 1489 | #ifdef CONFIG_HOTPLUG | 1522 | #ifdef CONFIG_HOTPLUG |
| 1490 | EXPORT_SYMBOL(pci_fixup_device); | 1523 | EXPORT_SYMBOL(pci_fixup_device); |
