2013-03-04 11:48:08 +00:00
|
|
|
From 4da85831c8eaf2de2cadae6723e8231068c313b7 Mon Sep 17 00:00:00 2001
|
2013-02-21 17:47:15 +00:00
|
|
|
From: Gabor Juhos <juhosg@openwrt.org>
|
2013-03-04 11:48:08 +00:00
|
|
|
Date: Sat, 2 Feb 2013 13:18:54 +0000
|
|
|
|
Subject: [PATCH] MIPS: avoid possible resource conflict in
|
|
|
|
register_pci_controller
|
|
|
|
|
|
|
|
commit 222831787704c9ad9215f6b56f975b233968607c upstream.
|
|
|
|
|
|
|
|
The IO and memory resources of a PCI controller
|
|
|
|
might already have a parent resource set when
|
|
|
|
they are passed to 'register_pci_controller'.
|
|
|
|
|
|
|
|
If the parent resource is set, the request_resource
|
|
|
|
call will fail due to resource conflict and the
|
|
|
|
current code will not be able to register the
|
|
|
|
PCI controller.
|
|
|
|
|
|
|
|
Use the parent resource if it is available in the
|
|
|
|
request_resource call to avoid the isssue.
|
2013-02-21 17:47:15 +00:00
|
|
|
|
|
|
|
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
2013-03-04 11:48:08 +00:00
|
|
|
Patchwork: http://patchwork.linux-mips.org/patch/4910/
|
|
|
|
Signed-off-by: John Crispin <blogic@openwrt.org>
|
2013-02-21 17:47:15 +00:00
|
|
|
---
|
|
|
|
arch/mips/pci/pci.c | 15 +++++++++++++--
|
2013-03-04 11:48:08 +00:00
|
|
|
1 file changed, 13 insertions(+), 2 deletions(-)
|
2013-02-21 17:47:15 +00:00
|
|
|
|
|
|
|
--- a/arch/mips/pci/pci.c
|
|
|
|
+++ b/arch/mips/pci/pci.c
|
2013-04-14 09:25:53 +00:00
|
|
|
@@ -181,9 +181,20 @@ static DEFINE_MUTEX(pci_scan_mutex);
|
2013-02-21 17:47:15 +00:00
|
|
|
|
|
|
|
void register_pci_controller(struct pci_controller *hose)
|
|
|
|
{
|
|
|
|
- if (request_resource(&iomem_resource, hose->mem_resource) < 0)
|
|
|
|
+ struct resource *parent;
|
|
|
|
+
|
|
|
|
+ parent = hose->mem_resource->parent;
|
|
|
|
+ if (!parent)
|
|
|
|
+ parent = &iomem_resource;
|
|
|
|
+
|
|
|
|
+ if (request_resource(parent, hose->mem_resource) < 0)
|
|
|
|
goto out;
|
|
|
|
- if (request_resource(&ioport_resource, hose->io_resource) < 0) {
|
|
|
|
+
|
|
|
|
+ parent = hose->io_resource->parent;
|
|
|
|
+ if (!parent)
|
|
|
|
+ parent = &ioport_resource;
|
|
|
|
+
|
|
|
|
+ if (request_resource(parent, hose->io_resource) < 0) {
|
|
|
|
release_resource(hose->mem_resource);
|
|
|
|
goto out;
|
|
|
|
}
|