Commit d1f9e497 authored by Carlos Corbacho's avatar Carlos Corbacho Committed by Len Brown

ACPI: WMI: Survive BIOS with duplicate GUIDs

It would appear that in BIOS's with nVidia hooks, the GUID
05901221-D566-11D1-B2F0-00A0C9062910 is duplicated. For now, the simplest
solution is to just ignore any duplicate GUIDs. These particular hooks are not
currently supported/ used in the kernel, so whoever does that can figure out
what the 'right' solution should be (if there's a better one).

http://bugzilla.kernel.org/show_bug.cgi?id=14846Signed-off-by: default avatarCarlos Corbacho <carlos@strangeworlds.co.uk>
Reported-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Reported-by: default avatarOldřich Jedlička <oldium.pro@seznam.cz>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 7a9568f5
...@@ -714,6 +714,22 @@ static int wmi_class_init(void) ...@@ -714,6 +714,22 @@ static int wmi_class_init(void)
return ret; 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 * Parse the _WDG method for the GUID data blocks
*/ */
...@@ -723,6 +739,7 @@ static __init acpi_status parse_wdg(acpi_handle handle) ...@@ -723,6 +739,7 @@ static __init acpi_status parse_wdg(acpi_handle handle)
union acpi_object *obj; union acpi_object *obj;
struct guid_block *gblock; struct guid_block *gblock;
struct wmi_block *wblock; struct wmi_block *wblock;
char guid_string[37];
acpi_status status; acpi_status status;
u32 i, total; u32 i, total;
...@@ -745,6 +762,19 @@ static __init acpi_status parse_wdg(acpi_handle handle) ...@@ -745,6 +762,19 @@ static __init acpi_status parse_wdg(acpi_handle handle)
memcpy(gblock, obj->buffer.pointer, obj->buffer.length); memcpy(gblock, obj->buffer.pointer, obj->buffer.length);
for (i = 0; i < total; i++) { 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); wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
if (!wblock) if (!wblock)
return AE_NO_MEMORY; return AE_NO_MEMORY;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment