diff options
Diffstat (limited to 'drivers/pci/hotplug')
-rw-r--r-- | drivers/pci/hotplug/Kconfig | 12 | ||||
-rw-r--r-- | drivers/pci/hotplug/acpiphp_core.c | 3 | ||||
-rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 2 | ||||
-rw-r--r-- | drivers/pci/hotplug/cpci_hotplug_pci.c | 54 | ||||
-rw-r--r-- | drivers/pci/hotplug/pciehp.h | 5 | ||||
-rw-r--r-- | drivers/pci/hotplug/pciehp_hpc.c | 4 |
6 files changed, 51 insertions, 29 deletions
diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index 222a1cc4aa28..8a60f391ffcf 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig | |||
@@ -6,8 +6,7 @@ menu "PCI Hotplug Support" | |||
6 | 6 | ||
7 | config HOTPLUG_PCI | 7 | config HOTPLUG_PCI |
8 | tristate "Support for PCI Hotplug (EXPERIMENTAL)" | 8 | tristate "Support for PCI Hotplug (EXPERIMENTAL)" |
9 | depends on PCI && EXPERIMENTAL | 9 | depends on PCI && EXPERIMENTAL && HOTPLUG |
10 | select HOTPLUG | ||
11 | ---help--- | 10 | ---help--- |
12 | Say Y here if you have a motherboard with a PCI Hotplug controller. | 11 | Say Y here if you have a motherboard with a PCI Hotplug controller. |
13 | This allows you to add and remove PCI cards while the machine is | 12 | This allows you to add and remove PCI cards while the machine is |
@@ -77,7 +76,7 @@ config HOTPLUG_PCI_IBM | |||
77 | 76 | ||
78 | config HOTPLUG_PCI_ACPI | 77 | config HOTPLUG_PCI_ACPI |
79 | tristate "ACPI PCI Hotplug driver" | 78 | tristate "ACPI PCI Hotplug driver" |
80 | depends on ACPI && HOTPLUG_PCI | 79 | depends on (!ACPI_DOCK && ACPI && HOTPLUG_PCI) || (ACPI_DOCK && HOTPLUG_PCI) |
81 | help | 80 | help |
82 | Say Y here if you have a system that supports PCI Hotplug using | 81 | Say Y here if you have a system that supports PCI Hotplug using |
83 | ACPI. | 82 | ACPI. |
@@ -154,13 +153,6 @@ config HOTPLUG_PCI_SHPC_POLL_EVENT_MODE | |||
154 | 153 | ||
155 | When in doubt, say N. | 154 | When in doubt, say N. |
156 | 155 | ||
157 | config HOTPLUG_PCI_SHPC_PHPRM_LEGACY | ||
158 | bool "For AMD SHPC only: Use $HRT for resource/configuration" | ||
159 | depends on HOTPLUG_PCI_SHPC && !ACPI | ||
160 | help | ||
161 | Say Y here for AMD SHPC. You have to select this option if you are | ||
162 | using this driver on platform with AMD SHPC. | ||
163 | |||
164 | config HOTPLUG_PCI_RPA | 156 | config HOTPLUG_PCI_RPA |
165 | tristate "RPA PCI Hotplug driver" | 157 | tristate "RPA PCI Hotplug driver" |
166 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE | 158 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE |
diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index 34de5697983d..e2fef60c2d06 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c | |||
@@ -27,8 +27,7 @@ | |||
27 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | * | 29 | * |
30 | * Send feedback to <gregkh@us.ibm.com>, | 30 | * Send feedback to <kristen.c.accardi@intel.com> |
31 | * <t-kochi@bq.jp.nec.com> | ||
32 | * | 31 | * |
33 | */ | 32 | */ |
34 | 33 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index ef95d12fb32c..ae67a8f55ba1 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -26,7 +26,7 @@ | |||
26 | * along with this program; if not, write to the Free Software | 26 | * along with this program; if not, write to the Free Software |
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | * | 28 | * |
29 | * Send feedback to <t-kochi@bq.jp.nec.com> | 29 | * Send feedback to <kristen.c.accardi@intel.com> |
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c index 02be74caa89f..4afcaffd031c 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c | |||
@@ -254,8 +254,8 @@ int cpci_led_off(struct slot* slot) | |||
254 | 254 | ||
255 | int cpci_configure_slot(struct slot* slot) | 255 | int cpci_configure_slot(struct slot* slot) |
256 | { | 256 | { |
257 | unsigned char busnr; | 257 | struct pci_bus *parent; |
258 | struct pci_bus *child; | 258 | int fn; |
259 | 259 | ||
260 | dbg("%s - enter", __FUNCTION__); | 260 | dbg("%s - enter", __FUNCTION__); |
261 | 261 | ||
@@ -276,23 +276,53 @@ int cpci_configure_slot(struct slot* slot) | |||
276 | */ | 276 | */ |
277 | n = pci_scan_slot(slot->bus, slot->devfn); | 277 | n = pci_scan_slot(slot->bus, slot->devfn); |
278 | dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); | 278 | dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); |
279 | if (n > 0) | ||
280 | pci_bus_add_devices(slot->bus); | ||
281 | slot->dev = pci_get_slot(slot->bus, slot->devfn); | 279 | slot->dev = pci_get_slot(slot->bus, slot->devfn); |
282 | if (slot->dev == NULL) { | 280 | if (slot->dev == NULL) { |
283 | err("Could not find PCI device for slot %02x", slot->number); | 281 | err("Could not find PCI device for slot %02x", slot->number); |
284 | return 1; | 282 | return -ENODEV; |
285 | } | 283 | } |
286 | } | 284 | } |
287 | 285 | parent = slot->dev->bus; | |
288 | if (slot->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 286 | |
289 | pci_read_config_byte(slot->dev, PCI_SECONDARY_BUS, &busnr); | 287 | for (fn = 0; fn < 8; fn++) { |
290 | child = pci_add_new_bus(slot->dev->bus, slot->dev, busnr); | 288 | struct pci_dev *dev; |
291 | pci_do_scan_bus(child); | 289 | |
292 | pci_bus_size_bridges(child); | 290 | dev = pci_get_slot(parent, PCI_DEVFN(PCI_SLOT(slot->devfn), fn)); |
291 | if (!dev) | ||
292 | continue; | ||
293 | if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) || | ||
294 | (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) { | ||
295 | /* Find an unused bus number for the new bridge */ | ||
296 | struct pci_bus *child; | ||
297 | unsigned char busnr, start = parent->secondary; | ||
298 | unsigned char end = parent->subordinate; | ||
299 | |||
300 | for (busnr = start; busnr <= end; busnr++) { | ||
301 | if (!pci_find_bus(pci_domain_nr(parent), | ||
302 | busnr)) | ||
303 | break; | ||
304 | } | ||
305 | if (busnr >= end) { | ||
306 | err("No free bus for hot-added bridge\n"); | ||
307 | pci_dev_put(dev); | ||
308 | continue; | ||
309 | } | ||
310 | child = pci_add_new_bus(parent, dev, busnr); | ||
311 | if (!child) { | ||
312 | err("Cannot add new bus for %s\n", | ||
313 | pci_name(dev)); | ||
314 | pci_dev_put(dev); | ||
315 | continue; | ||
316 | } | ||
317 | child->subordinate = pci_do_scan_bus(child); | ||
318 | pci_bus_size_bridges(child); | ||
319 | } | ||
320 | pci_dev_put(dev); | ||
293 | } | 321 | } |
294 | 322 | ||
295 | pci_bus_assign_resources(slot->dev->bus); | 323 | pci_bus_assign_resources(parent); |
324 | pci_bus_add_devices(parent); | ||
325 | pci_enable_bridges(parent); | ||
296 | 326 | ||
297 | dbg("%s - exit", __FUNCTION__); | 327 | dbg("%s - exit", __FUNCTION__); |
298 | return 0; | 328 | return 0; |
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index ce89f5815861..eaea9d36a1bb 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
@@ -279,6 +279,11 @@ struct hpc_ops { | |||
279 | 279 | ||
280 | 280 | ||
281 | #ifdef CONFIG_ACPI | 281 | #ifdef CONFIG_ACPI |
282 | #include <acpi/acpi.h> | ||
283 | #include <acpi/acpi_bus.h> | ||
284 | #include <acpi/actypes.h> | ||
285 | #include <linux/pci-acpi.h> | ||
286 | |||
282 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ | 287 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ |
283 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) | 288 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) |
284 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, | 289 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 0d8fb6e607a1..6ab3b6cd2b54 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -38,10 +38,6 @@ | |||
38 | 38 | ||
39 | #include "../pci.h" | 39 | #include "../pci.h" |
40 | #include "pciehp.h" | 40 | #include "pciehp.h" |
41 | #include <acpi/acpi.h> | ||
42 | #include <acpi/acpi_bus.h> | ||
43 | #include <acpi/actypes.h> | ||
44 | #include <linux/pci-acpi.h> | ||
45 | #ifdef DEBUG | 41 | #ifdef DEBUG |
46 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ | 42 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ |
47 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ | 43 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ |