ChangeSet 1.2181.16.12, 2005/03/17 14:31:26-08:00, [EMAIL PROTECTED]

[PATCH] [PATCH] remove redundant devices list

The RPA PCI Hotplug module creates and maintains a list of devices for
each slot.  This is redundant, because the PCI structures already
maintain such a list.  This patch changes the module to use the list
provided in the pci_bus structure.

Signed-off-by: John Rose <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>


 drivers/pci/hotplug/rpaphp.h      |    2 
 drivers/pci/hotplug/rpaphp_pci.c  |  105 +++++++-------------------------------
 drivers/pci/hotplug/rpaphp_slot.c |   11 ---
 3 files changed, 22 insertions(+), 96 deletions(-)


diff -Nru a/drivers/pci/hotplug/rpaphp.h b/drivers/pci/hotplug/rpaphp.h
--- a/drivers/pci/hotplug/rpaphp.h      2005-04-01 15:36:22 -08:00
+++ b/drivers/pci/hotplug/rpaphp.h      2005-04-01 15:36:22 -08:00
@@ -94,7 +94,7 @@
                                /* dn has phb info */
        struct pci_dev *bridge; /* slot's pci_dev in pci_devices */
        union {
-               struct list_head pci_funcs; /* pci_devs in PCI slot */ 
+               struct list_head *pci_devs; /* pci_devs in PCI slot */
                struct vio_dev *vio_dev; /* vio_dev in VIO slot */
        } dev;
        struct hotplug_slot *hotplug_slot;
diff -Nru a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c
--- a/drivers/pci/hotplug/rpaphp_pci.c  2005-04-01 15:36:22 -08:00
+++ b/drivers/pci/hotplug/rpaphp_pci.c  2005-04-01 15:36:22 -08:00
@@ -130,11 +130,11 @@
                *value = EMPTY;
        }
        else if (state == PRESENT) {
-               if (!is_init)
+               if (!is_init) {
                        /* at run-time slot->state can be changed by */
                        /* config/unconfig adapter */
                        *value = slot->state;
-               else {
+               } else {
                        child_dn = slot->dn->child;
                        if (child_dn)
                                child_dev = rpaphp_find_pci_dev(child_dn);
@@ -263,56 +263,17 @@
        
 }
 
-#ifdef DEBUG
 static void print_slot_pci_funcs(struct slot *slot)
 {
-       struct list_head *l;
+       struct pci_dev *dev;
 
        if (slot->dev_type == PCI_DEV) {
-               printk("pci_funcs of slot[%s]\n", slot->name);
-               if (list_empty(&slot->dev.pci_funcs))
-                       printk("        pci_funcs is EMPTY\n");
-
-               list_for_each (l, &slot->dev.pci_funcs) {
-                       struct rpaphp_pci_func *func =
-                               list_entry(l, struct rpaphp_pci_func, sibling);
-                       printk("        FOUND dev=%s\n", 
pci_name(func->pci_dev));
-               }
+               dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, slot->name);
+               list_for_each_entry (dev, slot->dev.pci_devs, bus_list)
+                       dbg("\t%s\n", pci_name(dev));
        }
        return;
 }
-#else
-static void print_slot_pci_funcs(struct slot *slot)
-{
-       return;
-}
-#endif
-
-static int init_slot_pci_funcs(struct slot *slot)
-{
-       struct device_node *child;
-
-       for (child = slot->dn->child; child != NULL; child = child->sibling) {
-               struct pci_dev *pdev = rpaphp_find_pci_dev(child);
-
-               if (pdev) {
-                       struct rpaphp_pci_func *func;
-                       func = kmalloc(sizeof(struct rpaphp_pci_func), 
GFP_KERNEL);
-                       if (!func) 
-                               return -ENOMEM;
-                       memset(func, 0, sizeof(struct rpaphp_pci_func));
-                       INIT_LIST_HEAD(&func->sibling);
-                       func->pci_dev = pdev;
-                       list_add_tail(&func->sibling, &slot->dev.pci_funcs);
-                       print_slot_pci_funcs(slot);
-               } else {
-                       err("%s: dn=%s has no pci_dev\n", 
-                               __FUNCTION__, child->full_name);
-                       return -EIO;
-               }
-       }
-       return 0;
-}
 
 static int rpaphp_config_pci_adapter(struct slot *slot)
 {
@@ -335,13 +296,8 @@
                        err("%s: can't find any devices.\n", __FUNCTION__);
                        goto exit;
                }
-               /* associate corresponding pci_dev */   
-               rc = init_slot_pci_funcs(slot);
-               if (rc)
-                       goto exit;
                print_slot_pci_funcs(slot);
-               if (!list_empty(&slot->dev.pci_funcs)) 
-                       rc = 0;
+               rc = 0;
        } else {
                /* slot is not enabled */
                err("slot doesn't have pci_dev structure\n");
@@ -371,34 +327,16 @@
 
 int rpaphp_unconfig_pci_adapter(struct slot *slot)
 {
+       struct pci_dev *dev;
        int retval = 0;
-       struct list_head *ln, *tmp;
 
-       dbg("Entry %s: slot[%s]\n", __FUNCTION__, slot->name);
-       if (list_empty(&slot->dev.pci_funcs)) {
-               err("%s: slot[%s] doesn't have any devices.\n", __FUNCTION__, 
-                       slot->name);
-
-               retval = -EINVAL;
-               goto exit;
-       }
-       /* remove the devices from the pci core */
-       list_for_each_safe (ln, tmp, &slot->dev.pci_funcs) {
-               struct rpaphp_pci_func *func;
-       
-               func = list_entry(ln, struct rpaphp_pci_func, sibling);
-               if (func->pci_dev) {
-                       pci_remove_bus_device(func->pci_dev); 
-                       rpaphp_eeh_remove_bus_device(func->pci_dev);
-               }
-               kfree(func);
-       }
-       INIT_LIST_HEAD(&slot->dev.pci_funcs);
+       list_for_each_entry(dev, slot->dev.pci_devs, bus_list)
+               rpaphp_eeh_remove_bus_device(dev);
+
+       pci_remove_behind_bridge(slot->bridge);
        slot->state = NOT_CONFIGURED;
        info("%s: devices in slot[%s] unconfigured.\n", __FUNCTION__,
             slot->name);
-exit:
-       dbg("Exit %s, rc=0x%x\n", __FUNCTION__, retval);
        return retval;
 }
 
@@ -444,6 +382,7 @@
 
 static int setup_pci_slot(struct slot *slot)
 {
+       struct pci_bus *bus;
        int rc;
 
        if (slot->type == PHB) {
@@ -460,6 +399,12 @@
                                        __FUNCTION__, slot->name);
                        goto exit_rc;
                }
+
+               bus = slot->bridge->subordinate;
+               if (!bus)
+                       goto exit_rc;
+               slot->dev.pci_devs = &bus->devices;
+
                dbg("%s set slot->name to %s\n",  __FUNCTION__,
                                pci_name(slot->bridge));
                strcpy(slot->name, pci_name(slot->bridge));
@@ -484,22 +429,15 @@
                                err("%s: CONFIG pci adapter failed\n", 
__FUNCTION__);
                                goto exit_rc;           
                        }
-               } else if (slot->hotplug_slot->info->adapter_status == 
CONFIGURED) {
-                       if (init_slot_pci_funcs(slot)) {
-                               err("%s: init_slot_pci_funcs failed\n", 
__FUNCTION__);
-                               goto exit_rc;
-                       }
 
-               } else {
+               } else if (slot->hotplug_slot->info->adapter_status != 
CONFIGURED) {
                        err("%s: slot[%s]'s adapter_status is NOT_VALID.\n",
                                __FUNCTION__, slot->name);
                        goto exit_rc;
                }
-               
                print_slot_pci_funcs(slot);
-               if (!list_empty(&slot->dev.pci_funcs)) {
+               if (!list_empty(slot->dev.pci_devs)) {
                        slot->state = CONFIGURED;
-       
                } else {
                        /* DLPAR add as opposed to 
                         * boot time */
@@ -521,7 +459,6 @@
                slot->removable = 0;
        else
                slot->removable = 1;
-       INIT_LIST_HEAD(&slot->dev.pci_funcs);
        if (setup_pci_hotplug_slot_info(slot))
                goto exit_rc;
        if (setup_pci_slot(slot))
diff -Nru a/drivers/pci/hotplug/rpaphp_slot.c 
b/drivers/pci/hotplug/rpaphp_slot.c
--- a/drivers/pci/hotplug/rpaphp_slot.c 2005-04-01 15:36:22 -08:00
+++ b/drivers/pci/hotplug/rpaphp_slot.c 2005-04-01 15:36:22 -08:00
@@ -98,17 +98,6 @@
 
 void dealloc_slot_struct(struct slot *slot)
 {
-       struct list_head *ln, *n;
-
-       if (slot->dev_type == PCI_DEV) {
-               list_for_each_safe (ln, n, &slot->dev.pci_funcs) {
-                       struct rpaphp_pci_func *func;
-
-                       func = list_entry(ln, struct rpaphp_pci_func, sibling);
-                       kfree(func);
-               }
-       }
-
        kfree(slot->hotplug_slot->info);
        kfree(slot->hotplug_slot->name);
        kfree(slot->hotplug_slot);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to