954c0b7cd5
there was a change in 2.6.17 which affected the order in which the PCI access methods are probed. this gives regressions on some machines with broken BIOS. the problem is that PCBIOS sometimes reports last bus wrong, leaving cardbus non-funcational. previously those system worked fine with direct access. The patch changes the PCI init code to have PCBIOS as last fallback, yet the PCBIOS code still has to run first to set pcibios_last_bus to the value reported by the BIOS. this is needed in case legacy PCI probing (arch/i386/pci/legacy.c) is used to detect peer busses. using direct access if available fixes the cardbus problems. Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch> Cc: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
29 lines
670 B
C
29 lines
670 B
C
#include <linux/pci.h>
|
|
#include <linux/init.h>
|
|
#include "pci.h"
|
|
|
|
/* arch_initcall has too random ordering, so call the initializers
|
|
in the right sequence from here. */
|
|
static __init int pci_access_init(void)
|
|
{
|
|
#ifdef CONFIG_PCI_MMCONFIG
|
|
pci_mmcfg_init();
|
|
#endif
|
|
if (raw_pci_ops)
|
|
return 0;
|
|
#ifdef CONFIG_PCI_BIOS
|
|
pci_pcbios_init();
|
|
#endif
|
|
/*
|
|
* don't check for raw_pci_ops here because we want pcbios as last
|
|
* fallback, yet it's needed to run first to set pcibios_last_bus
|
|
* in case legacy PCI probing is used. otherwise detecting peer busses
|
|
* fails.
|
|
*/
|
|
#ifdef CONFIG_PCI_DIRECT
|
|
pci_direct_init();
|
|
#endif
|
|
return 0;
|
|
}
|
|
arch_initcall(pci_access_init);
|