}
EXPORT_SYMBOL(pci_remove_bus);
-static void pci_stop_bus_device(struct pci_dev *dev);
-
/**
* pci_stop_and_remove_bus_device - remove a PCI device and any children
* @dev: the device to remove
* device lists, remove the /proc entry, and notify userspace
* (/sbin/hotplug).
*/
-static void __pci_remove_bus_device(struct pci_dev *dev)
-{
- struct pci_bus *bus = dev->subordinate;
- struct pci_dev *child, *tmp;
-
- if (bus) {
- list_for_each_entry_safe(child, tmp, &bus->devices, bus_list)
- __pci_remove_bus_device(child);
-
- pci_remove_bus(bus);
- dev->subordinate = NULL;
- }
-
- pci_destroy_dev(dev);
-}
-
void pci_stop_and_remove_bus_device(struct pci_dev *dev)
{
- pci_stop_bus_device(dev);
- __pci_remove_bus_device(dev);
-}
-
-/**
- * pci_stop_bus_device - stop a PCI device and any children
- * @dev: the device to stop
- *
- * Stop a PCI device (detach the driver, remove from the global list
- * and so on). This also stop any subordinate buses and children in a
- * depth-first manner.
- */
-static void pci_stop_bus_device(struct pci_dev *dev)
-{
struct pci_bus *bus = dev->subordinate;
struct pci_dev *child, *tmp;
* iterator. Therefore, iterate in reverse so we remove the VFs
* first, then the PF.
*/
- if (bus)
+ if (bus) {
list_for_each_entry_safe_reverse(child, tmp,
&bus->devices, bus_list)
- pci_stop_bus_device(child);
+ pci_stop_and_remove_bus_device(child);
+
+ pci_remove_bus(bus);
+ dev->subordinate = NULL;
+ }
pci_stop_dev(dev);
+ pci_destroy_dev(dev);
}
-
EXPORT_SYMBOL(pci_stop_and_remove_bus_device);