diff options
Diffstat (limited to 'arch/powerpc/kernel/pci_of_scan.c')
| -rw-r--r-- | arch/powerpc/kernel/pci_of_scan.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c index 4368ec6fdc8..44562aa97f1 100644 --- a/arch/powerpc/kernel/pci_of_scan.c +++ b/arch/powerpc/kernel/pci_of_scan.c @@ -111,7 +111,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)  		res->name = pci_name(dev);  		region.start = base;  		region.end = base + size - 1; -		pcibios_bus_to_resource(dev, res, ®ion); +		pcibios_bus_to_resource(dev->bus, res, ®ion);  	}  } @@ -280,7 +280,7 @@ void of_scan_pci_bridge(struct pci_dev *dev)  		res->flags = flags;  		region.start = of_read_number(&ranges[1], 2);  		region.end = region.start + size - 1; -		pcibios_bus_to_resource(dev, res, ®ion); +		pcibios_bus_to_resource(dev->bus, res, ®ion);  	}  	sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),  		bus->number); @@ -302,8 +302,11 @@ static struct pci_dev *of_scan_pci_dev(struct pci_bus *bus,  			    struct device_node *dn)  {  	struct pci_dev *dev = NULL; -	const u32 *reg; +	const __be32 *reg;  	int reglen, devfn; +#ifdef CONFIG_EEH +	struct eeh_dev *edev = of_node_to_eeh_dev(dn); +#endif  	pr_debug("  * %s\n", dn->full_name);  	if (!of_device_is_available(dn)) @@ -312,7 +315,7 @@ static struct pci_dev *of_scan_pci_dev(struct pci_bus *bus,  	reg = of_get_property(dn, "reg", ®len);  	if (reg == NULL || reglen < 20)  		return NULL; -	devfn = (reg[0] >> 8) & 0xff; +	devfn = (of_read_number(reg, 1) >> 8) & 0xff;  	/* Check if the PCI device is already there */  	dev = pci_get_slot(bus, devfn); @@ -321,6 +324,12 @@ static struct pci_dev *of_scan_pci_dev(struct pci_bus *bus,  		return dev;  	} +	/* Device removed permanently ? */ +#ifdef CONFIG_EEH +	if (edev && (edev->mode & EEH_DEV_REMOVED)) +		return NULL; +#endif +  	/* create a new pci_dev for this device */  	dev = of_create_pci_dev(dn, bus, devfn);  	if (!dev) @@ -362,8 +371,7 @@ static void __of_scan_bus(struct device_node *node, struct pci_bus *bus,  	/* Now scan child busses */  	list_for_each_entry(dev, &bus->devices, bus_list) { -		if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || -		    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { +		if (pci_is_bridge(dev)) {  			of_scan_pci_bridge(dev);  		}  	}  | 
