|
@@ -714,6 +714,22 @@ static int wmi_class_init(void)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static bool guid_already_parsed(const char *guid_string)
|
|
|
+{
|
|
|
+ struct guid_block *gblock;
|
|
|
+ struct wmi_block *wblock;
|
|
|
+ struct list_head *p;
|
|
|
+
|
|
|
+ list_for_each(p, &wmi_blocks.list) {
|
|
|
+ wblock = list_entry(p, struct wmi_block, list);
|
|
|
+ gblock = &wblock->gblock;
|
|
|
+
|
|
|
+ if (strncmp(gblock->guid, guid_string, 16) == 0)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Parse the _WDG method for the GUID data blocks
|
|
|
*/
|
|
@@ -723,6 +739,7 @@ static __init acpi_status parse_wdg(acpi_handle handle)
|
|
|
union acpi_object *obj;
|
|
|
struct guid_block *gblock;
|
|
|
struct wmi_block *wblock;
|
|
|
+ char guid_string[37];
|
|
|
acpi_status status;
|
|
|
u32 i, total;
|
|
|
|
|
@@ -745,6 +762,19 @@ static __init acpi_status parse_wdg(acpi_handle handle)
|
|
|
memcpy(gblock, obj->buffer.pointer, obj->buffer.length);
|
|
|
|
|
|
for (i = 0; i < total; i++) {
|
|
|
+ /*
|
|
|
+ Some WMI devices, like those for nVidia hooks, have a
|
|
|
+ duplicate GUID. It's not clear what we should do in this
|
|
|
+ case yet, so for now, we'll just ignore the duplicate.
|
|
|
+ Anyone who wants to add support for that device can come
|
|
|
+ up with a better workaround for the mess then.
|
|
|
+ */
|
|
|
+ if (guid_already_parsed(gblock[i].guid) == true) {
|
|
|
+ wmi_gtoa(gblock[i].guid, guid_string);
|
|
|
+ printk(KERN_INFO PREFIX "Skipping duplicate GUID %s\n",
|
|
|
+ guid_string);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
|
|
|
if (!wblock)
|
|
|
return AE_NO_MEMORY;
|