2009-04-03 17:06:16 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS Kernel Streaming
|
2009-09-11 06:33:55 +00:00
|
|
|
* FILE: drivers/wdm/audio/backpln/portcls/power.cpp
|
2009-04-03 17:06:16 +00:00
|
|
|
* PURPOSE: Power support functions
|
|
|
|
* PROGRAMMER: Johannes Anderwald
|
|
|
|
*/
|
2009-01-17 11:19:27 +00:00
|
|
|
|
2009-09-11 06:33:55 +00:00
|
|
|
#include "private.hpp"
|
2008-12-11 11:23:14 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
PcRegisterAdapterPowerManagement(
|
|
|
|
IN PUNKNOWN pUnknown,
|
|
|
|
IN PVOID pvContext)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
PDEVICE_OBJECT pDeviceObject;
|
2009-01-27 12:43:33 +00:00
|
|
|
PPCLASS_DEVICE_EXTENSION DeviceExt;
|
2008-12-11 11:23:14 +00:00
|
|
|
IAdapterPowerManagement * pPower;
|
|
|
|
|
2009-04-03 17:06:16 +00:00
|
|
|
DPRINT("PcRegisterAdapterPowerManagement pUnknown %p pvContext %p\n", pUnknown, pvContext);
|
2009-09-11 06:33:55 +00:00
|
|
|
PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
2009-01-17 11:19:27 +00:00
|
|
|
|
2008-12-11 11:23:14 +00:00
|
|
|
if (!pUnknown || !pvContext)
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
|
|
|
|
|
|
|
|
pDeviceObject = (PDEVICE_OBJECT)pvContext;
|
2009-01-27 12:43:33 +00:00
|
|
|
DeviceExt = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension;
|
2008-12-11 11:23:14 +00:00
|
|
|
|
2009-09-11 06:33:55 +00:00
|
|
|
Status = pUnknown->QueryInterface(IID_IAdapterPowerManagement, (PVOID*)&pPower);
|
2009-01-17 11:19:27 +00:00
|
|
|
if (!NT_SUCCESS(Status))
|
2008-12-11 11:23:14 +00:00
|
|
|
{
|
2009-10-19 18:54:01 +00:00
|
|
|
DPRINT("PcRegisterAdapterPowerManagement no IAdapterPowerManagement interface %x\n", Status);
|
2009-01-17 11:19:27 +00:00
|
|
|
DeviceExt->AdapterPowerManagement = NULL;
|
|
|
|
return STATUS_SUCCESS;
|
2008-12-11 11:23:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DeviceExt->AdapterPowerManagement = pPower;
|
2009-04-03 17:06:16 +00:00
|
|
|
DPRINT("PcRegisterAdapterPowerManagement success %x\n", Status);
|
2008-12-11 11:23:14 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
2009-01-12 18:37:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
static
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
PwrCompletionCallback(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN UCHAR MinorFunction,
|
|
|
|
IN POWER_STATE PowerState,
|
|
|
|
IN PVOID Context,
|
|
|
|
IN PIO_STATUS_BLOCK IoStatus)
|
|
|
|
{
|
|
|
|
KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
|
|
|
|
}
|
|
|
|
|
2009-09-11 06:33:55 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
2009-01-12 18:37:02 +00:00
|
|
|
PcRequestNewPowerState(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN DEVICE_POWER_STATE RequestedNewState)
|
|
|
|
{
|
|
|
|
KEVENT Event;
|
|
|
|
NTSTATUS Status;
|
|
|
|
POWER_STATE PowerState;
|
2009-01-27 12:43:33 +00:00
|
|
|
PPCLASS_DEVICE_EXTENSION DeviceExt;
|
2009-01-12 18:37:02 +00:00
|
|
|
|
2009-09-11 06:33:55 +00:00
|
|
|
PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
2009-04-23 19:06:36 +00:00
|
|
|
|
2009-01-12 18:37:02 +00:00
|
|
|
if (!DeviceObject || !RequestedNewState)
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
|
2009-01-27 12:43:33 +00:00
|
|
|
DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
2009-01-12 18:37:02 +00:00
|
|
|
KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
|
|
|
|
|
|
|
|
PowerState.DeviceState = RequestedNewState;
|
|
|
|
PowerState.SystemState = PowerSystemUnspecified;
|
|
|
|
|
|
|
|
Status = PoRequestPowerIrp(DeviceExt->PhysicalDeviceObject, IRP_MN_SET_POWER, PowerState, PwrCompletionCallback, (PVOID)&Event, NULL);
|
|
|
|
if (NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
KeWaitForSingleObject((PVOID)&Event, Executive, KernelMode, FALSE, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|