linux/3.9: implement pcibios_get_phb_of_node for MIPS
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 30 Apr 2013 10:44:08 +0000 (10:44 +0000)
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 30 Apr 2013 10:44:08 +0000 (10:44 +0000)
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36495 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic/patches-3.9/031-PCI-Remove-__weak-annotation-from-pcibios_get_phb_of.patch [new file with mode: 0644]
target/linux/generic/patches-3.9/032-MIPS-PCI-Implement-pcibios_get_phb_of_node.patch [new file with mode: 0644]

diff --git a/target/linux/generic/patches-3.9/031-PCI-Remove-__weak-annotation-from-pcibios_get_phb_of.patch b/target/linux/generic/patches-3.9/031-PCI-Remove-__weak-annotation-from-pcibios_get_phb_of.patch
new file mode 100644 (file)
index 0000000..20785dd
--- /dev/null
@@ -0,0 +1,40 @@
+From 10629d711ed780470937ecda50d9ffa0e925a4ee Mon Sep 17 00:00:00 2001
+From: Bjorn Helgaas <bhelgaas@google.com>
+Date: Wed, 10 Apr 2013 09:56:54 -0600
+Subject: [PATCH 1/2] PCI: Remove __weak annotation from
+ pcibios_get_phb_of_node decl
+
+The __weak annotation on the pcibios_get_phb_of_node() declaration
+causes *every* definition to be marked "weak."  The linker then
+selects one based on link order, which may be the wrong one.
+
+Gabor found that on MIPS, the linker selected the generic implementation
+from drivers/pci even though arch/mips supplied a definition without the
+__weak annotation:
+
+$ mipsel-openwrt-linux-readelf -s arch/mips/pci/built-in.o \
+    drivers/pci/built-in.o vmlinux.o | grep pcibios_get_phb_of_node
+      86: 0000046c    12 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node
+    1430: 00012e2c   104 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node
+   31898: 0017e4ec   104 FUNC    WEAK   DEFAULT    2 pcibios_get_phb_of_node
+
+This removes the __weak annotation from the pcibios_get_phb_of_node()
+declaration so arch-specific non-weak implementations work reliably.
+
+Suggested-by: Gabor Juhos <juhosg@openwrt.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+---
+ include/linux/pci.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -1824,7 +1824,7 @@ extern void pci_set_bus_of_node(struct p
+ extern void pci_release_bus_of_node(struct pci_bus *bus);
+ /* Arch may override this (weak) */
+-extern struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus);
++extern struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus);
+ static inline struct device_node *
+ pci_device_to_OF_node(const struct pci_dev *pdev)
diff --git a/target/linux/generic/patches-3.9/032-MIPS-PCI-Implement-pcibios_get_phb_of_node.patch b/target/linux/generic/patches-3.9/032-MIPS-PCI-Implement-pcibios_get_phb_of_node.patch
new file mode 100644 (file)
index 0000000..cd43c27
--- /dev/null
@@ -0,0 +1,48 @@
+From 9a97cd43f4ef62520a852b5a2348233b0f37455b Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Thu, 4 Apr 2013 20:01:23 +0200
+Subject: [PATCH 2/2] MIPS/PCI: Implement pcibios_get_phb_of_node
+
+The of_node field of the device assigned to a
+PCI bus is used during scanning of the PCI bus.
+However on MIPS, the of_node field is assigned
+only after the bus has been scanned.
+
+Implement the architecture specific version of
+'pcibios_get_phb_of_node'. Which ensures that the
+PCI driver core will initialize the of_node field
+before starting the scan.
+
+Also remove the local assignment of bus->dev.of_node,
+it is not needed after the patch.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+---
+ arch/mips/pci/pci.c |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/arch/mips/pci/pci.c
++++ b/arch/mips/pci/pci.c
+@@ -115,7 +115,6 @@ static void pcibios_scanbus(struct pci_c
+                       pci_bus_assign_resources(bus);
+                       pci_enable_bridges(bus);
+               }
+-              bus->dev.of_node = hose->of_node;
+       }
+ }
+@@ -169,6 +168,13 @@ void pci_load_of_ranges(struct pci_contr
+               }
+       }
+ }
++
++struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus)
++{
++      struct pci_controller *hose = bus->sysdata;
++
++      return of_node_get(hose->of_node);
++}
+ #endif
+ static DEFINE_MUTEX(pci_scan_mutex);