]> err.no Git - linux-2.6/blobdiff - drivers/pci/hotplug/ibmphp_ebda.c
Merge branch 'core/softlockup-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6] / drivers / pci / hotplug / ibmphp_ebda.c
index aea1187c73ad3d0d9e8ddbc57284a8cb01d7462f..8467d028732514277a098815f3597ebfed1591ae 100644 (file)
@@ -28,7 +28,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
@@ -72,13 +71,7 @@ static int ebda_rio_table (void);
 
 static struct ebda_hpc_list * __init alloc_ebda_hpc_list (void)
 {
-       struct ebda_hpc_list *list;
-
-       list = kmalloc (sizeof (struct ebda_hpc_list), GFP_KERNEL);
-       if (!list)
-               return NULL;
-       memset (list, 0, sizeof (*list));
-       return list;
+       return kzalloc(sizeof(struct ebda_hpc_list), GFP_KERNEL);
 }
 
 static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count)
@@ -87,21 +80,18 @@ static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count)
        struct ebda_hpc_slot *slots;
        struct ebda_hpc_bus *buses;
 
-       controller = kmalloc (sizeof (struct controller), GFP_KERNEL);
+       controller = kzalloc(sizeof(struct controller), GFP_KERNEL);
        if (!controller)
                goto error;
-       memset (controller, 0, sizeof (*controller));
 
-       slots = kmalloc (sizeof (struct ebda_hpc_slot) * slot_count, GFP_KERNEL);
+       slots = kcalloc(slot_count, sizeof(struct ebda_hpc_slot), GFP_KERNEL);
        if (!slots)
                goto error_contr;
-       memset (slots, 0, sizeof (*slots) * slot_count);
        controller->slots = slots;
 
-       buses = kmalloc (sizeof (struct ebda_hpc_bus) * bus_count, GFP_KERNEL);
+       buses = kcalloc(bus_count, sizeof(struct ebda_hpc_bus), GFP_KERNEL);
        if (!buses)
                goto error_slots;
-       memset (buses, 0, sizeof (*buses) * bus_count);
        controller->buses = buses;
 
        return controller;
@@ -122,24 +112,12 @@ static void free_ebda_hpc (struct controller *controller)
 
 static struct ebda_rsrc_list * __init alloc_ebda_rsrc_list (void)
 {
-       struct ebda_rsrc_list *list;
-
-       list = kmalloc (sizeof (struct ebda_rsrc_list), GFP_KERNEL);
-       if (!list)
-               return NULL;
-       memset (list, 0, sizeof (*list));
-       return list;
+       return kzalloc(sizeof(struct ebda_rsrc_list), GFP_KERNEL);
 }
 
 static struct ebda_pci_rsrc *alloc_ebda_pci_rsrc (void)
 {
-       struct ebda_pci_rsrc *resource;
-
-       resource = kmalloc (sizeof (struct ebda_pci_rsrc), GFP_KERNEL);
-       if (!resource)
-               return NULL;
-       memset (resource, 0, sizeof (*resource));
-       return resource;
+       return kzalloc(sizeof(struct ebda_pci_rsrc), GFP_KERNEL);
 }
 
 static void __init print_bus_info (void)
@@ -149,18 +127,18 @@ static void __init print_bus_info (void)
        
        list_for_each (ptr1, &bus_info_head) {
                ptr = list_entry (ptr1, struct bus_info, bus_info_list);
-               debug ("%s - slot_min = %x\n", __FUNCTION__, ptr->slot_min);
-               debug ("%s - slot_max = %x\n", __FUNCTION__, ptr->slot_max);
-               debug ("%s - slot_count = %x\n", __FUNCTION__, ptr->slot_count);
-               debug ("%s - bus# = %x\n", __FUNCTION__, ptr->busno);
-               debug ("%s - current_speed = %x\n", __FUNCTION__, ptr->current_speed);
-               debug ("%s - controller_id = %x\n", __FUNCTION__, ptr->controller_id);
+               debug ("%s - slot_min = %x\n", __func__, ptr->slot_min);
+               debug ("%s - slot_max = %x\n", __func__, ptr->slot_max);
+               debug ("%s - slot_count = %x\n", __func__, ptr->slot_count);
+               debug ("%s - bus# = %x\n", __func__, ptr->busno);
+               debug ("%s - current_speed = %x\n", __func__, ptr->current_speed);
+               debug ("%s - controller_id = %x\n", __func__, ptr->controller_id);
                
-               debug ("%s - slots_at_33_conv = %x\n", __FUNCTION__, ptr->slots_at_33_conv);
-               debug ("%s - slots_at_66_conv = %x\n", __FUNCTION__, ptr->slots_at_66_conv);
-               debug ("%s - slots_at_66_pcix = %x\n", __FUNCTION__, ptr->slots_at_66_pcix);
-               debug ("%s - slots_at_100_pcix = %x\n", __FUNCTION__, ptr->slots_at_100_pcix);
-               debug ("%s - slots_at_133_pcix = %x\n", __FUNCTION__, ptr->slots_at_133_pcix);
+               debug ("%s - slots_at_33_conv = %x\n", __func__, ptr->slots_at_33_conv);
+               debug ("%s - slots_at_66_conv = %x\n", __func__, ptr->slots_at_66_conv);
+               debug ("%s - slots_at_66_pcix = %x\n", __func__, ptr->slots_at_66_pcix);
+               debug ("%s - slots_at_100_pcix = %x\n", __func__, ptr->slots_at_100_pcix);
+               debug ("%s - slots_at_133_pcix = %x\n", __func__, ptr->slots_at_133_pcix);
 
        }
 }
@@ -172,12 +150,12 @@ static void print_lo_info (void)
        debug ("print_lo_info ----\n"); 
        list_for_each (ptr1, &rio_lo_head) {
                ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
-               debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
-               debug ("%s - rio_type = %x\n", __FUNCTION__, ptr->rio_type);
-               debug ("%s - owner_id = %x\n", __FUNCTION__, ptr->owner_id);
-               debug ("%s - first_slot_num = %x\n", __FUNCTION__, ptr->first_slot_num);
-               debug ("%s - wpindex = %x\n", __FUNCTION__, ptr->wpindex);
-               debug ("%s - chassis_num = %x\n", __FUNCTION__, ptr->chassis_num);
+               debug ("%s - rio_node_id = %x\n", __func__, ptr->rio_node_id);
+               debug ("%s - rio_type = %x\n", __func__, ptr->rio_type);
+               debug ("%s - owner_id = %x\n", __func__, ptr->owner_id);
+               debug ("%s - first_slot_num = %x\n", __func__, ptr->first_slot_num);
+               debug ("%s - wpindex = %x\n", __func__, ptr->wpindex);
+               debug ("%s - chassis_num = %x\n", __func__, ptr->chassis_num);
 
        }
 }
@@ -186,15 +164,15 @@ static void print_vg_info (void)
 {
        struct rio_detail *ptr;
        struct list_head *ptr1;
-       debug ("%s ---\n", __FUNCTION__);
+       debug ("%s ---\n", __func__);
        list_for_each (ptr1, &rio_vg_head) {
                ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
-               debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
-               debug ("%s - rio_type = %x\n", __FUNCTION__, ptr->rio_type);
-               debug ("%s - owner_id = %x\n", __FUNCTION__, ptr->owner_id);
-               debug ("%s - first_slot_num = %x\n", __FUNCTION__, ptr->first_slot_num);
-               debug ("%s - wpindex = %x\n", __FUNCTION__, ptr->wpindex);
-               debug ("%s - chassis_num = %x\n", __FUNCTION__, ptr->chassis_num);
+               debug ("%s - rio_node_id = %x\n", __func__, ptr->rio_node_id);
+               debug ("%s - rio_type = %x\n", __func__, ptr->rio_type);
+               debug ("%s - owner_id = %x\n", __func__, ptr->owner_id);
+               debug ("%s - first_slot_num = %x\n", __func__, ptr->first_slot_num);
+               debug ("%s - wpindex = %x\n", __func__, ptr->wpindex);
+               debug ("%s - chassis_num = %x\n", __func__, ptr->chassis_num);
 
        }
 }
@@ -207,7 +185,7 @@ static void __init print_ebda_pci_rsrc (void)
        list_for_each (ptr1, &ibmphp_ebda_pci_rsrc_head) {
                ptr = list_entry (ptr1, struct ebda_pci_rsrc, ebda_pci_rsrc_list);
                debug ("%s - rsrc type: %x bus#: %x dev_func: %x start addr: %x end addr: %x\n", 
-                       __FUNCTION__, ptr->rsrc_type ,ptr->bus_num, ptr->dev_fun,ptr->start_addr, ptr->end_addr);
+                       __func__, ptr->rsrc_type ,ptr->bus_num, ptr->dev_fun,ptr->start_addr, ptr->end_addr);
        }
 }
 
@@ -218,7 +196,7 @@ static void __init print_ibm_slot (void)
 
        list_for_each (ptr1, &ibmphp_slot_head) {
                ptr = list_entry (ptr1, struct slot, ibm_slot_list);
-               debug ("%s - slot_number: %x\n", __FUNCTION__, ptr->number); 
+               debug ("%s - slot_number: %x\n", __func__, ptr->number);
        }
 }
 
@@ -226,13 +204,13 @@ static void __init print_opt_vg (void)
 {
        struct opt_rio *ptr;
        struct list_head *ptr1;
-       debug ("%s ---\n", __FUNCTION__);
+       debug ("%s ---\n", __func__);
        list_for_each (ptr1, &opt_vg_head) {
                ptr = list_entry (ptr1, struct opt_rio, opt_rio_list);
-               debug ("%s - rio_type %x\n", __FUNCTION__, ptr->rio_type); 
-               debug ("%s - chassis_num: %x\n", __FUNCTION__, ptr->chassis_num); 
-               debug ("%s - first_slot_num: %x\n", __FUNCTION__, ptr->first_slot_num); 
-               debug ("%s - middle_num: %x\n", __FUNCTION__, ptr->middle_num); 
+               debug ("%s - rio_type %x\n", __func__, ptr->rio_type);
+               debug ("%s - chassis_num: %x\n", __func__, ptr->chassis_num);
+               debug ("%s - first_slot_num: %x\n", __func__, ptr->first_slot_num);
+               debug ("%s - middle_num: %x\n", __func__, ptr->middle_num);
        }
 }
 
@@ -247,35 +225,35 @@ static void __init print_ebda_hpc (void)
                hpc_ptr = list_entry (ptr1, struct controller, ebda_hpc_list); 
 
                for (index = 0; index < hpc_ptr->slot_count; index++) {
-                       debug ("%s - physical slot#: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_num);
-                       debug ("%s - pci bus# of the slot: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_bus_num);
-                       debug ("%s - index into ctlr addr: %x\n", __FUNCTION__, hpc_ptr->slots[index].ctl_index);
-                       debug ("%s - cap of the slot: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_cap);
+                       debug ("%s - physical slot#: %x\n", __func__, hpc_ptr->slots[index].slot_num);
+                       debug ("%s - pci bus# of the slot: %x\n", __func__, hpc_ptr->slots[index].slot_bus_num);
+                       debug ("%s - index into ctlr addr: %x\n", __func__, hpc_ptr->slots[index].ctl_index);
+                       debug ("%s - cap of the slot: %x\n", __func__, hpc_ptr->slots[index].slot_cap);
                }
 
                for (index = 0; index < hpc_ptr->bus_count; index++) {
-                       debug ("%s - bus# of each bus controlled by this ctlr: %x\n", __FUNCTION__, hpc_ptr->buses[index].bus_num);
+                       debug ("%s - bus# of each bus controlled by this ctlr: %x\n", __func__, hpc_ptr->buses[index].bus_num);
                }
 
-               debug ("%s - type of hpc: %x\n", __FUNCTION__, hpc_ptr->ctlr_type);
+               debug ("%s - type of hpc: %x\n", __func__, hpc_ptr->ctlr_type);
                switch (hpc_ptr->ctlr_type) {
                case 1:
-                       debug ("%s - bus: %x\n", __FUNCTION__, hpc_ptr->u.pci_ctlr.bus);
-                       debug ("%s - dev_fun: %x\n", __FUNCTION__, hpc_ptr->u.pci_ctlr.dev_fun);
-                       debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
+                       debug ("%s - bus: %x\n", __func__, hpc_ptr->u.pci_ctlr.bus);
+                       debug ("%s - dev_fun: %x\n", __func__, hpc_ptr->u.pci_ctlr.dev_fun);
+                       debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
                        break;
 
                case 0:
-                       debug ("%s - io_start: %x\n", __FUNCTION__, hpc_ptr->u.isa_ctlr.io_start);
-                       debug ("%s - io_end: %x\n", __FUNCTION__, hpc_ptr->u.isa_ctlr.io_end);
-                       debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
+                       debug ("%s - io_start: %x\n", __func__, hpc_ptr->u.isa_ctlr.io_start);
+                       debug ("%s - io_end: %x\n", __func__, hpc_ptr->u.isa_ctlr.io_end);
+                       debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
                        break;
 
                case 2:
                case 4:
-                       debug ("%s - wpegbbar: %lx\n", __FUNCTION__, hpc_ptr->u.wpeg_ctlr.wpegbbar);
-                       debug ("%s - i2c_addr: %x\n", __FUNCTION__, hpc_ptr->u.wpeg_ctlr.i2c_addr);
-                       debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
+                       debug ("%s - wpegbbar: %lx\n", __func__, hpc_ptr->u.wpeg_ctlr.wpegbbar);
+                       debug ("%s - i2c_addr: %x\n", __func__, hpc_ptr->u.wpeg_ctlr.i2c_addr);
+                       debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
                        break;
                }
        }
@@ -390,10 +368,9 @@ int __init ibmphp_access_ebda (void)
                        debug ("now enter io table ---\n");
                        debug ("rio blk id: %x\n", blk_id);
 
-                       rio_table_ptr = kmalloc (sizeof (struct rio_table_hdr), GFP_KERNEL);
+                       rio_table_ptr = kzalloc(sizeof(struct rio_table_hdr), GFP_KERNEL);
                        if (!rio_table_ptr)
                                return -ENOMEM; 
-                       memset (rio_table_ptr, 0, sizeof (struct rio_table_hdr) );
                        rio_table_ptr->ver_num = readb (io_mem + offset);
                        rio_table_ptr->scal_count = readb (io_mem + offset + 1);
                        rio_table_ptr->riodev_count = readb (io_mem + offset + 2);
@@ -445,10 +422,9 @@ static int __init ebda_rio_table (void)
 
        // we do concern about rio details
        for (i = 0; i < rio_table_ptr->riodev_count; i++) {
-               rio_detail_ptr = kmalloc (sizeof (struct rio_detail), GFP_KERNEL);
+               rio_detail_ptr = kzalloc(sizeof(struct rio_detail), GFP_KERNEL);
                if (!rio_detail_ptr)
                        return -ENOMEM;
-               memset (rio_detail_ptr, 0, sizeof (struct rio_detail));
                rio_detail_ptr->rio_node_id = readb (io_mem + offset);
                rio_detail_ptr->bbar = readl (io_mem + offset + 1);
                rio_detail_ptr->rio_type = readb (io_mem + offset + 5);
@@ -503,10 +479,9 @@ static int __init combine_wpg_for_chassis (void)
                rio_detail_ptr = list_entry (list_head_ptr, struct rio_detail, rio_detail_list);
                opt_rio_ptr = search_opt_vg (rio_detail_ptr->chassis_num);
                if (!opt_rio_ptr) {
-                       opt_rio_ptr = (struct opt_rio *) kmalloc (sizeof (struct opt_rio), GFP_KERNEL);
+                       opt_rio_ptr = kzalloc(sizeof(struct opt_rio), GFP_KERNEL);
                        if (!opt_rio_ptr)
                                return -ENOMEM;
-                       memset (opt_rio_ptr, 0, sizeof (struct opt_rio));
                        opt_rio_ptr->rio_type = rio_detail_ptr->rio_type;
                        opt_rio_ptr->chassis_num = rio_detail_ptr->chassis_num;
                        opt_rio_ptr->first_slot_num = rio_detail_ptr->first_slot_num;
@@ -546,10 +521,9 @@ static int combine_wpg_for_expansion (void)
                rio_detail_ptr = list_entry (list_head_ptr, struct rio_detail, rio_detail_list);
                opt_rio_lo_ptr = search_opt_lo (rio_detail_ptr->chassis_num);
                if (!opt_rio_lo_ptr) {
-                       opt_rio_lo_ptr = (struct opt_rio_lo *) kmalloc (sizeof (struct opt_rio_lo), GFP_KERNEL);
+                       opt_rio_lo_ptr = kzalloc(sizeof(struct opt_rio_lo), GFP_KERNEL);
                        if (!opt_rio_lo_ptr)
                                return -ENOMEM;
-                       memset (opt_rio_lo_ptr, 0, sizeof (struct opt_rio_lo));
                        opt_rio_lo_ptr->rio_type = rio_detail_ptr->rio_type;
                        opt_rio_lo_ptr->chassis_num = rio_detail_ptr->chassis_num;
                        opt_rio_lo_ptr->first_slot_num = rio_detail_ptr->first_slot_num;
@@ -842,12 +816,11 @@ static int __init ebda_rsrc_controller (void)
 
                        bus_info_ptr2 = ibmphp_find_same_bus_num (slot_ptr->slot_bus_num);
                        if (!bus_info_ptr2) {
-                               bus_info_ptr1 = (struct bus_info *) kmalloc (sizeof (struct bus_info), GFP_KERNEL);
+                               bus_info_ptr1 = kzalloc(sizeof(struct bus_info), GFP_KERNEL);
                                if (!bus_info_ptr1) {
                                        rc = -ENOMEM;
                                        goto error_no_hp_slot;
                                }
-                               memset (bus_info_ptr1, 0, sizeof (struct bus_info));
                                bus_info_ptr1->slot_min = slot_ptr->slot_num;
                                bus_info_ptr1->slot_max = slot_ptr->slot_num;
                                bus_info_ptr1->slot_count += 1;
@@ -946,19 +919,17 @@ static int __init ebda_rsrc_controller (void)
                // register slots with hpc core as well as create linked list of ibm slot
                for (index = 0; index < hpc_ptr->slot_count; index++) {
 
-                       hp_slot_ptr = kmalloc(sizeof(*hp_slot_ptr), GFP_KERNEL);
+                       hp_slot_ptr = kzalloc(sizeof(*hp_slot_ptr), GFP_KERNEL);
                        if (!hp_slot_ptr) {
                                rc = -ENOMEM;
                                goto error_no_hp_slot;
                        }
-                       memset(hp_slot_ptr, 0, sizeof(*hp_slot_ptr));
 
-                       hp_slot_ptr->info = kmalloc (sizeof(struct hotplug_slot_info), GFP_KERNEL);
+                       hp_slot_ptr->info = kzalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL);
                        if (!hp_slot_ptr->info) {
                                rc = -ENOMEM;
                                goto error_no_hp_info;
                        }
-                       memset(hp_slot_ptr->info, 0, sizeof(struct hotplug_slot_info));
 
                        hp_slot_ptr->name = kmalloc(30, GFP_KERNEL);
                        if (!hp_slot_ptr->name) {
@@ -966,14 +937,13 @@ static int __init ebda_rsrc_controller (void)
                                goto error_no_hp_name;
                        }
 
-                       tmp_slot = kmalloc(sizeof(*tmp_slot), GFP_KERNEL);
+                       tmp_slot = kzalloc(sizeof(*tmp_slot), GFP_KERNEL);
                        if (!tmp_slot) {
                                rc = -ENOMEM;
                                goto error_no_slot;
                        }
-                       memset(tmp_slot, 0, sizeof(*tmp_slot));
 
-                       tmp_slot->flag = TRUE;
+                       tmp_slot->flag = 1;
 
                        tmp_slot->capabilities = hpc_ptr->slots[index].slot_cap;
                        if ((hpc_ptr->slots[index].slot_cap & EBDA_SLOT_133_MAX) == EBDA_SLOT_133_MAX)
@@ -993,6 +963,7 @@ static int __init ebda_rsrc_controller (void)
 
                        bus_info_ptr1 = ibmphp_find_same_bus_num (hpc_ptr->slots[index].slot_bus_num);
                        if (!bus_info_ptr1) {
+                               kfree(tmp_slot);
                                rc = -ENODEV;
                                goto error;
                        }
@@ -1030,7 +1001,8 @@ static int __init ebda_rsrc_controller (void)
                tmp_slot = list_entry (list, struct slot, ibm_slot_list);
 
                snprintf (tmp_slot->hotplug_slot->name, 30, "%s", create_file_name (tmp_slot));
-               pci_hp_register (tmp_slot->hotplug_slot);
+               pci_hp_register(tmp_slot->hotplug_slot,
+                       pci_find_bus(0, tmp_slot->bus), tmp_slot->device);
        }
 
        print_ebda_hpc ();