Merge branch 'bjorn-start-stop-2.6.32' into release
[pandora-kernel.git] / drivers / acpi / acpi_memhotplug.c
index a8d9d8f..28ccdbc 100644 (file)
@@ -38,6 +38,9 @@
 
 #define _COMPONENT             ACPI_MEMORY_DEVICE_COMPONENT
 
+#undef PREFIX
+#define        PREFIX          "ACPI:memory_hp:"
+
 ACPI_MODULE_NAME("acpi_memhotplug");
 MODULE_AUTHOR("Naveen B S <naveen.b.s@intel.com>");
 MODULE_DESCRIPTION("Hotplug Mem Driver");
@@ -151,6 +154,7 @@ acpi_memory_get_device(acpi_handle handle,
        acpi_handle phandle;
        struct acpi_device *device = NULL;
        struct acpi_device *pdevice = NULL;
+       int result;
 
 
        if (!acpi_bus_get_device(handle, &device) && device)
@@ -163,9 +167,9 @@ acpi_memory_get_device(acpi_handle handle,
        }
 
        /* Get the parent device */
-       status = acpi_bus_get_device(phandle, &pdevice);
-       if (ACPI_FAILURE(status)) {
-               ACPI_EXCEPTION((AE_INFO, status, "Cannot get acpi bus device"));
+       result = acpi_bus_get_device(phandle, &pdevice);
+       if (result) {
+               printk(KERN_WARNING PREFIX "Cannot get acpi bus device");
                return -EINVAL;
        }
 
@@ -173,9 +177,9 @@ acpi_memory_get_device(acpi_handle handle,
         * Now add the notified device.  This creates the acpi_device
         * and invokes .add function
         */
-       status = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
-       if (ACPI_FAILURE(status)) {
-               ACPI_EXCEPTION((AE_INFO, status, "Cannot add acpi bus"));
+       result = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
+       if (result) {
+               printk(KERN_WARNING PREFIX "Cannot add acpi bus");
                return -EINVAL;
        }
 
@@ -236,7 +240,12 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
                        num_enabled++;
                        continue;
                }
-
+               /*
+                * If the memory block size is zero, please ignore it.
+                * Don't try to do the following memory hotplug flowchart.
+                */
+               if (!info->length)
+                       continue;
                if (node < 0)
                        node = memory_add_physaddr_to_nid(info->start_addr);
 
@@ -251,8 +260,15 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
                mem_device->state = MEMORY_INVALID_STATE;
                return -EINVAL;
        }
-
-       return result;
+       /*
+        * Sometimes the memory device will contain several memory blocks.
+        * When one memory block is hot-added to the system memory, it will
+        * be regarded as a success.
+        * Otherwise if the last memory block can't be hot-added to the system
+        * memory, it will be failure and the memory device can't be bound with
+        * driver.
+        */
+       return 0;
 }
 
 static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
@@ -453,26 +469,23 @@ static acpi_status is_memory_device(acpi_handle handle)
 {
        char *hardware_id;
        acpi_status status;
-       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
        struct acpi_device_info *info;
 
-
-       status = acpi_get_object_info(handle, &buffer);
+       status = acpi_get_object_info(handle, &info);
        if (ACPI_FAILURE(status))
                return status;
 
-       info = buffer.pointer;
        if (!(info->valid & ACPI_VALID_HID)) {
-               kfree(buffer.pointer);
+               kfree(info);
                return AE_ERROR;
        }
 
-       hardware_id = info->hardware_id.value;
+       hardware_id = info->hardware_id.string;
        if ((hardware_id == NULL) ||
            (strcmp(hardware_id, ACPI_MEMORY_DEVICE_HID)))
                status = AE_ERROR;
 
-       kfree(buffer.pointer);
+       kfree(info);
        return status;
 }