Merge branch 'pci/bjorn-cleanup-remove' into next
* pci/bjorn-cleanup-remove: PCI: Remove unused pci_dev_b() sgi-agp: Use list_for_each_entry() for bus->devices traversal parisc/PCI: Use list_for_each_entry() for bus->devices traversal parisc/PCI: Enable PERR/SERR on all devices frv/PCI: Use list_for_each_entry() for bus->devices traversal PCI: Leave normal LIST_POISON in deleted list entries PCI: Rename local variables to conventional names PCI: Remove unused, commented-out, code PCI: Stop and remove devices in one pass PCI: Fold stop and remove helpers into their callers PCI: Use list_for_each_entry() for bus->devices traversal PCI: Remove pci_stop_and_remove_behind_bridge() PCI: Don't export stop_bus_device and remove_bus_device interfaces pcmcia: Use common pci_stop_and_remove_bus_device() PCI: acpiphp: Use common pci_stop_and_remove_bus_device() PCI: acpiphp: Stop disabling bridges on remove
This commit is contained in:
@@ -869,17 +869,6 @@ static int __ref enable_device(struct acpiphp_slot *slot)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void disable_bridges(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
if (dev->subordinate) {
|
||||
disable_bridges(dev->subordinate);
|
||||
pci_disable_device(dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* return first device in slot, acquiring a reference on it */
|
||||
static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot)
|
||||
{
|
||||
@@ -931,12 +920,7 @@ static int disable_device(struct acpiphp_slot *slot)
|
||||
* here.
|
||||
*/
|
||||
while ((pdev = dev_in_slot(slot))) {
|
||||
pci_stop_bus_device(pdev);
|
||||
if (pdev->subordinate) {
|
||||
disable_bridges(pdev->subordinate);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
__pci_remove_bus_device(pdev);
|
||||
pci_stop_and_remove_bus_device(pdev);
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
|
||||
@@ -1477,34 +1461,6 @@ int __init acpiphp_get_num_slots(void)
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* acpiphp_for_each_slot - call function for each slot
|
||||
* @fn: callback function
|
||||
* @data: context to be passed to callback function
|
||||
*/
|
||||
static int acpiphp_for_each_slot(acpiphp_callback fn, void *data)
|
||||
{
|
||||
struct list_head *node;
|
||||
struct acpiphp_bridge *bridge;
|
||||
struct acpiphp_slot *slot;
|
||||
int retval = 0;
|
||||
|
||||
list_for_each (node, &bridge_list) {
|
||||
bridge = (struct acpiphp_bridge *)node;
|
||||
for (slot = bridge->slots; slot; slot = slot->next) {
|
||||
retval = fn(slot, data);
|
||||
if (!retval)
|
||||
goto err_exit;
|
||||
}
|
||||
}
|
||||
|
||||
err_exit:
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* acpiphp_enable_slot - power on slot
|
||||
* @slot: ACPI PHP slot
|
||||
|
@@ -434,25 +434,6 @@ int pci_proc_detach_device(struct pci_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int pci_proc_attach_bus(struct pci_bus* bus)
|
||||
{
|
||||
struct proc_dir_entry *de = bus->procdir;
|
||||
|
||||
if (!proc_initialized)
|
||||
return -EACCES;
|
||||
|
||||
if (!de) {
|
||||
char name[16];
|
||||
sprintf(name, "%02x", bus->number);
|
||||
de = bus->procdir = proc_mkdir(name, proc_bus_pci_dir);
|
||||
if (!de)
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
int pci_proc_detach_bus(struct pci_bus* bus)
|
||||
{
|
||||
struct proc_dir_entry *de = bus->procdir;
|
||||
|
@@ -32,53 +32,30 @@ static void pci_stop_dev(struct pci_dev *dev)
|
||||
|
||||
static void pci_destroy_dev(struct pci_dev *dev)
|
||||
{
|
||||
/* Remove the device from the device lists, and prevent any further
|
||||
* list accesses from this device */
|
||||
down_write(&pci_bus_sem);
|
||||
list_del(&dev->bus_list);
|
||||
dev->bus_list.next = dev->bus_list.prev = NULL;
|
||||
up_write(&pci_bus_sem);
|
||||
|
||||
pci_free_resources(dev);
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_remove_device_safe - remove an unused hotplug device
|
||||
* @dev: the device to remove
|
||||
*
|
||||
* Delete the device structure from the device lists and
|
||||
* notify userspace (/sbin/hotplug), but only if the device
|
||||
* in question is not being used by a driver.
|
||||
* Returns 0 on success.
|
||||
*/
|
||||
#if 0
|
||||
int pci_remove_device_safe(struct pci_dev *dev)
|
||||
void pci_remove_bus(struct pci_bus *bus)
|
||||
{
|
||||
if (pci_dev_driver(dev))
|
||||
return -EBUSY;
|
||||
pci_destroy_dev(dev);
|
||||
return 0;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
void pci_remove_bus(struct pci_bus *pci_bus)
|
||||
{
|
||||
pci_proc_detach_bus(pci_bus);
|
||||
pci_proc_detach_bus(bus);
|
||||
|
||||
down_write(&pci_bus_sem);
|
||||
list_del(&pci_bus->node);
|
||||
pci_bus_release_busn_res(pci_bus);
|
||||
list_del(&bus->node);
|
||||
pci_bus_release_busn_res(bus);
|
||||
up_write(&pci_bus_sem);
|
||||
if (!pci_bus->is_added)
|
||||
if (!bus->is_added)
|
||||
return;
|
||||
|
||||
pci_remove_legacy_files(pci_bus);
|
||||
device_unregister(&pci_bus->dev);
|
||||
pci_remove_legacy_files(bus);
|
||||
device_unregister(&bus->dev);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_remove_bus);
|
||||
|
||||
static void __pci_remove_behind_bridge(struct pci_dev *dev);
|
||||
/**
|
||||
* pci_stop_and_remove_bus_device - remove a PCI device and any children
|
||||
* @dev: the device to remove
|
||||
@@ -91,93 +68,27 @@ static void __pci_remove_behind_bridge(struct pci_dev *dev);
|
||||
* device lists, remove the /proc entry, and notify userspace
|
||||
* (/sbin/hotplug).
|
||||
*/
|
||||
void __pci_remove_bus_device(struct pci_dev *dev)
|
||||
void pci_stop_and_remove_bus_device(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->subordinate) {
|
||||
struct pci_bus *b = dev->subordinate;
|
||||
struct pci_bus *bus = dev->subordinate;
|
||||
struct pci_dev *child, *tmp;
|
||||
|
||||
__pci_remove_behind_bridge(dev);
|
||||
pci_remove_bus(b);
|
||||
/*
|
||||
* Removing an SR-IOV PF device removes all the associated VFs,
|
||||
* which will update the bus->devices list and confuse the
|
||||
* iterator. Therefore, iterate in reverse so we remove the VFs
|
||||
* first, then the PF.
|
||||
*/
|
||||
if (bus) {
|
||||
list_for_each_entry_safe_reverse(child, tmp,
|
||||
&bus->devices, bus_list)
|
||||
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_remove_bus_device);
|
||||
|
||||
void pci_stop_and_remove_bus_device(struct pci_dev *dev)
|
||||
{
|
||||
pci_stop_bus_device(dev);
|
||||
__pci_remove_bus_device(dev);
|
||||
}
|
||||
|
||||
static void __pci_remove_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
if (dev->subordinate)
|
||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
||||
__pci_remove_bus_device(pci_dev_b(l));
|
||||
}
|
||||
|
||||
static void pci_stop_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
if (dev->subordinate)
|
||||
list_for_each_safe(l, n, &dev->subordinate->devices)
|
||||
pci_stop_bus_device(pci_dev_b(l));
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_stop_and_remove_behind_bridge - stop and remove all devices behind
|
||||
* a PCI bridge
|
||||
* @dev: PCI bridge device
|
||||
*
|
||||
* Remove all devices on the bus, except for the parent bridge.
|
||||
* This also removes any child buses, and any devices they may
|
||||
* contain in a depth-first manner.
|
||||
*/
|
||||
void pci_stop_and_remove_behind_bridge(struct pci_dev *dev)
|
||||
{
|
||||
pci_stop_behind_bridge(dev);
|
||||
__pci_remove_behind_bridge(dev);
|
||||
}
|
||||
|
||||
static void pci_stop_bus_devices(struct pci_bus *bus)
|
||||
{
|
||||
struct list_head *l, *n;
|
||||
|
||||
/*
|
||||
* VFs could be removed by pci_stop_and_remove_bus_device() in the
|
||||
* pci_stop_bus_devices() code path for PF.
|
||||
* aka, bus->devices get updated in the process.
|
||||
* but VFs are inserted after PFs when SRIOV is enabled for PF,
|
||||
* We can iterate the list backwards to get prev valid PF instead
|
||||
* of removed VF.
|
||||
*/
|
||||
list_for_each_prev_safe(l, n, &bus->devices) {
|
||||
struct pci_dev *dev = pci_dev_b(l);
|
||||
pci_stop_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.
|
||||
*/
|
||||
void pci_stop_bus_device(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->subordinate)
|
||||
pci_stop_bus_devices(dev->subordinate);
|
||||
|
||||
pci_stop_dev(dev);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pci_stop_and_remove_bus_device);
|
||||
EXPORT_SYMBOL(pci_stop_and_remove_behind_bridge);
|
||||
EXPORT_SYMBOL_GPL(pci_stop_bus_device);
|
||||
|
@@ -167,44 +167,6 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
|
||||
return rom;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* pci_map_rom_copy - map a PCI ROM to kernel space, create a copy
|
||||
* @pdev: pointer to pci device struct
|
||||
* @size: pointer to receive size of pci window over ROM
|
||||
*
|
||||
* Return: kernel virtual pointer to image of ROM
|
||||
*
|
||||
* Map a PCI ROM into kernel space. If ROM is boot video ROM,
|
||||
* the shadow BIOS copy will be returned instead of the
|
||||
* actual ROM.
|
||||
*/
|
||||
void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size)
|
||||
{
|
||||
struct resource *res = &pdev->resource[PCI_ROM_RESOURCE];
|
||||
void __iomem *rom;
|
||||
|
||||
rom = pci_map_rom(pdev, size);
|
||||
if (!rom)
|
||||
return NULL;
|
||||
|
||||
if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW |
|
||||
IORESOURCE_ROM_BIOS_COPY))
|
||||
return rom;
|
||||
|
||||
res->start = (unsigned long)kmalloc(*size, GFP_KERNEL);
|
||||
if (!res->start)
|
||||
return rom;
|
||||
|
||||
res->end = res->start + *size;
|
||||
memcpy_fromio((void*)(unsigned long)res->start, rom, *size);
|
||||
pci_unmap_rom(pdev, rom);
|
||||
res->flags |= IORESOURCE_ROM_COPY;
|
||||
|
||||
return (void __iomem *)(unsigned long)res->start;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/**
|
||||
* pci_unmap_rom - unmap the ROM from kernel space
|
||||
* @pdev: pointer to pci device struct
|
||||
@@ -226,27 +188,6 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom)
|
||||
pci_disable_rom(pdev);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* pci_remove_rom - disable the ROM and remove its sysfs attribute
|
||||
* @pdev: pointer to pci device struct
|
||||
*
|
||||
* Remove the rom file in sysfs and disable ROM decoding.
|
||||
*/
|
||||
void pci_remove_rom(struct pci_dev *pdev)
|
||||
{
|
||||
struct resource *res = &pdev->resource[PCI_ROM_RESOURCE];
|
||||
|
||||
if (pci_resource_len(pdev, PCI_ROM_RESOURCE))
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
|
||||
if (!(res->flags & (IORESOURCE_ROM_ENABLE |
|
||||
IORESOURCE_ROM_SHADOW |
|
||||
IORESOURCE_ROM_BIOS_COPY |
|
||||
IORESOURCE_ROM_COPY)))
|
||||
pci_disable_rom(pdev);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/**
|
||||
* pci_cleanup_rom - free the ROM copy created by pci_map_rom_copy
|
||||
* @pdev: pointer to pci device struct
|
||||
|
@@ -130,16 +130,14 @@ pci_find_next_bus(const struct pci_bus *from)
|
||||
* decrement the reference count by calling pci_dev_put().
|
||||
* If no device is found, %NULL is returned.
|
||||
*/
|
||||
struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn)
|
||||
struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn)
|
||||
{
|
||||
struct list_head *tmp;
|
||||
struct pci_dev *dev;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
down_read(&pci_bus_sem);
|
||||
|
||||
list_for_each(tmp, &bus->devices) {
|
||||
dev = pci_dev_b(tmp);
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
if (dev->devfn == devfn)
|
||||
goto out;
|
||||
}
|
||||
|
Reference in New Issue
Block a user