diff options
| author | Yijing Wang <wangyijing@huawei.com> | 2015-03-15 23:18:56 -0400 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2015-03-19 11:17:13 -0400 |
| commit | b97ea289cf6aff8d4cbcefe2b707bb9b00a73c73 (patch) | |
| tree | efa328fedf08e394912322783660d27c33257610 /arch/xtensa/kernel | |
| parent | c90570d9511d42421c85709b46bffd366185d835 (diff) | |
PCI: Assign resources before drivers claim devices (pci_scan_root_bus())
Previously, pci_scan_root_bus() created a root PCI bus, enumerated the
devices on it, and called pci_bus_add_devices(), which made the devices
available for drivers to claim them.
Most callers assigned resources to devices after pci_scan_root_bus()
returns, which may be after drivers have claimed the devices. This is
incorrect; the PCI core should not change device resources while a driver
is managing the device.
Remove pci_bus_add_devices() from pci_scan_root_bus() and do it after any
resource assignment in the callers.
Note that ARM's pci_common_init_dev() already called pci_bus_add_devices()
after pci_scan_root_bus(), so we only need to remove the first call:
pci_common_init_dev
pcibios_init_hw
pci_scan_root_bus
pci_bus_add_devices # first call
pci_bus_assign_resources
pci_bus_add_devices # second call
[bhelgaas: changelog, drop "root_bus" var in alpha common_init_pci(),
return failure earlier in mn10300, add "return" in x86 pcibios_scan_root(),
return early if xtensa platform_pcibios_fixup() fails]
Signed-off-by: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: Richard Henderson <rth@twiddle.net>
CC: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
CC: Matt Turner <mattst88@gmail.com>
CC: David Howells <dhowells@redhat.com>
CC: Tony Luck <tony.luck@intel.com>
CC: Michal Simek <monstr@monstr.eu>
CC: Ralf Baechle <ralf@linux-mips.org>
CC: Koichi Yasutake <yasutake.koichi@jp.panasonic.com>
CC: Sebastian Ott <sebott@linux.vnet.ibm.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Chris Metcalf <cmetcalf@ezchip.com>
CC: Chris Zankel <chris@zankel.net>
CC: Max Filippov <jcmvbkbc@gmail.com>
CC: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/xtensa/kernel')
| -rw-r--r-- | arch/xtensa/kernel/pci.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/xtensa/kernel/pci.c b/arch/xtensa/kernel/pci.c index 5b3403388d7f..b848cc3dc913 100644 --- a/arch/xtensa/kernel/pci.c +++ b/arch/xtensa/kernel/pci.c | |||
| @@ -174,7 +174,7 @@ static int __init pcibios_init(void) | |||
| 174 | struct pci_controller *pci_ctrl; | 174 | struct pci_controller *pci_ctrl; |
| 175 | struct list_head resources; | 175 | struct list_head resources; |
| 176 | struct pci_bus *bus; | 176 | struct pci_bus *bus; |
| 177 | int next_busno = 0; | 177 | int next_busno = 0, ret; |
| 178 | 178 | ||
| 179 | printk("PCI: Probing PCI hardware\n"); | 179 | printk("PCI: Probing PCI hardware\n"); |
| 180 | 180 | ||
| @@ -185,14 +185,25 @@ static int __init pcibios_init(void) | |||
| 185 | pci_controller_apertures(pci_ctrl, &resources); | 185 | pci_controller_apertures(pci_ctrl, &resources); |
| 186 | bus = pci_scan_root_bus(NULL, pci_ctrl->first_busno, | 186 | bus = pci_scan_root_bus(NULL, pci_ctrl->first_busno, |
| 187 | pci_ctrl->ops, pci_ctrl, &resources); | 187 | pci_ctrl->ops, pci_ctrl, &resources); |
| 188 | if (!bus) | ||
| 189 | continue; | ||
| 190 | |||
| 188 | pci_ctrl->bus = bus; | 191 | pci_ctrl->bus = bus; |
| 189 | pci_ctrl->last_busno = bus->busn_res.end; | 192 | pci_ctrl->last_busno = bus->busn_res.end; |
| 190 | if (next_busno <= pci_ctrl->last_busno) | 193 | if (next_busno <= pci_ctrl->last_busno) |
| 191 | next_busno = pci_ctrl->last_busno+1; | 194 | next_busno = pci_ctrl->last_busno+1; |
| 192 | } | 195 | } |
| 193 | pci_bus_count = next_busno; | 196 | pci_bus_count = next_busno; |
| 197 | ret = platform_pcibios_fixup(); | ||
| 198 | if (ret) | ||
| 199 | return ret; | ||
| 194 | 200 | ||
| 195 | return platform_pcibios_fixup(); | 201 | for (pci_ctrl = pci_ctrl_head; pci_ctrl; pci_ctrl = pci_ctrl->next) { |
| 202 | if (pci_ctrl->bus) | ||
| 203 | pci_bus_add_devices(pci_ctrl->bus); | ||
| 204 | } | ||
| 205 | |||
| 206 | return 0; | ||
| 196 | } | 207 | } |
| 197 | 208 | ||
| 198 | subsys_initcall(pcibios_init); | 209 | subsys_initcall(pcibios_init); |
