diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 173 | 
1 files changed, 87 insertions, 86 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e872ac925b4..bbf66ea8fd8 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -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. @@ -62,8 +70,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 +90,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   */ @@ -1362,9 +1365,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; @@ -1555,84 +1555,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 %pF\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)  { @@ -2006,3 +1928,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);  |