Loading drivers/pci/hotplug/acpiphp_glue.c +33 −10 Original line number Diff line number Diff line Loading @@ -878,6 +878,24 @@ static void disable_bridges(struct pci_bus *bus) } } /* return first device in slot, acquiring a reference on it */ static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot) { struct pci_bus *bus = slot->bridge->pci_bus; struct pci_dev *dev; struct pci_dev *ret = NULL; down_read(&pci_bus_sem); list_for_each_entry(dev, &bus->devices, bus_list) if (PCI_SLOT(dev->devfn) == slot->device) { ret = pci_dev_get(dev); break; } up_read(&pci_bus_sem); return ret; } /** * disable_device - disable a slot * @slot: ACPI PHP slot Loading @@ -893,6 +911,7 @@ static int disable_device(struct acpiphp_slot *slot) pdev = pci_get_slot(bus, PCI_DEVFN(slot->device, 0)); if (!pdev) goto err_exit; pci_dev_put(pdev); list_for_each_entry(func, &slot->funcs, sibling) { if (func->bridge) { Loading @@ -901,10 +920,15 @@ static int disable_device(struct acpiphp_slot *slot) (u32)1, NULL, NULL); func->bridge = NULL; } } pdev = pci_get_slot(slot->bridge->pci_bus, PCI_DEVFN(slot->device, func->function)); if (pdev) { /* * enable_device() enumerates all functions in this device via * pci_scan_slot(), whether they have associated ACPI hotplug * methods (_EJ0, etc.) or not. Therefore, we remove all functions * here. */ while ((pdev = dev_in_slot(slot))) { pci_stop_bus_device(pdev); if (pdev->subordinate) { disable_bridges(pdev->subordinate); Loading @@ -913,7 +937,6 @@ static int disable_device(struct acpiphp_slot *slot) __pci_remove_bus_device(pdev); pci_dev_put(pdev); } } list_for_each_entry(func, &slot->funcs, sibling) { acpiphp_bus_trim(func->handle); Loading drivers/pci/search.c +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ #include "pci.h" DECLARE_RWSEM(pci_bus_sem); EXPORT_SYMBOL_GPL(pci_bus_sem); /* * find the upstream PCIe-to-PCI bridge of a PCI device * if the device is PCIE, return NULL Loading Loading
drivers/pci/hotplug/acpiphp_glue.c +33 −10 Original line number Diff line number Diff line Loading @@ -878,6 +878,24 @@ static void disable_bridges(struct pci_bus *bus) } } /* return first device in slot, acquiring a reference on it */ static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot) { struct pci_bus *bus = slot->bridge->pci_bus; struct pci_dev *dev; struct pci_dev *ret = NULL; down_read(&pci_bus_sem); list_for_each_entry(dev, &bus->devices, bus_list) if (PCI_SLOT(dev->devfn) == slot->device) { ret = pci_dev_get(dev); break; } up_read(&pci_bus_sem); return ret; } /** * disable_device - disable a slot * @slot: ACPI PHP slot Loading @@ -893,6 +911,7 @@ static int disable_device(struct acpiphp_slot *slot) pdev = pci_get_slot(bus, PCI_DEVFN(slot->device, 0)); if (!pdev) goto err_exit; pci_dev_put(pdev); list_for_each_entry(func, &slot->funcs, sibling) { if (func->bridge) { Loading @@ -901,10 +920,15 @@ static int disable_device(struct acpiphp_slot *slot) (u32)1, NULL, NULL); func->bridge = NULL; } } pdev = pci_get_slot(slot->bridge->pci_bus, PCI_DEVFN(slot->device, func->function)); if (pdev) { /* * enable_device() enumerates all functions in this device via * pci_scan_slot(), whether they have associated ACPI hotplug * methods (_EJ0, etc.) or not. Therefore, we remove all functions * here. */ while ((pdev = dev_in_slot(slot))) { pci_stop_bus_device(pdev); if (pdev->subordinate) { disable_bridges(pdev->subordinate); Loading @@ -913,7 +937,6 @@ static int disable_device(struct acpiphp_slot *slot) __pci_remove_bus_device(pdev); pci_dev_put(pdev); } } list_for_each_entry(func, &slot->funcs, sibling) { acpiphp_bus_trim(func->handle); Loading
drivers/pci/search.c +2 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ #include "pci.h" DECLARE_RWSEM(pci_bus_sem); EXPORT_SYMBOL_GPL(pci_bus_sem); /* * find the upstream PCIe-to-PCI bridge of a PCI device * if the device is PCIE, return NULL Loading