PCI: add pci_scan_root_bus() that accepts resource list
"Early" and "header" quirks often use incorrect bus resources because they see the default resources assigned by pci_create_bus(), before the architecture fixes them up (typically in pcibios_fixup_bus()). Regions reserved by these quirks end up with the wrong parents. Here's the standard path for scanning a PCI root bus: pci_scan_bus or pci_scan_bus_parented pci_create_bus <-- A create with default resources pci_scan_child_bus pci_scan_slot pci_scan_single_device pci_scan_device pci_setup_device pci_fixup_device(early) <-- B pci_device_add pci_fixup_device(header) <-- C pcibios_fixup_bus <-- D fill in correct resources Early and header quirks at B and C use the default (incorrect) root bus resources rather than those filled in at D. This patch adds a new pci_scan_root_bus() function that sets the bus resources correctly from a supplied list of resources. I intend to remove pci_scan_bus() and pci_scan_bus_parented() after fixing all callers. Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
166c637075
commit
a2ebb82795
|
@ -1608,6 +1608,21 @@ err_out:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
|
||||||
|
struct pci_ops *ops, void *sysdata, struct list_head *resources)
|
||||||
|
{
|
||||||
|
struct pci_bus *b;
|
||||||
|
|
||||||
|
b = pci_create_root_bus(parent, bus, ops, sysdata, resources);
|
||||||
|
if (!b)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
b->subordinate = pci_scan_child_bus(b);
|
||||||
|
pci_bus_add_devices(b);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(pci_scan_root_bus);
|
||||||
|
|
||||||
struct pci_bus *pci_create_bus(struct device *parent,
|
struct pci_bus *pci_create_bus(struct device *parent,
|
||||||
int bus, struct pci_ops *ops, void *sysdata)
|
int bus, struct pci_ops *ops, void *sysdata)
|
||||||
{
|
{
|
||||||
|
|
|
@ -673,6 +673,9 @@ static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *o
|
||||||
struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
|
struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
|
||||||
struct pci_ops *ops, void *sysdata,
|
struct pci_ops *ops, void *sysdata,
|
||||||
struct list_head *resources);
|
struct list_head *resources);
|
||||||
|
struct pci_bus * __devinit pci_scan_root_bus(struct device *parent, int bus,
|
||||||
|
struct pci_ops *ops, void *sysdata,
|
||||||
|
struct list_head *resources);
|
||||||
struct pci_bus *pci_create_bus(struct device *parent, int bus,
|
struct pci_bus *pci_create_bus(struct device *parent, int bus,
|
||||||
struct pci_ops *ops, void *sysdata);
|
struct pci_ops *ops, void *sysdata);
|
||||||
struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
|
struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
|
||||||
|
|
Loading…
Reference in New Issue