diff options
| author | Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com> | 2006-09-12 13:19:00 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-26 20:43:54 -0400 |
| commit | d5cdb67236dba94496de052c9f9f431e1fc658f4 (patch) | |
| tree | 7aad7540e86bfd339766c02aba2536c138bd8649 | |
| parent | 0dad3510ee82bcf8a380b81a2184a664a911ef9c (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>
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 17 |
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 | ||
| 1108 | static 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. |
