Merge commit 'v2.6.28-rc2' into x86/pci-ioapic-boot-irq-quirks
This commit is contained in:
@@ -24,6 +24,14 @@
|
||||
#include <linux/kallsyms.h>
|
||||
#include "pci.h"
|
||||
|
||||
int isa_dma_bridge_buggy;
|
||||
EXPORT_SYMBOL(isa_dma_bridge_buggy);
|
||||
int pci_pci_problems;
|
||||
EXPORT_SYMBOL(pci_pci_problems);
|
||||
int pcie_mch_quirk;
|
||||
EXPORT_SYMBOL(pcie_mch_quirk);
|
||||
|
||||
#ifdef CONFIG_PCI_QUIRKS
|
||||
/* The Mellanox Tavor device gives false positive parity errors
|
||||
* Mark this device with a broken_parity_status, to allow
|
||||
* PCI scanning code to "skip" this now blacklisted device.
|
||||
@@ -35,6 +43,20 @@ static void __devinit quirk_mellanox_tavor(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor);
|
||||
|
||||
/* Many VIA bridges seem to corrupt data for DAC. Disable it here */
|
||||
int forbid_dac __read_mostly;
|
||||
EXPORT_SYMBOL(forbid_dac);
|
||||
|
||||
static __devinit void via_no_dac(struct pci_dev *dev)
|
||||
{
|
||||
if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) {
|
||||
dev_info(&dev->dev,
|
||||
"VIA PCI bridge detected. Disabling DAC.\n");
|
||||
forbid_dac = 1;
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac);
|
||||
|
||||
/* Deal with broken BIOS'es that neglect to enable passive release,
|
||||
which can cause problems in combination with the 82441FX/PPro MTRRs */
|
||||
static void quirk_passive_release(struct pci_dev *dev)
|
||||
@@ -62,8 +84,6 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_p
|
||||
|
||||
This appears to be BIOS not version dependent. So presumably there is a
|
||||
chipset level fix */
|
||||
int isa_dma_bridge_buggy;
|
||||
EXPORT_SYMBOL(isa_dma_bridge_buggy);
|
||||
|
||||
static void __devinit quirk_isa_dma_hangs(struct pci_dev *dev)
|
||||
{
|
||||
@@ -84,9 +104,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_1, quirk_isa_d
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_2, quirk_isa_dma_hangs);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_3, quirk_isa_dma_hangs);
|
||||
|
||||
int pci_pci_problems;
|
||||
EXPORT_SYMBOL(pci_pci_problems);
|
||||
|
||||
/*
|
||||
* Chipsets where PCI->PCI transfers vanish or hang
|
||||
*/
|
||||
@@ -902,6 +919,19 @@ static void __init quirk_ide_samemode(struct pci_dev *pdev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, quirk_ide_samemode);
|
||||
|
||||
/*
|
||||
* Some ATA devices break if put into D3
|
||||
*/
|
||||
|
||||
static void __devinit quirk_no_ata_d3(struct pci_dev *pdev)
|
||||
{
|
||||
/* Quirk the legacy ATA devices only. The AHCI ones are ok */
|
||||
if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
|
||||
pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_ANY_ID, quirk_no_ata_d3);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, PCI_ANY_ID, quirk_no_ata_d3);
|
||||
|
||||
/* This was originally an Alpha specific thing, but it really fits here.
|
||||
* The i82375 PCI/EISA bridge appears as non-classified. Fix that.
|
||||
*/
|
||||
@@ -1328,9 +1358,6 @@ static void __init quirk_alder_ioapic(struct pci_dev *pdev)
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic);
|
||||
#endif
|
||||
|
||||
int pcie_mch_quirk;
|
||||
EXPORT_SYMBOL(pcie_mch_quirk);
|
||||
|
||||
static void __devinit quirk_pcie_mch(struct pci_dev *pdev)
|
||||
{
|
||||
pcie_mch_quirk = 1;
|
||||
@@ -1670,85 +1697,6 @@ static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
|
||||
|
||||
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end)
|
||||
{
|
||||
while (f < end) {
|
||||
if ((f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
|
||||
(f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
|
||||
#ifdef DEBUG
|
||||
dev_dbg(&dev->dev, "calling ");
|
||||
print_fn_descriptor_symbol("%s\n", f->hook);
|
||||
#endif
|
||||
f->hook(dev);
|
||||
}
|
||||
f++;
|
||||
}
|
||||
}
|
||||
|
||||
extern struct pci_fixup __start_pci_fixups_early[];
|
||||
extern struct pci_fixup __end_pci_fixups_early[];
|
||||
extern struct pci_fixup __start_pci_fixups_header[];
|
||||
extern struct pci_fixup __end_pci_fixups_header[];
|
||||
extern struct pci_fixup __start_pci_fixups_final[];
|
||||
extern struct pci_fixup __end_pci_fixups_final[];
|
||||
extern struct pci_fixup __start_pci_fixups_enable[];
|
||||
extern struct pci_fixup __end_pci_fixups_enable[];
|
||||
extern struct pci_fixup __start_pci_fixups_resume[];
|
||||
extern struct pci_fixup __end_pci_fixups_resume[];
|
||||
extern struct pci_fixup __start_pci_fixups_resume_early[];
|
||||
extern struct pci_fixup __end_pci_fixups_resume_early[];
|
||||
extern struct pci_fixup __start_pci_fixups_suspend[];
|
||||
extern struct pci_fixup __end_pci_fixups_suspend[];
|
||||
|
||||
|
||||
void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
|
||||
{
|
||||
struct pci_fixup *start, *end;
|
||||
|
||||
switch(pass) {
|
||||
case pci_fixup_early:
|
||||
start = __start_pci_fixups_early;
|
||||
end = __end_pci_fixups_early;
|
||||
break;
|
||||
|
||||
case pci_fixup_header:
|
||||
start = __start_pci_fixups_header;
|
||||
end = __end_pci_fixups_header;
|
||||
break;
|
||||
|
||||
case pci_fixup_final:
|
||||
start = __start_pci_fixups_final;
|
||||
end = __end_pci_fixups_final;
|
||||
break;
|
||||
|
||||
case pci_fixup_enable:
|
||||
start = __start_pci_fixups_enable;
|
||||
end = __end_pci_fixups_enable;
|
||||
break;
|
||||
|
||||
case pci_fixup_resume:
|
||||
start = __start_pci_fixups_resume;
|
||||
end = __end_pci_fixups_resume;
|
||||
break;
|
||||
|
||||
case pci_fixup_resume_early:
|
||||
start = __start_pci_fixups_resume_early;
|
||||
end = __end_pci_fixups_resume_early;
|
||||
break;
|
||||
|
||||
case pci_fixup_suspend:
|
||||
start = __start_pci_fixups_suspend;
|
||||
end = __end_pci_fixups_suspend;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* stupid compiler warning, you would think with an enum... */
|
||||
return;
|
||||
}
|
||||
pci_do_fixups(dev, start, end);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_fixup_device);
|
||||
|
||||
/* Enable 1k I/O space granularity on the Intel P64H2 */
|
||||
static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev)
|
||||
{
|
||||
@@ -1871,9 +1819,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_c
|
||||
*/
|
||||
static void __devinit quirk_brcm_570x_limit_vpd(struct pci_dev *dev)
|
||||
{
|
||||
/* Only disable the VPD capability for 5706, 5708, and 5709 rev. A */
|
||||
/*
|
||||
* Only disable the VPD capability for 5706, 5706S, 5708,
|
||||
* 5708S and 5709 rev. A
|
||||
*/
|
||||
if ((dev->device == PCI_DEVICE_ID_NX2_5706) ||
|
||||
(dev->device == PCI_DEVICE_ID_NX2_5706S) ||
|
||||
(dev->device == PCI_DEVICE_ID_NX2_5708) ||
|
||||
(dev->device == PCI_DEVICE_ID_NX2_5708S) ||
|
||||
((dev->device == PCI_DEVICE_ID_NX2_5709) &&
|
||||
(dev->revision & 0xf0) == 0x0)) {
|
||||
if (dev->vpd)
|
||||
@@ -2117,3 +2070,82 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x4375,
|
||||
quirk_msi_intx_disable_bug);
|
||||
|
||||
#endif /* CONFIG_PCI_MSI */
|
||||
|
||||
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end)
|
||||
{
|
||||
while (f < end) {
|
||||
if ((f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
|
||||
(f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
|
||||
dev_dbg(&dev->dev, "calling %pF\n", f->hook);
|
||||
f->hook(dev);
|
||||
}
|
||||
f++;
|
||||
}
|
||||
}
|
||||
|
||||
extern struct pci_fixup __start_pci_fixups_early[];
|
||||
extern struct pci_fixup __end_pci_fixups_early[];
|
||||
extern struct pci_fixup __start_pci_fixups_header[];
|
||||
extern struct pci_fixup __end_pci_fixups_header[];
|
||||
extern struct pci_fixup __start_pci_fixups_final[];
|
||||
extern struct pci_fixup __end_pci_fixups_final[];
|
||||
extern struct pci_fixup __start_pci_fixups_enable[];
|
||||
extern struct pci_fixup __end_pci_fixups_enable[];
|
||||
extern struct pci_fixup __start_pci_fixups_resume[];
|
||||
extern struct pci_fixup __end_pci_fixups_resume[];
|
||||
extern struct pci_fixup __start_pci_fixups_resume_early[];
|
||||
extern struct pci_fixup __end_pci_fixups_resume_early[];
|
||||
extern struct pci_fixup __start_pci_fixups_suspend[];
|
||||
extern struct pci_fixup __end_pci_fixups_suspend[];
|
||||
|
||||
|
||||
void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
|
||||
{
|
||||
struct pci_fixup *start, *end;
|
||||
|
||||
switch(pass) {
|
||||
case pci_fixup_early:
|
||||
start = __start_pci_fixups_early;
|
||||
end = __end_pci_fixups_early;
|
||||
break;
|
||||
|
||||
case pci_fixup_header:
|
||||
start = __start_pci_fixups_header;
|
||||
end = __end_pci_fixups_header;
|
||||
break;
|
||||
|
||||
case pci_fixup_final:
|
||||
start = __start_pci_fixups_final;
|
||||
end = __end_pci_fixups_final;
|
||||
break;
|
||||
|
||||
case pci_fixup_enable:
|
||||
start = __start_pci_fixups_enable;
|
||||
end = __end_pci_fixups_enable;
|
||||
break;
|
||||
|
||||
case pci_fixup_resume:
|
||||
start = __start_pci_fixups_resume;
|
||||
end = __end_pci_fixups_resume;
|
||||
break;
|
||||
|
||||
case pci_fixup_resume_early:
|
||||
start = __start_pci_fixups_resume_early;
|
||||
end = __end_pci_fixups_resume_early;
|
||||
break;
|
||||
|
||||
case pci_fixup_suspend:
|
||||
start = __start_pci_fixups_suspend;
|
||||
end = __end_pci_fixups_suspend;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* stupid compiler warning, you would think with an enum... */
|
||||
return;
|
||||
}
|
||||
pci_do_fixups(dev, start, end);
|
||||
}
|
||||
#else
|
||||
void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) {}
|
||||
#endif
|
||||
EXPORT_SYMBOL(pci_fixup_device);
|
||||
|
Reference in New Issue
Block a user