]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/pci/hotplug/ibmphp_ebda.c
PCI hotplug: check ioremap() return value in ibmphp_ebda.c
[net-next-2.6.git] / drivers / pci / hotplug / ibmphp_ebda.c
index 8cfd1c4926c8c4b4c1e36ff1a39266df8a8a62e0..5becbdee4027019a5c584df5ff5fb3cc99b04cc3 100644 (file)
@@ -245,7 +245,7 @@ static void __init print_ebda_hpc (void)
 
 int __init ibmphp_access_ebda (void)
 {
-       u8 format, num_ctlrs, rio_complete, hs_complete;
+       u8 format, num_ctlrs, rio_complete, hs_complete, ebda_sz;
        u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, re, rc_id, re_id, base;
        int rc = 0;
 
@@ -260,7 +260,16 @@ int __init ibmphp_access_ebda (void)
        iounmap (io_mem);
        debug ("returned ebda segment: %x\n", ebda_seg);
        
-       io_mem = ioremap(ebda_seg<<4, 1024);
+       io_mem = ioremap(ebda_seg<<4, 1);
+       if (!io_mem)
+               return -ENOMEM;
+       ebda_sz = readb(io_mem);
+       iounmap(io_mem);
+       debug("ebda size: %d(KiB)\n", ebda_sz);
+       if (ebda_sz == 0)
+               return -ENOMEM;
+
+       io_mem = ioremap(ebda_seg<<4, (ebda_sz * 1024));
        if (!io_mem )
                return -ENOMEM;
        next_offset = 0x180;
@@ -587,11 +596,14 @@ static u8 calculate_first_slot (u8 slot_num)
        return first_slot + 1;
 
 }
+
+#define SLOT_NAME_SIZE 30
+
 static char *create_file_name (struct slot * slot_cur)
 {
        struct opt_rio *opt_vg_ptr = NULL;
        struct opt_rio_lo *opt_lo_ptr = NULL;
-       static char str[30];
+       static char str[SLOT_NAME_SIZE];
        int which = 0; /* rxe = 1, chassis = 0 */
        u8 number = 1; /* either chassis or rxe # */
        u8 first_slot = 1;
@@ -703,7 +715,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
 
        slot = hotplug_slot->private;
        kfree(slot->hotplug_slot->info);
-       kfree(slot->hotplug_slot->name);
        kfree(slot->hotplug_slot);
        slot->ctrl = NULL;
        slot->bus_on = NULL;
@@ -734,6 +745,7 @@ static int __init ebda_rsrc_controller (void)
        struct bus_info *bus_info_ptr1, *bus_info_ptr2;
        int rc;
        struct slot *tmp_slot;
+       char name[SLOT_NAME_SIZE];
 
        addr = hpc_list_ptr->phys_addr;
        for (ctlr = 0; ctlr < hpc_list_ptr->num_ctlrs; ctlr++) {
@@ -897,12 +909,6 @@ static int __init ebda_rsrc_controller (void)
                                goto error_no_hp_info;
                        }
 
-                       hp_slot_ptr->name = kmalloc(30, GFP_KERNEL);
-                       if (!hp_slot_ptr->name) {
-                               rc = -ENOMEM;
-                               goto error_no_hp_name;
-                       }
-
                        tmp_slot = kzalloc(sizeof(*tmp_slot), GFP_KERNEL);
                        if (!tmp_slot) {
                                rc = -ENOMEM;
@@ -964,9 +970,9 @@ static int __init ebda_rsrc_controller (void)
        }                       /* each hpc  */
 
        list_for_each_entry(tmp_slot, &ibmphp_slot_head, ibm_slot_list) {
-               snprintf (tmp_slot->hotplug_slot->name, 30, "%s", create_file_name (tmp_slot));
+               snprintf(name, SLOT_NAME_SIZE, "%s", create_file_name(tmp_slot));
                pci_hp_register(tmp_slot->hotplug_slot,
-                       pci_find_bus(0, tmp_slot->bus), tmp_slot->device);
+                       pci_find_bus(0, tmp_slot->bus), tmp_slot->device, name);
        }
 
        print_ebda_hpc ();
@@ -976,8 +982,6 @@ static int __init ebda_rsrc_controller (void)
 error:
        kfree (hp_slot_ptr->private);
 error_no_slot:
-       kfree (hp_slot_ptr->name);
-error_no_hp_name:
        kfree (hp_slot_ptr->info);
 error_no_hp_info:
        kfree (hp_slot_ptr);