41 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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)
 |