mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 22:56:00 +00:00
[ACPI]
- Implement IOCTL_GET_SYS_BUTTON_EVENT - Add the device event to the event list in a DPC instead of an ISR svn path=/trunk/; revision=46457
This commit is contained in:
parent
deac9bacde
commit
937d6233d7
2 changed files with 67 additions and 13 deletions
|
@ -58,6 +58,7 @@ KSPIN_LOCK acpi_bus_event_lock;
|
||||||
LIST_HEAD(acpi_bus_event_list);
|
LIST_HEAD(acpi_bus_event_list);
|
||||||
//DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue);
|
//DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue);
|
||||||
KEVENT AcpiEventQueue;
|
KEVENT AcpiEventQueue;
|
||||||
|
KDPC event_dpc;
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -455,6 +456,21 @@ acpi_bus_get_perf_flags (
|
||||||
Event Management
|
Event Management
|
||||||
-------------------------------------------------------------------------- */
|
-------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void
|
||||||
|
acpi_bus_generate_event_dpc(PKDPC Dpc,
|
||||||
|
PVOID DeferredContext,
|
||||||
|
PVOID SystemArgument1,
|
||||||
|
PVOID SystemArgument2)
|
||||||
|
{
|
||||||
|
struct acpi_bus_event *event = SystemArgument1;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
|
KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql);
|
||||||
|
list_add_tail(&event->node, &acpi_bus_event_list);
|
||||||
|
KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql);
|
||||||
|
|
||||||
|
KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
acpi_bus_generate_event (
|
acpi_bus_generate_event (
|
||||||
|
@ -463,10 +479,8 @@ acpi_bus_generate_event (
|
||||||
int data)
|
int data)
|
||||||
{
|
{
|
||||||
struct acpi_bus_event *event = NULL;
|
struct acpi_bus_event *event = NULL;
|
||||||
//unsigned long flags = 0;
|
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
DPRINT1("acpi_bus_generate_event");
|
DPRINT("acpi_bus_generate_event");
|
||||||
|
|
||||||
if (!device)
|
if (!device)
|
||||||
return_VALUE(AE_BAD_PARAMETER);
|
return_VALUE(AE_BAD_PARAMETER);
|
||||||
|
@ -484,14 +498,8 @@ acpi_bus_generate_event (
|
||||||
event->type = type;
|
event->type = type;
|
||||||
event->data = data;
|
event->data = data;
|
||||||
|
|
||||||
//spin_lock_irqsave(&acpi_bus_event_lock, flags);
|
if (!KeInsertQueueDpc(&event_dpc, event, NULL))
|
||||||
KeAcquireSpinLock(&acpi_bus_event_lock, &OldIrql);
|
ExFreePool(event);
|
||||||
list_add_tail(&event->node, &acpi_bus_event_list);
|
|
||||||
KeReleaseSpinLock(&acpi_bus_event_lock, OldIrql);
|
|
||||||
//spin_unlock_irqrestore(&acpi_bus_event_lock, flags);
|
|
||||||
|
|
||||||
KeSetEvent(&AcpiEventQueue, IO_NO_INCREMENT, FALSE);
|
|
||||||
//wake_up_interruptible(&acpi_bus_event_queue);
|
|
||||||
|
|
||||||
return_VALUE(0);
|
return_VALUE(0);
|
||||||
}
|
}
|
||||||
|
@ -506,7 +514,7 @@ acpi_bus_receive_event (
|
||||||
|
|
||||||
//DECLARE_WAITQUEUE(wait, current);
|
//DECLARE_WAITQUEUE(wait, current);
|
||||||
|
|
||||||
DPRINT1("acpi_bus_receive_event");
|
DPRINT("acpi_bus_receive_event");
|
||||||
|
|
||||||
if (!event)
|
if (!event)
|
||||||
return AE_BAD_PARAMETER;
|
return AE_BAD_PARAMETER;
|
||||||
|
@ -1153,9 +1161,11 @@ acpi_bus_add (
|
||||||
case ACPI_BUS_TYPE_SYSTEM:
|
case ACPI_BUS_TYPE_SYSTEM:
|
||||||
sprintf(device->pnp.bus_id, "%s", "ACPI");
|
sprintf(device->pnp.bus_id, "%s", "ACPI");
|
||||||
break;
|
break;
|
||||||
|
case ACPI_BUS_TYPE_POWER_BUTTONF:
|
||||||
case ACPI_BUS_TYPE_POWER_BUTTON:
|
case ACPI_BUS_TYPE_POWER_BUTTON:
|
||||||
sprintf(device->pnp.bus_id, "%s", "PWRF");
|
sprintf(device->pnp.bus_id, "%s", "PWRF");
|
||||||
break;
|
break;
|
||||||
|
case ACPI_BUS_TYPE_SLEEP_BUTTONF:
|
||||||
case ACPI_BUS_TYPE_SLEEP_BUTTON:
|
case ACPI_BUS_TYPE_SLEEP_BUTTON:
|
||||||
sprintf(device->pnp.bus_id, "%s", "SLPF");
|
sprintf(device->pnp.bus_id, "%s", "SLPF");
|
||||||
break;
|
break;
|
||||||
|
@ -1589,6 +1599,8 @@ acpi_bus_init (void)
|
||||||
|
|
||||||
DPRINT("acpi_bus_init");
|
DPRINT("acpi_bus_init");
|
||||||
|
|
||||||
|
KeInitializeDpc(&event_dpc, acpi_bus_generate_event_dpc, NULL);
|
||||||
|
|
||||||
status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
|
status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
DPRINT1("Unable to start the ACPI Interpreter\n");
|
DPRINT1("Unable to start the ACPI Interpreter\n");
|
||||||
|
|
|
@ -182,6 +182,40 @@ ACPIDispatchCreateClose(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
ButtonWaitThread(PVOID Context)
|
||||||
|
{
|
||||||
|
PIRP Irp = Context;
|
||||||
|
int result;
|
||||||
|
struct acpi_bus_event event;
|
||||||
|
ULONG ButtonEvent;
|
||||||
|
|
||||||
|
while (ACPI_SUCCESS(result = acpi_bus_receive_event(&event)) &&
|
||||||
|
event.type != ACPI_BUTTON_NOTIFY_STATUS);
|
||||||
|
|
||||||
|
if (!ACPI_SUCCESS(result))
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strstr(event.bus_id, "PWRF"))
|
||||||
|
ButtonEvent = SYS_BUTTON_POWER;
|
||||||
|
else if (strstr(event.bus_id, "SLPF"))
|
||||||
|
ButtonEvent = SYS_BUTTON_SLEEP;
|
||||||
|
else
|
||||||
|
ButtonEvent = 0;
|
||||||
|
|
||||||
|
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &ButtonEvent, sizeof(ButtonEvent));
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
Irp->IoStatus.Information = sizeof(ULONG);
|
||||||
|
}
|
||||||
|
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
ACPIDispatchDeviceControl(
|
ACPIDispatchDeviceControl(
|
||||||
|
@ -192,6 +226,7 @@ ACPIDispatchDeviceControl(
|
||||||
NTSTATUS status = STATUS_NOT_SUPPORTED;
|
NTSTATUS status = STATUS_NOT_SUPPORTED;
|
||||||
PCOMMON_DEVICE_DATA commonData;
|
PCOMMON_DEVICE_DATA commonData;
|
||||||
ULONG Caps = 0;
|
ULONG Caps = 0;
|
||||||
|
HANDLE ThreadHandle;
|
||||||
|
|
||||||
PAGED_CODE ();
|
PAGED_CODE ();
|
||||||
|
|
||||||
|
@ -264,7 +299,12 @@ ACPIDispatchDeviceControl(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* TODO: Implement other IOCTLs */
|
case IOCTL_GET_SYS_BUTTON_EVENT:
|
||||||
|
PsCreateSystemThread(&ThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, ButtonWaitThread, Irp);
|
||||||
|
ZwClose(ThreadHandle);
|
||||||
|
|
||||||
|
status = STATUS_PENDING;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINT1("Unsupported IOCTL: %x\n", irpStack->Parameters.DeviceIoControl.IoControlCode);
|
DPRINT1("Unsupported IOCTL: %x\n", irpStack->Parameters.DeviceIoControl.IoControlCode);
|
||||||
|
@ -279,6 +319,8 @@ ACPIDispatchDeviceControl(
|
||||||
Irp->IoStatus.Status = status;
|
Irp->IoStatus.Status = status;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
IoMarkIrpPending(Irp);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue