vserver 1.9.5.x5
[linux-2.6.git] / drivers / pci / hotplug / shpchprm_acpi.c
index 8b70c0c..f1c51f0 100644 (file)
@@ -218,6 +218,10 @@ static void acpi_get__hpp ( struct acpi_bridge     *ab)
        }
 
        ab->_hpp = kmalloc (sizeof (struct acpi__hpp), GFP_KERNEL);
+       if (!ab->_hpp) {
+               err ("acpi_shpchprm:%s alloc for _HPP failed\n", path_name);
+               goto free_and_return;
+       }
        memset(ab->_hpp, 0, sizeof(struct acpi__hpp));
 
        ab->_hpp->cache_line_size       = nui[0];
@@ -1391,26 +1395,36 @@ static int configure_existing_function(
 
 static int bind_pci_resources_to_slots ( struct controller *ctrl)
 {
-       struct pci_func *func;
-       int busn = ctrl->bus;
+       struct pci_func *func, new_func;
+       int busn = ctrl->slot_bus;
        int devn, funn;
        u32     vid;
 
        for (devn = 0; devn < 32; devn++) {
                for (funn = 0; funn < 8; funn++) {
+                       /*
                        if (devn == ctrl->device && funn == ctrl->function)
                                continue;
+                       */
                        /* find out if this entry is for an occupied slot */
                        vid = 0xFFFFFFFF;
-                       pci_bus_read_config_dword(ctrl->pci_bus, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid);
+                       pci_bus_read_config_dword(ctrl->pci_dev->subordinate, PCI_DEVFN(devn, funn), PCI_VENDOR_ID, &vid);
 
                        if (vid != 0xFFFFFFFF) {
                                func = shpchp_slot_find(busn, devn, funn);
-                               if (!func)
-                                       continue;
-                               configure_existing_function(ctrl, func);
+                               if (!func) {
+                                       memset(&new_func, 0, sizeof(struct pci_func));
+                                       new_func.bus = busn;
+                                       new_func.device = devn;
+                                       new_func.function = funn;
+                                       new_func.is_a_board = 1;
+                                       configure_existing_function(ctrl, &new_func);
+                                       shpchprm_dump_func_res(&new_func);
+                               } else {
+                                       configure_existing_function(ctrl, func);
+                                       shpchprm_dump_func_res(func);
+                               }
                                dbg("aCCF:existing PCI 0x%x Func ResourceDump\n", ctrl->bus);
-                               shpchprm_dump_func_res(func);
                        }
                }
        }