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=14846 Signed-off-by: Carlos Corbacho <carlos@strangeworlds.co.uk> Reported-by: Larry Finger <Larry.Finger@lwfinger.net> Reported-by: Oldřich Jedlička <oldium.pro@seznam.cz> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
7a9568f536
commit
d1f9e49707
1 changed files with 30 additions and 0 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue