diff options
| author | John Keller <jpk@sgi.com> | 2006-10-04 17:49:35 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-12-01 17:36:58 -0500 |
| commit | 9f581f162e2b304be25dee49bf3945d4ed65dfb6 (patch) | |
| tree | a8096fdb89db187a01a2dacc4783a50728058e46 | |
| parent | 8ea6091f500162e97687d7acf925f84202066b8d (diff) | |
Altix: SN ACPI hotplug support.
A few minor changes to the way slot/device fixup is done.
No need to be calling sn_pci_controller_fixup(), as
a root bus cannot be hotplugged.
Signed-off-by: John Keller <jpk@sgi.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/pci/hotplug/sgi_hotplug.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index b62ad31a9739..5d188c558386 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
| @@ -205,21 +205,6 @@ static struct hotplug_slot * sn_hp_destroy(void) | |||
| 205 | return bss_hotplug_slot; | 205 | return bss_hotplug_slot; |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | static void sn_bus_alloc_data(struct pci_dev *dev) | ||
| 209 | { | ||
| 210 | struct pci_bus *subordinate_bus; | ||
| 211 | struct pci_dev *child; | ||
| 212 | |||
| 213 | sn_pci_fixup_slot(dev); | ||
| 214 | |||
| 215 | /* Recursively sets up the sn_irq_info structs */ | ||
| 216 | if (dev->subordinate) { | ||
| 217 | subordinate_bus = dev->subordinate; | ||
| 218 | list_for_each_entry(child, &subordinate_bus->devices, bus_list) | ||
| 219 | sn_bus_alloc_data(child); | ||
| 220 | } | ||
| 221 | } | ||
| 222 | |||
| 223 | static void sn_bus_free_data(struct pci_dev *dev) | 208 | static void sn_bus_free_data(struct pci_dev *dev) |
| 224 | { | 209 | { |
| 225 | struct pci_bus *subordinate_bus; | 210 | struct pci_bus *subordinate_bus; |
| @@ -337,6 +322,11 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, | |||
| 337 | return rc; | 322 | return rc; |
| 338 | } | 323 | } |
| 339 | 324 | ||
| 325 | /* | ||
| 326 | * Power up and configure the slot via a SAL call to PROM. | ||
| 327 | * Scan slot (and any children), do any platform specific fixup, | ||
| 328 | * and find device driver. | ||
| 329 | */ | ||
| 340 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | 330 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) |
| 341 | { | 331 | { |
| 342 | struct slot *slot = bss_hotplug_slot->private; | 332 | struct slot *slot = bss_hotplug_slot->private; |
| @@ -345,6 +335,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 345 | int func, num_funcs; | 335 | int func, num_funcs; |
| 346 | int new_ppb = 0; | 336 | int new_ppb = 0; |
| 347 | int rc; | 337 | int rc; |
| 338 | void pcibios_fixup_device_resources(struct pci_dev *); | ||
| 348 | 339 | ||
| 349 | /* Serialize the Linux PCI infrastructure */ | 340 | /* Serialize the Linux PCI infrastructure */ |
| 350 | mutex_lock(&sn_hotplug_mutex); | 341 | mutex_lock(&sn_hotplug_mutex); |
| @@ -367,9 +358,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 367 | return -ENODEV; | 358 | return -ENODEV; |
| 368 | } | 359 | } |
| 369 | 360 | ||
| 370 | sn_pci_controller_fixup(pci_domain_nr(slot->pci_bus), | ||
| 371 | slot->pci_bus->number, | ||
| 372 | slot->pci_bus); | ||
| 373 | /* | 361 | /* |
| 374 | * Map SN resources for all functions on the card | 362 | * Map SN resources for all functions on the card |
| 375 | * to the Linux PCI interface and tell the drivers | 363 | * to the Linux PCI interface and tell the drivers |
| @@ -380,6 +368,13 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 380 | PCI_DEVFN(slot->device_num + 1, | 368 | PCI_DEVFN(slot->device_num + 1, |
| 381 | PCI_FUNC(func))); | 369 | PCI_FUNC(func))); |
| 382 | if (dev) { | 370 | if (dev) { |
| 371 | /* Need to do slot fixup on PPB before fixup of children | ||
| 372 | * (PPB's pcidev_info needs to be in pcidev_info list | ||
| 373 | * before child's SN_PCIDEV_INFO() call to setup | ||
| 374 | * pdi_host_pcidev_info). | ||
| 375 | */ | ||
| 376 | pcibios_fixup_device_resources(dev); | ||
| 377 | sn_pci_fixup_slot(dev); | ||
| 383 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 378 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { |
| 384 | unsigned char sec_bus; | 379 | unsigned char sec_bus; |
| 385 | pci_read_config_byte(dev, PCI_SECONDARY_BUS, | 380 | pci_read_config_byte(dev, PCI_SECONDARY_BUS, |
| @@ -387,12 +382,8 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 387 | new_bus = pci_add_new_bus(dev->bus, dev, | 382 | new_bus = pci_add_new_bus(dev->bus, dev, |
| 388 | sec_bus); | 383 | sec_bus); |
| 389 | pci_scan_child_bus(new_bus); | 384 | pci_scan_child_bus(new_bus); |
| 390 | sn_pci_controller_fixup(pci_domain_nr(new_bus), | ||
| 391 | new_bus->number, | ||
| 392 | new_bus); | ||
| 393 | new_ppb = 1; | 385 | new_ppb = 1; |
| 394 | } | 386 | } |
| 395 | sn_bus_alloc_data(dev); | ||
| 396 | pci_dev_put(dev); | 387 | pci_dev_put(dev); |
| 397 | } | 388 | } |
| 398 | } | 389 | } |
