2 * PROJECT: ReactOS USB Port Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBPort power handling functions
5 * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
15 USBPORT_CompletePdoWaitWake(IN PDEVICE_OBJECT FdoDevice
)
17 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
18 PDEVICE_OBJECT PdoDevice
;
19 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
23 DPRINT("USBPORT_CompletePdoWaitWake: ... \n");
25 FdoExtension
= FdoDevice
->DeviceExtension
;
26 PdoDevice
= FdoExtension
->RootHubPdo
;
27 PdoExtension
= PdoDevice
->DeviceExtension
;
29 KeAcquireSpinLock(&FdoExtension
->PowerWakeSpinLock
, &OldIrql
);
31 Irp
= PdoExtension
->WakeIrp
;
33 if (Irp
&& IoSetCancelRoutine(Irp
, NULL
))
35 PdoExtension
->WakeIrp
= NULL
;
36 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
38 DPRINT("USBPORT_CompletePdoWaitWake: Complete Irp - %p\n", Irp
);
40 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
41 Irp
->IoStatus
.Information
= 0;
42 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
47 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
52 USBPORT_HcWakeDpc(IN PRKDPC Dpc
,
53 IN PVOID DeferredContext
,
54 IN PVOID SystemArgument1
,
55 IN PVOID SystemArgument2
)
57 DPRINT("USBPORT_HcWakeDpc: ... \n");
58 USBPORT_CompletePdoWaitWake((PDEVICE_OBJECT
)DeferredContext
);
63 USBPORT_HcQueueWakeDpc(IN PDEVICE_OBJECT FdoDevice
)
65 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
67 DPRINT("USBPORT_HcQueueWakeDpc: ... \n");
69 FdoExtension
= FdoDevice
->DeviceExtension
;
70 KeInsertQueueDpc(&FdoExtension
->HcWakeDpc
, NULL
, NULL
);
75 USBPORT_CompletePendingIdleIrp(IN PDEVICE_OBJECT PdoDevice
)
77 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
78 PDEVICE_OBJECT FdoDevice
;
79 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
82 DPRINT("USBPORT_CompletePendingIdleIrp: ... \n");
84 PdoExtension
= PdoDevice
->DeviceExtension
;
85 FdoDevice
= PdoExtension
->FdoDevice
;
86 FdoExtension
= FdoDevice
->DeviceExtension
;
88 Irp
= IoCsqRemoveNextIrp(&FdoExtension
->IdleIoCsq
, 0);
92 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
94 DPRINT("USBPORT_CompletePendingIdleIrp: Complete Irp - %p\n", Irp
);
96 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
97 Irp
->IoStatus
.Information
= 0;
98 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
104 USBPORT_DoSetPowerD0(IN PDEVICE_OBJECT FdoDevice
)
106 DPRINT("USBPORT_DoSetPowerD0: FIXME!\n");
114 USBPORT_SuspendController(IN PDEVICE_OBJECT FdoDevice
)
116 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
117 PUSBPORT_REGISTRATION_PACKET Packet
;
119 DPRINT1("USBPORT_SuspendController \n");
121 FdoExtension
= FdoDevice
->DeviceExtension
;
122 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
124 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_RH_SUSPENDED
;
126 USBPORT_FlushController(FdoDevice
);
128 if (FdoExtension
->Flags
& USBPORT_FLAG_HC_SUSPEND
)
133 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_HC_SUSPENDED
;
135 if (FdoExtension
->MiniPortFlags
& USBPORT_MPFLAG_INTERRUPTS_ENABLED
)
137 FdoExtension
->MiniPortFlags
|= USBPORT_MPFLAG_SUSPENDED
;
139 USBPORT_Wait(FdoDevice
, 10);
140 Packet
->SuspendController(FdoExtension
->MiniPortExt
);
143 FdoExtension
->Flags
|= USBPORT_FLAG_HC_SUSPEND
;
148 USBPORT_ResumeController(IN PDEVICE_OBJECT FdoDevice
)
150 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
151 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
152 PUSBPORT_REGISTRATION_PACKET Packet
;
156 DPRINT1("USBPORT_ResumeController: ... \n");
158 FdoExtension
= FdoDevice
->DeviceExtension
;
159 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
161 if (!(FdoExtension
->Flags
& USBPORT_FLAG_HC_SUSPEND
))
166 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
168 FdoExtension
->TimerFlags
&= ~(USBPORT_TMFLAG_HC_SUSPENDED
|
169 USBPORT_TMFLAG_RH_SUSPENDED
);
171 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
173 if (!(FdoExtension
->MiniPortFlags
& USBPORT_MPFLAG_SUSPENDED
))
175 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
179 FdoExtension
->MiniPortFlags
&= ~USBPORT_MPFLAG_SUSPENDED
;
181 if (!Packet
->ResumeController(FdoExtension
->MiniPortExt
))
183 Status
= USBPORT_Wait(FdoDevice
, 100);
185 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
189 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
190 FdoExtension
->TimerFlags
|= (USBPORT_TMFLAG_HC_SUSPENDED
|
191 USBPORT_TMFLAG_HC_RESUME
);
192 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
194 USBPORT_MiniportInterrupts(FdoDevice
, FALSE
);
196 Packet
->StopController(FdoExtension
->MiniPortExt
, 1);
198 USBPORT_NukeAllEndpoints(FdoDevice
);
200 RtlZeroMemory(FdoExtension
->MiniPortExt
, Packet
->MiniPortExtensionSize
);
202 RtlZeroMemory(FdoExtension
->UsbPortResources
.StartVA
,
203 Packet
->MiniPortResourcesSize
);
205 FdoExtension
->UsbPortResources
.IsChirpHandled
= TRUE
;
207 MpStatus
= Packet
->StartController(FdoExtension
->MiniPortExt
,
208 &FdoExtension
->UsbPortResources
);
210 FdoExtension
->UsbPortResources
.IsChirpHandled
= FALSE
;
214 USBPORT_MiniportInterrupts(FdoDevice
, TRUE
);
217 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
219 FdoExtension
->TimerFlags
&= ~(USBPORT_TMFLAG_HC_SUSPENDED
|
220 USBPORT_TMFLAG_HC_RESUME
|
221 USBPORT_TMFLAG_RH_SUSPENDED
);
223 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
225 Status
= USBPORT_Wait(FdoDevice
, 100);
227 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
234 USBPORT_PdoDevicePowerState(IN PDEVICE_OBJECT PdoDevice
,
237 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
238 PDEVICE_OBJECT FdoDevice
;
239 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
240 PIO_STACK_LOCATION IoStack
;
241 NTSTATUS Status
= STATUS_SUCCESS
;
244 PdoExtension
= PdoDevice
->DeviceExtension
;
245 FdoDevice
= PdoExtension
->FdoDevice
;
246 FdoExtension
= FdoDevice
->DeviceExtension
;
247 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
249 State
= IoStack
->Parameters
.Power
.State
;
251 DPRINT1("USBPORT_PdoDevicePowerState: Irp - %p, State - %x\n",
255 if (State
.DeviceState
== PowerDeviceD0
)
257 if (FdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
)
259 // FIXME FdoExtension->Flags
260 while (FdoExtension
->SetPowerLockCounter
)
262 USBPORT_Wait(FdoDevice
, 10);
265 USBPORT_ResumeController(FdoDevice
);
267 PdoExtension
->CommonExtension
.DevicePowerState
= PowerDeviceD0
;
269 USBPORT_CompletePdoWaitWake(FdoDevice
);
270 USBPORT_CompletePendingIdleIrp(PdoDevice
);
274 DPRINT1("USBPORT_PdoDevicePowerState: FdoExtension->Flags - %lx\n",
275 FdoExtension
->Flags
);
278 Status
= STATUS_UNSUCCESSFUL
;
281 else if (State
.DeviceState
== PowerDeviceD1
||
282 State
.DeviceState
== PowerDeviceD2
||
283 State
.DeviceState
== PowerDeviceD3
)
285 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_WAKE
;
286 USBPORT_SuspendController(FdoDevice
);
287 PdoExtension
->CommonExtension
.DevicePowerState
= State
.DeviceState
;
295 USBPORT_CancelPendingWakeIrp(IN PDEVICE_OBJECT PdoDevice
,
298 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
300 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
302 DPRINT("USBPORT_CancelPendingWakeIrp: ... \n");
304 IoReleaseCancelSpinLock(Irp
->CancelIrql
);
305 PdoExtension
= PdoDevice
->DeviceExtension
;
306 FdoExtension
= PdoExtension
->FdoDevice
->DeviceExtension
;
308 KeAcquireSpinLock(&FdoExtension
->PowerWakeSpinLock
, &OldIrql
);
310 if (PdoExtension
->WakeIrp
== Irp
)
312 PdoExtension
->WakeIrp
= NULL
;
315 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
317 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
318 Irp
->IoStatus
.Information
= 0;
319 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
324 USBPORT_PdoPower(IN PDEVICE_OBJECT PdoDevice
,
327 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
328 PDEVICE_OBJECT FdoDevice
;
329 PIO_STACK_LOCATION IoStack
;
330 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
334 DPRINT("USBPORT_PdoPower: Irp - %p\n", Irp
);
336 PdoExtension
= PdoDevice
->DeviceExtension
;
337 FdoDevice
= PdoExtension
->FdoDevice
;
338 FdoExtension
= FdoDevice
->DeviceExtension
;
339 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
341 Status
= Irp
->IoStatus
.Status
;
343 switch (IoStack
->MinorFunction
)
345 case IRP_MN_WAIT_WAKE
:
346 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE\n");
348 if (!(FdoExtension
->Flags
& USBPORT_FLAG_HC_STARTED
))
350 /* The device does not support wake-up */
351 Status
= STATUS_NOT_SUPPORTED
;
355 KeAcquireSpinLock(&FdoExtension
->PowerWakeSpinLock
, &OldIrql
);
357 IoSetCancelRoutine(Irp
, USBPORT_CancelPendingWakeIrp
);
359 /* Check if the IRP has been cancelled */
362 if (IoSetCancelRoutine(Irp
, NULL
))
364 /* IRP has been cancelled, release cancel spinlock */
365 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
367 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - STATUS_CANCELLED\n");
369 /* IRP is cancelled */
370 Status
= STATUS_CANCELLED
;
375 if (!PdoExtension
->WakeIrp
)
377 /* The driver received the IRP
378 and is waiting for the device to signal wake-up. */
380 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - No WakeIrp\n");
382 IoMarkIrpPending(Irp
);
383 PdoExtension
->WakeIrp
= Irp
;
385 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
386 return STATUS_PENDING
;
390 /* An IRP_MN_WAIT_WAKE request is already pending and must be
391 completed or canceled before another IRP_MN_WAIT_WAKE request
394 if (IoSetCancelRoutine(Irp
, NULL
))
396 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - STATUS_DEVICE_BUSY\n");
398 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
399 PoStartNextPowerIrp(Irp
);
400 Status
= STATUS_DEVICE_BUSY
;
406 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
411 case IRP_MN_POWER_SEQUENCE
:
412 DPRINT("USBPORT_PdoPower: IRP_MN_POWER_SEQUENCE\n");
413 PoStartNextPowerIrp(Irp
);
416 case IRP_MN_SET_POWER
:
417 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER\n");
419 if (IoStack
->Parameters
.Power
.Type
== DevicePowerState
)
421 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER/DevicePowerState\n");
422 Status
= USBPORT_PdoDevicePowerState(PdoDevice
, Irp
);
423 PoStartNextPowerIrp(Irp
);
427 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER/SystemPowerState \n");
429 if (IoStack
->Parameters
.Power
.State
.SystemState
== PowerSystemWorking
)
431 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_WAKE
;
435 FdoExtension
->TimerFlags
&= ~USBPORT_TMFLAG_WAKE
;
438 Status
= STATUS_SUCCESS
;
440 PoStartNextPowerIrp(Irp
);
443 case IRP_MN_QUERY_POWER
:
444 DPRINT("USBPORT_PdoPower: IRP_MN_QUERY_POWER\n");
445 Status
= STATUS_SUCCESS
;
446 PoStartNextPowerIrp(Irp
);
450 DPRINT1("USBPORT_PdoPower: unknown IRP_MN_POWER!\n");
451 PoStartNextPowerIrp(Irp
);
455 Irp
->IoStatus
.Status
= Status
;
456 Irp
->IoStatus
.Information
= 0;
457 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
464 USBPORT_HcWake(IN PDEVICE_OBJECT FdoDevice
,
467 DPRINT1("USBPORT_HcWake: UNIMPLEMENTED. FIXME. \n");
468 return STATUS_SUCCESS
;
473 USBPORT_DevicePowerState(IN PDEVICE_OBJECT FdoDevice
,
476 DPRINT1("USBPORT_DevicePowerState: UNIMPLEMENTED. FIXME. \n");
477 return STATUS_SUCCESS
;
482 USBPORT_SystemPowerState(IN PDEVICE_OBJECT FdoDevice
,
485 DPRINT1("USBPORT_SystemPowerState: UNIMPLEMENTED. FIXME. \n");
486 return STATUS_SUCCESS
;
491 USBPORT_FdoPower(IN PDEVICE_OBJECT FdoDevice
,
494 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
495 PIO_STACK_LOCATION IoStack
;
498 DPRINT("USBPORT_FdoPower: ... \n");
500 FdoExtension
= FdoDevice
->DeviceExtension
;
501 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
503 switch (IoStack
->MinorFunction
)
505 case IRP_MN_WAIT_WAKE
:
506 DPRINT("USBPORT_FdoPower: IRP_MN_WAIT_WAKE\n");
507 Status
= USBPORT_HcWake(FdoDevice
, Irp
);
510 case IRP_MN_POWER_SEQUENCE
:
511 DPRINT("USBPORT_FdoPower: IRP_MN_POWER_SEQUENCE\n");
514 case IRP_MN_SET_POWER
:
515 DPRINT("USBPORT_FdoPower: IRP_MN_SET_POWER\n");
516 if (IoStack
->Parameters
.Power
.Type
== DevicePowerState
)
518 Status
= USBPORT_DevicePowerState(FdoDevice
, Irp
);
522 Status
= USBPORT_SystemPowerState(FdoDevice
, Irp
);
525 if (Status
!= STATUS_PENDING
)
530 case IRP_MN_QUERY_POWER
:
531 DPRINT("USBPORT_FdoPower: IRP_MN_QUERY_POWER\n");
532 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
536 DPRINT1("USBPORT_FdoPower: unknown IRP_MN_POWER!\n");
540 IoCopyCurrentIrpStackLocationToNext(Irp
);
541 PoStartNextPowerIrp(Irp
);
542 return PoCallDriver(FdoExtension
->CommonExtension
.LowerDevice
, Irp
);
547 USBPORT_DoIdleNotificationCallback(IN PVOID Context
)
549 PIO_STACK_LOCATION IoStack
;
550 PDEVICE_OBJECT FdoDevice
;
551 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
552 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
554 LARGE_INTEGER CurrentTime
= {{0, 0}};
555 PTIMER_WORK_QUEUE_ITEM IdleQueueItem
;
556 PDEVICE_OBJECT PdoDevice
;
557 PUSB_IDLE_CALLBACK_INFO IdleCallbackInfo
;
560 DPRINT("USBPORT_DoIdleNotificationCallback \n");
562 IdleQueueItem
= Context
;
564 FdoDevice
= IdleQueueItem
->FdoDevice
;
565 FdoExtension
= FdoDevice
->DeviceExtension
;
566 PdoDevice
= FdoExtension
->RootHubPdo
;
567 PdoExtension
= PdoDevice
->DeviceExtension
;
569 KeQuerySystemTime(&CurrentTime
);
571 if ((FdoExtension
->IdleTime
.QuadPart
== 0) ||
572 (((CurrentTime
.QuadPart
- FdoExtension
->IdleTime
.QuadPart
) / 10000) >= 500))
574 if (PdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
&&
575 FdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
)
577 NextIrp
= IoCsqRemoveNextIrp(&FdoExtension
->IdleIoCsq
, NULL
);
581 IoStack
= IoGetCurrentIrpStackLocation(NextIrp
);
582 IdleCallbackInfo
= IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
584 if (IdleCallbackInfo
&& IdleCallbackInfo
->IdleCallback
)
586 IdleCallbackInfo
->IdleCallback(IdleCallbackInfo
->IdleContext
);
591 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
593 NextIrp
->IoStatus
.Status
= STATUS_CANCELLED
;
594 NextIrp
->IoStatus
.Information
= 0;
595 IoCompleteRequest(NextIrp
, IO_NO_INCREMENT
);
599 IoCsqInsertIrp(&FdoExtension
->IdleIoCsq
, NextIrp
, NULL
);
605 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
606 FdoExtension
->TimerFlags
&= ~USBPORT_TMFLAG_IDLE_QUEUEITEM_ON
;
607 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
609 ExFreePoolWithTag(IdleQueueItem
, USB_PORT_TAG
);
614 USBPORT_IdleNotification(IN PDEVICE_OBJECT PdoDevice
,
617 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
618 PDEVICE_OBJECT FdoDevice
;
619 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
621 NTSTATUS Status
= STATUS_PENDING
;
623 DPRINT("USBPORT_IdleNotification: Irp - %p\n", Irp
);
625 PdoExtension
= PdoDevice
->DeviceExtension
;
626 FdoDevice
= PdoExtension
->FdoDevice
;
627 FdoExtension
= FdoDevice
->DeviceExtension
;
629 LockCounter
= InterlockedIncrement(&FdoExtension
->IdleLockCounter
);
631 if (LockCounter
!= 0)
633 if (Status
!= STATUS_PENDING
)
635 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
637 Irp
->IoStatus
.Status
= Status
;
638 Irp
->IoStatus
.Information
= 0;
639 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
644 Status
= STATUS_DEVICE_BUSY
;
647 if (Status
!= STATUS_PENDING
)
649 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
651 Irp
->IoStatus
.Status
= Status
;
652 Irp
->IoStatus
.Information
= 0;
653 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
658 Irp
->IoStatus
.Status
= STATUS_PENDING
;
659 IoMarkIrpPending(Irp
);
661 KeQuerySystemTime(&FdoExtension
->IdleTime
);
663 IoCsqInsertIrp(&FdoExtension
->IdleIoCsq
, Irp
, 0);
670 USBPORT_AdjustDeviceCapabilities(IN PDEVICE_OBJECT FdoDevice
,
671 IN PDEVICE_OBJECT PdoDevice
)
673 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
674 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
675 PDEVICE_CAPABILITIES Capabilities
;
677 DPRINT("USBPORT_AdjustDeviceCapabilities: ... \n");
679 FdoExtension
= FdoDevice
->DeviceExtension
;
680 PdoExtension
= PdoDevice
->DeviceExtension
;
681 Capabilities
= &PdoExtension
->Capabilities
;
683 RtlCopyMemory(Capabilities
,
684 &FdoExtension
->Capabilities
,
685 sizeof(DEVICE_CAPABILITIES
));
687 Capabilities
->DeviceD1
= FALSE
;
688 Capabilities
->DeviceD2
= TRUE
;
690 Capabilities
->Removable
= FALSE
;
691 Capabilities
->UniqueID
= FALSE
;
693 Capabilities
->WakeFromD0
= TRUE
;
694 Capabilities
->WakeFromD1
= FALSE
;
695 Capabilities
->WakeFromD2
= TRUE
;
696 Capabilities
->WakeFromD3
= FALSE
;
698 Capabilities
->Address
= 0;
699 Capabilities
->UINumber
= 0;
701 if (Capabilities
->SystemWake
== PowerSystemUnspecified
)
702 Capabilities
->SystemWake
= PowerSystemWorking
;
704 Capabilities
->DeviceWake
= PowerDeviceD2
;
706 Capabilities
->DeviceState
[PowerSystemSleeping1
] = PowerDeviceD3
;
707 Capabilities
->DeviceState
[PowerSystemSleeping2
] = PowerDeviceD3
;
708 Capabilities
->DeviceState
[PowerSystemSleeping3
] = PowerDeviceD3
;
709 Capabilities
->DeviceState
[PowerSystemHibernate
] = PowerDeviceD3
;