diff options
Diffstat (limited to 'target/linux/generic')
2 files changed, 88 insertions, 0 deletions
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 index 0000000000..20785dda14 --- /dev/null +++ b/target/linux/generic/patches-3.9/031-PCI-Remove-__weak-annotation-from-pcibios_get_phb_of.patch @@ -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 index 0000000000..cd43c27f40 --- /dev/null +++ b/target/linux/generic/patches-3.9/032-MIPS-PCI-Implement-pcibios_get_phb_of_node.patch @@ -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); |