mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
PCI: Add pci_stop_and_remove_root_bus()
It supports both PCI root bus and PCI bus under PCI bridge. Signed-off-by: Yinghai Lu <yinghai@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
62a08c5a31
commit
cdfcc572be
@ -111,3 +111,39 @@ void pci_stop_and_remove_bus_device(struct pci_dev *dev)
|
|||||||
pci_remove_bus_device(dev);
|
pci_remove_bus_device(dev);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_stop_and_remove_bus_device);
|
EXPORT_SYMBOL(pci_stop_and_remove_bus_device);
|
||||||
|
|
||||||
|
void pci_stop_root_bus(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
struct pci_dev *child, *tmp;
|
||||||
|
struct pci_host_bridge *host_bridge;
|
||||||
|
|
||||||
|
if (!pci_is_root_bus(bus))
|
||||||
|
return;
|
||||||
|
|
||||||
|
host_bridge = to_pci_host_bridge(bus->bridge);
|
||||||
|
list_for_each_entry_safe_reverse(child, tmp,
|
||||||
|
&bus->devices, bus_list)
|
||||||
|
pci_stop_bus_device(child);
|
||||||
|
|
||||||
|
/* stop the host bridge */
|
||||||
|
device_del(&host_bridge->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pci_remove_root_bus(struct pci_bus *bus)
|
||||||
|
{
|
||||||
|
struct pci_dev *child, *tmp;
|
||||||
|
struct pci_host_bridge *host_bridge;
|
||||||
|
|
||||||
|
if (!pci_is_root_bus(bus))
|
||||||
|
return;
|
||||||
|
|
||||||
|
host_bridge = to_pci_host_bridge(bus->bridge);
|
||||||
|
list_for_each_entry_safe(child, tmp,
|
||||||
|
&bus->devices, bus_list)
|
||||||
|
pci_remove_bus_device(child);
|
||||||
|
pci_remove_bus(bus);
|
||||||
|
host_bridge->bus = NULL;
|
||||||
|
|
||||||
|
/* remove the host bridge */
|
||||||
|
put_device(&host_bridge->dev);
|
||||||
|
}
|
||||||
|
@ -712,6 +712,8 @@ extern struct pci_dev *pci_dev_get(struct pci_dev *dev);
|
|||||||
extern void pci_dev_put(struct pci_dev *dev);
|
extern void pci_dev_put(struct pci_dev *dev);
|
||||||
extern void pci_remove_bus(struct pci_bus *b);
|
extern void pci_remove_bus(struct pci_bus *b);
|
||||||
extern void pci_stop_and_remove_bus_device(struct pci_dev *dev);
|
extern void pci_stop_and_remove_bus_device(struct pci_dev *dev);
|
||||||
|
void pci_stop_root_bus(struct pci_bus *bus);
|
||||||
|
void pci_remove_root_bus(struct pci_bus *bus);
|
||||||
void pci_setup_cardbus(struct pci_bus *bus);
|
void pci_setup_cardbus(struct pci_bus *bus);
|
||||||
extern void pci_sort_breadthfirst(void);
|
extern void pci_sort_breadthfirst(void);
|
||||||
#define dev_is_pci(d) ((d)->bus == &pci_bus_type)
|
#define dev_is_pci(d) ((d)->bus == &pci_bus_type)
|
||||||
|
Loading…
Reference in New Issue
Block a user