aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorThomas Renninger <trenn@suse.de>2010-05-03 09:30:15 -0400
committerMatthew Garrett <mjg@redhat.com>2010-05-20 09:46:15 -0400
commitfc3155b2c6419a442c6f8b34a3bf31f8efe0fe33 (patch)
tree5e95c022dbb2770fa06d78c6042fc7445c9093df /drivers
parent7ab52521f2d850e922f33e5586a47e6c83ec6f11 (diff)
X86 platform wmi: Introduce debug param to log all WMI events
To give people easily an idea what could be WMI driven on their system. Introduces: wmi.debug=[01] Tested on an acer: ACPI: WMI: DEBUG Event INTEGER_TYPE - 65535 Situation where a driver registers for specific event and debug handler gets overridden and set again if the registering driver gets unloaded again is untested, but should work. Signed-off-by: Thomas Renninger <trenn@suse.de> CC: platform-driver-x86@vger.kernel.org CC: mjg59@srcf.ucam.org CC: corentin.chary@gmail.com Signed-off-by: Carlos Corbacho <carlos@strangeworlds.co.uk> Signed-off-by: Matthew Garrett <mjg@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/platform/x86/wmi.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index 17df134a6f03..e820f4cddb61 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -81,6 +81,11 @@ static struct wmi_block wmi_blocks;
81#define ACPI_WMI_STRING 0x4 /* GUID takes & returns a string */ 81#define ACPI_WMI_STRING 0x4 /* GUID takes & returns a string */
82#define ACPI_WMI_EVENT 0x8 /* GUID is an event */ 82#define ACPI_WMI_EVENT 0x8 /* GUID is an event */
83 83
84static int debug_event;
85module_param(debug_event, bool, 0444);
86MODULE_PARM_DESC(debug_event,
87 "Log WMI Events [0/1]");
88
84static int acpi_wmi_remove(struct acpi_device *device, int type); 89static int acpi_wmi_remove(struct acpi_device *device, int type);
85static int acpi_wmi_add(struct acpi_device *device); 90static int acpi_wmi_add(struct acpi_device *device);
86static void acpi_wmi_notify(struct acpi_device *device, u32 event); 91static void acpi_wmi_notify(struct acpi_device *device, u32 event);
@@ -477,6 +482,37 @@ const struct acpi_buffer *in)
477} 482}
478EXPORT_SYMBOL_GPL(wmi_set_block); 483EXPORT_SYMBOL_GPL(wmi_set_block);
479 484
485static void wmi_notify_debug(u32 value, void *context)
486{
487 struct acpi_buffer response = { ACPI_ALLOCATE_BUFFER, NULL };
488 union acpi_object *obj;
489
490 wmi_get_event_data(value, &response);
491
492 obj = (union acpi_object *)response.pointer;
493
494 if (!obj)
495 return;
496
497 printk(KERN_INFO PREFIX "DEBUG Event ");
498 switch(obj->type) {
499 case ACPI_TYPE_BUFFER:
500 printk("BUFFER_TYPE - length %d\n", obj->buffer.length);
501 break;
502 case ACPI_TYPE_STRING:
503 printk("STRING_TYPE - %s\n", obj->string.pointer);
504 break;
505 case ACPI_TYPE_INTEGER:
506 printk("INTEGER_TYPE - %llu\n", obj->integer.value);
507 break;
508 case ACPI_TYPE_PACKAGE:
509 printk("PACKAGE_TYPE - %d elements\n", obj->package.count);
510 break;
511 default:
512 printk("object type 0x%X\n", obj->type);
513 }
514}
515
480/** 516/**
481 * wmi_install_notify_handler - Register handler for WMI events 517 * wmi_install_notify_handler - Register handler for WMI events
482 * @handler: Function to handle notifications 518 * @handler: Function to handle notifications
@@ -496,7 +532,7 @@ wmi_notify_handler handler, void *data)
496 if (!find_guid(guid, &block)) 532 if (!find_guid(guid, &block))
497 return AE_NOT_EXIST; 533 return AE_NOT_EXIST;
498 534
499 if (block->handler) 535 if (block->handler && block->handler != wmi_notify_debug)
500 return AE_ALREADY_ACQUIRED; 536 return AE_ALREADY_ACQUIRED;
501 537
502 block->handler = handler; 538 block->handler = handler;
@@ -516,7 +552,7 @@ EXPORT_SYMBOL_GPL(wmi_install_notify_handler);
516acpi_status wmi_remove_notify_handler(const char *guid) 552acpi_status wmi_remove_notify_handler(const char *guid)
517{ 553{
518 struct wmi_block *block; 554 struct wmi_block *block;
519 acpi_status status; 555 acpi_status status = AE_OK;
520 556
521 if (!guid) 557 if (!guid)
522 return AE_BAD_PARAMETER; 558 return AE_BAD_PARAMETER;
@@ -524,14 +560,16 @@ acpi_status wmi_remove_notify_handler(const char *guid)
524 if (!find_guid(guid, &block)) 560 if (!find_guid(guid, &block))
525 return AE_NOT_EXIST; 561 return AE_NOT_EXIST;
526 562
527 if (!block->handler) 563 if (!block->handler || block->handler == wmi_notify_debug)
528 return AE_NULL_ENTRY; 564 return AE_NULL_ENTRY;
529 565
530 status = wmi_method_enable(block, 0); 566 if (debug_event) {
531 567 block->handler = wmi_notify_debug;
532 block->handler = NULL; 568 } else {
533 block->handler_data = NULL; 569 status = wmi_method_enable(block, 0);
534 570 block->handler = NULL;
571 block->handler_data = NULL;
572 }
535 return status; 573 return status;
536} 574}
537EXPORT_SYMBOL_GPL(wmi_remove_notify_handler); 575EXPORT_SYMBOL_GPL(wmi_remove_notify_handler);
@@ -780,6 +818,10 @@ static __init acpi_status parse_wdg(acpi_handle handle)
780 818
781 wblock->gblock = gblock[i]; 819 wblock->gblock = gblock[i];
782 wblock->handle = handle; 820 wblock->handle = handle;
821 if (debug_event) {
822 wblock->handler = wmi_notify_debug;
823 status = wmi_method_enable(wblock, 1);
824 }
783 list_add_tail(&wblock->list, &wmi_blocks.list); 825 list_add_tail(&wblock->list, &wmi_blocks.list);
784 } 826 }
785 827