aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorSatoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>2006-09-12 13:19:00 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-09-26 20:43:54 -0400
commitd5cdb67236dba94496de052c9f9f431e1fc658f4 (patch)
tree7aad7540e86bfd339766c02aba2536c138bd8649 /drivers/pci
parent0dad3510ee82bcf8a380b81a2184a664a911ef9c (diff)
acpiphp: disable bridges
Currently acpiphp calls pci_enable_device() against all hot-added bridges, but acpiphp does not call pci_disable_device() against them in hot-remove. So ioapic hot-remove would fail. This patch fixes this issue. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: MUNEDA Takahiro <muneda.takahiro@jp.fujitsu.com> Signed-off-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com> Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/hotplug/acpiphp_glue.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index d36732cd4bad..712f02fb1cbb 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -1105,6 +1105,16 @@ static int enable_device(struct acpiphp_slot *slot)
1105 return retval; 1105 return retval;
1106} 1106}
1107 1107
1108static void disable_bridges(struct pci_bus *bus)
1109{
1110 struct pci_dev *dev;
1111 list_for_each_entry(dev, &bus->devices, bus_list) {
1112 if (dev->subordinate) {
1113 disable_bridges(dev->subordinate);
1114 pci_disable_device(dev);
1115 }
1116 }
1117}
1108 1118
1109/** 1119/**
1110 * disable_device - disable a slot 1120 * disable_device - disable a slot
@@ -1129,8 +1139,13 @@ static int disable_device(struct acpiphp_slot *slot)
1129 func->bridge = NULL; 1139 func->bridge = NULL;
1130 } 1140 }
1131 1141
1132 if (func->pci_dev) 1142 if (func->pci_dev) {
1133 pci_stop_bus_device(func->pci_dev); 1143 pci_stop_bus_device(func->pci_dev);
1144 if (func->pci_dev->subordinate) {
1145 disable_bridges(func->pci_dev->subordinate);
1146 pci_disable_device(func->pci_dev);
1147 }
1148 }
1134 1149
1135 acpiphp_bus_trim(func->handle); 1150 acpiphp_bus_trim(func->handle);
1136 /* try to remove anyway. 1151 /* try to remove anyway.