From a74ade2eee757ce60bccd452d761ab0e2cae2708 Mon Sep 17 00:00:00 2001 From: Tom Arbuckle Date: Wed, 11 Feb 2009 10:41:48 +0000 Subject: [PATCH] --- yaml --- r: 138472 b: refs/heads/master c: f81786913aa0ca27a3230f30d099e9613d0d7973 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/powerpc/kernel/pci_32.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0f04e1a8db06..4cec77019cdd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 16c57b3620d77e0bc981da5ef32beae730512684 +refs/heads/master: f81786913aa0ca27a3230f30d099e9613d0d7973 diff --git a/trunk/arch/powerpc/kernel/pci_32.c b/trunk/arch/powerpc/kernel/pci_32.c index c6368506455f..d473634e39e3 100644 --- a/trunk/arch/powerpc/kernel/pci_32.c +++ b/trunk/arch/powerpc/kernel/pci_32.c @@ -218,16 +218,23 @@ scan_OF_pci_childs(struct device_node *parent, pci_OF_scan_iterator filter, void static struct device_node *scan_OF_for_pci_dev(struct device_node *parent, unsigned int devfn) { - struct device_node *np; + struct device_node *np, *cnp; const u32 *reg; unsigned int psize; for_each_child_of_node(parent, np) { reg = of_get_property(np, "reg", &psize); - if (reg == NULL || psize < 4) - continue; - if (((reg[0] >> 8) & 0xff) == devfn) + if (reg && psize >= 4 && ((reg[0] >> 8) & 0xff) == devfn) return np; + + /* Note: some OFs create a parent node "multifunc-device" as + * a fake root for all functions of a multi-function device, + * we go down them as well. */ + if (!strcmp(np->name, "multifunc-device")) { + cnp = scan_OF_for_pci_dev(np, devfn); + if (cnp) + return cnp; + } } return NULL; }