Merge tag 'pci-v3.9-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / pci / hotplug / sgi_hotplug.c
index 574421bc2fa63bd4e407cafbe2ecd8ca1d22d780..b2781dfe60e9e3cbc79095de46b96f8421958275 100644 (file)
@@ -334,7 +334,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
        struct slot *slot = bss_hotplug_slot->private;
        struct pci_bus *new_bus = NULL;
        struct pci_dev *dev;
-       int func, num_funcs;
+       int num_funcs;
        int new_ppb = 0;
        int rc;
        char *ssdt = NULL;
@@ -381,29 +381,26 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
         * to the Linux PCI interface and tell the drivers
         * about them.
         */
-       for (func = 0; func < num_funcs;  func++) {
-               dev = pci_get_slot(slot->pci_bus,
-                                  PCI_DEVFN(slot->device_num + 1,
-                                            PCI_FUNC(func)));
-               if (dev) {
-                       /* Need to do slot fixup on PPB before fixup of children
-                        * (PPB's pcidev_info needs to be in pcidev_info list
-                        * before child's SN_PCIDEV_INFO() call to setup
-                        * pdi_host_pcidev_info).
-                        */
-                       pcibios_fixup_device_resources(dev);
-                       if (SN_ACPI_BASE_SUPPORT())
-                               sn_acpi_slot_fixup(dev);
-                       else
-                               sn_io_slot_fixup(dev);
-                       if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
-                               pci_hp_add_bridge(dev);
-                               if (dev->subordinate) {
-                                       new_bus = dev->subordinate;
-                                       new_ppb = 1;
-                               }
+       list_for_each_entry(dev, &slot->pci_bus->devices, bus_list) {
+               if (PCI_SLOT(dev->devfn) != slot->device_num + 1)
+                       continue;
+
+               /* Need to do slot fixup on PPB before fixup of children
+                * (PPB's pcidev_info needs to be in pcidev_info list
+                * before child's SN_PCIDEV_INFO() call to setup
+                * pdi_host_pcidev_info).
+                */
+               pcibios_fixup_device_resources(dev);
+               if (SN_ACPI_BASE_SUPPORT())
+                       sn_acpi_slot_fixup(dev);
+               else
+                       sn_io_slot_fixup(dev);
+               if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
+                       pci_hp_add_bridge(dev);
+                       if (dev->subordinate) {
+                               new_bus = dev->subordinate;
+                               new_ppb = 1;
                        }
-                       pci_dev_put(dev);
                }
        }
 
@@ -483,8 +480,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
 static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
 {
        struct slot *slot = bss_hotplug_slot->private;
-       struct pci_dev *dev;
-       int func;
+       struct pci_dev *dev, *temp;
        int rc;
        acpi_owner_id ssdt_id = 0;
 
@@ -545,15 +541,14 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
        }
 
        /* Free the SN resources assigned to the Linux device.*/
-       for (func = 0; func < 8;  func++) {
-               dev = pci_get_slot(slot->pci_bus,
-                                  PCI_DEVFN(slot->device_num + 1,
-                                            PCI_FUNC(func)));
-               if (dev) {
-                       sn_bus_free_data(dev);
-                       pci_stop_and_remove_bus_device(dev);
-                       pci_dev_put(dev);
-               }
+       list_for_each_entry_safe(dev, temp, &slot->pci_bus->devices, bus_list) {
+               if (PCI_SLOT(dev->devfn) != slot->device_num + 1)
+                       continue;
+
+               pci_dev_get(dev);
+               sn_bus_free_data(dev);
+               pci_stop_and_remove_bus_device(dev);
+               pci_dev_put(dev);
        }
 
        /* Remove the SSDT for the slot from the ACPI namespace */