From d8db721d03bc4ac1b731dfa572fbb416d229da4b Mon Sep 17 00:00:00 2001 From: Satoru Takeuchi Date: Tue, 12 Sep 2006 10:19:00 -0700 Subject: [PATCH] --- yaml --- r: 36081 b: refs/heads/master c: d5cdb67236dba94496de052c9f9f431e1fc658f4 h: refs/heads/master i: 36079: 8d3a41e192c98ae9149200684fb165fa2b548b61 v: v3 --- [refs] | 2 +- trunk/drivers/pci/hotplug/acpiphp_glue.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 98c212ab7a66..d509986d915f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0dad3510ee82bcf8a380b81a2184a664a911ef9c +refs/heads/master: d5cdb67236dba94496de052c9f9f431e1fc658f4 diff --git a/trunk/drivers/pci/hotplug/acpiphp_glue.c b/trunk/drivers/pci/hotplug/acpiphp_glue.c index d36732cd4bad..712f02fb1cbb 100644 --- a/trunk/drivers/pci/hotplug/acpiphp_glue.c +++ b/trunk/drivers/pci/hotplug/acpiphp_glue.c @@ -1105,6 +1105,16 @@ static int enable_device(struct acpiphp_slot *slot) return retval; } +static void disable_bridges(struct pci_bus *bus) +{ + struct pci_dev *dev; + list_for_each_entry(dev, &bus->devices, bus_list) { + if (dev->subordinate) { + disable_bridges(dev->subordinate); + pci_disable_device(dev); + } + } +} /** * disable_device - disable a slot @@ -1129,8 +1139,13 @@ static int disable_device(struct acpiphp_slot *slot) func->bridge = NULL; } - if (func->pci_dev) + if (func->pci_dev) { pci_stop_bus_device(func->pci_dev); + if (func->pci_dev->subordinate) { + disable_bridges(func->pci_dev->subordinate); + pci_disable_device(func->pci_dev); + } + } acpiphp_bus_trim(func->handle); /* try to remove anyway.