Commit 02a8fa39 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

[PATCH] Compaq PCI Hotplug: convert to use pci_remove_bus_device instead of custom code.

parent e886a083
......@@ -117,94 +117,11 @@ static int configure_visit_pci_dev (struct pci_dev_wrapped *wrapped_dev, struct
}
static int unconfigure_visit_pci_dev_phase2 (struct pci_dev_wrapped *wrapped_dev, struct pci_bus_wrapped *wrapped_bus)
{
struct pci_dev* dev = wrapped_dev->dev;
struct pci_func *temp_func;
int i=0;
//We need to remove the hotplug function representation with the linux representation
do {
temp_func = cpqhp_slot_find(dev->bus->number, dev->devfn >> 3, i++);
if (temp_func) {
dbg("temp_func->function = %d\n", temp_func->function);
}
} while (temp_func && (temp_func->function != (dev->devfn & 0x07)));
//Now, remove the Linux Representation
if (dev) {
if (pci_remove_device_safe(dev) == 0) {
kfree(dev); //Now, remove
} else {
return -1; // problems while freeing, abort visitation
}
}
if (temp_func) {
temp_func->pci_dev = NULL;
} else {
dbg("No pci_func representation for bus, devfn = %d, %x\n", dev->bus->number, dev->devfn);
}
return 0;
}
static int unconfigure_visit_pci_bus_phase2 (struct pci_bus_wrapped *wrapped_bus, struct pci_dev_wrapped *wrapped_dev)
{
struct pci_bus* bus = wrapped_bus->bus;
//The cleanup code for proc entries regarding buses should be in the kernel...
if (bus->procdir)
dbg("detach_pci_bus %s\n", bus->procdir->name);
pci_proc_detach_bus(bus);
// The cleanup code should live in the kernel...
bus->self->subordinate = NULL;
// unlink from parent bus
list_del(&bus->node);
// Now, remove
if (bus)
kfree(bus);
return 0;
}
static int unconfigure_visit_pci_dev_phase1 (struct pci_dev_wrapped *wrapped_dev, struct pci_bus_wrapped *wrapped_bus)
{
struct pci_dev* dev = wrapped_dev->dev;
dbg("attempting removal of driver for device (%x, %x, %x)\n", dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
//Now, remove the Linux Driver Representation
if (dev->driver) {
if (dev->driver->remove) {
dev->driver->remove(dev);
dbg("driver was properly removed\n");
}
dev->driver = NULL;
}
return (pci_dev_driver(dev) != NULL);
}
static struct pci_visit configure_functions = {
.visit_pci_dev = configure_visit_pci_dev,
};
static struct pci_visit unconfigure_functions_phase1 = {
.post_visit_pci_dev = unconfigure_visit_pci_dev_phase1
};
static struct pci_visit unconfigure_functions_phase2 = {
.post_visit_pci_bus = unconfigure_visit_pci_bus_phase2,
.post_visit_pci_dev = unconfigure_visit_pci_dev_phase2
};
int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func)
{
unsigned char bus;
......@@ -258,31 +175,16 @@ int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func)
int cpqhp_unconfigure_device(struct pci_func* func)
{
int rc = 0;
int j;
struct pci_dev_wrapped wrapped_dev;
struct pci_bus_wrapped wrapped_bus;
memset(&wrapped_dev, 0, sizeof(struct pci_dev_wrapped));
memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped));
dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function);
for (j=0; j<8 ; j++) {
struct pci_dev* temp = pci_find_slot(func->bus, (func->device << 3) | j);
if (temp) {
wrapped_dev.dev = temp;
wrapped_bus.bus = temp->bus;
rc = pci_visit_dev(&unconfigure_functions_phase1, &wrapped_dev, &wrapped_bus);
if (rc)
break;
rc = pci_visit_dev(&unconfigure_functions_phase2, &wrapped_dev, &wrapped_bus);
if (rc)
break;
}
if (temp)
pci_remove_bus_device(temp);
}
return rc;
return 0;
}
static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 offset, u32 *value)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment