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");
112 USBPORT_SuspendController(IN PDEVICE_OBJECT FdoDevice
)
114 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
115 PUSBPORT_REGISTRATION_PACKET Packet
;
117 DPRINT1("USBPORT_SuspendController \n");
119 FdoExtension
= FdoDevice
->DeviceExtension
;
120 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
122 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_RH_SUSPENDED
;
124 USBPORT_FlushController(FdoDevice
);
126 if (FdoExtension
->Flags
& USBPORT_FLAG_HC_SUSPEND
)
131 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_HC_SUSPENDED
;
133 if (FdoExtension
->MiniPortFlags
& USBPORT_MPFLAG_INTERRUPTS_ENABLED
)
135 FdoExtension
->MiniPortFlags
|= USBPORT_MPFLAG_SUSPENDED
;
137 USBPORT_Wait(FdoDevice
, 10);
138 Packet
->SuspendController(FdoExtension
->MiniPortExt
);
141 FdoExtension
->Flags
|= USBPORT_FLAG_HC_SUSPEND
;
146 USBPORT_ResumeController(IN PDEVICE_OBJECT FdoDevice
)
148 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
149 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
150 PUSBPORT_REGISTRATION_PACKET Packet
;
154 DPRINT1("USBPORT_ResumeController: ... \n");
156 FdoExtension
= FdoDevice
->DeviceExtension
;
157 Packet
= &FdoExtension
->MiniPortInterface
->Packet
;
159 if (!(FdoExtension
->Flags
& USBPORT_FLAG_HC_SUSPEND
))
164 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
166 FdoExtension
->TimerFlags
&= ~(USBPORT_TMFLAG_HC_SUSPENDED
|
167 USBPORT_TMFLAG_RH_SUSPENDED
);
169 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
171 if (!(FdoExtension
->MiniPortFlags
& USBPORT_MPFLAG_SUSPENDED
))
173 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
177 FdoExtension
->MiniPortFlags
&= ~USBPORT_MPFLAG_SUSPENDED
;
179 if (!Packet
->ResumeController(FdoExtension
->MiniPortExt
))
181 Status
= USBPORT_Wait(FdoDevice
, 100);
183 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
187 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
188 FdoExtension
->TimerFlags
|= (USBPORT_TMFLAG_HC_SUSPENDED
|
189 USBPORT_TMFLAG_HC_RESUME
);
190 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
192 USBPORT_MiniportInterrupts(FdoDevice
, FALSE
);
194 Packet
->StopController(FdoExtension
->MiniPortExt
, 1);
196 USBPORT_NukeAllEndpoints(FdoDevice
);
198 RtlZeroMemory(FdoExtension
->MiniPortExt
, Packet
->MiniPortExtensionSize
);
200 RtlZeroMemory(FdoExtension
->UsbPortResources
.StartVA
,
201 Packet
->MiniPortResourcesSize
);
203 FdoExtension
->UsbPortResources
.IsChirpHandled
= TRUE
;
205 MpStatus
= Packet
->StartController(FdoExtension
->MiniPortExt
,
206 &FdoExtension
->UsbPortResources
);
208 FdoExtension
->UsbPortResources
.IsChirpHandled
= FALSE
;
212 USBPORT_MiniportInterrupts(FdoDevice
, TRUE
);
215 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
217 FdoExtension
->TimerFlags
&= ~(USBPORT_TMFLAG_HC_SUSPENDED
|
218 USBPORT_TMFLAG_HC_RESUME
|
219 USBPORT_TMFLAG_RH_SUSPENDED
);
221 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
223 Status
= USBPORT_Wait(FdoDevice
, 100);
225 FdoExtension
->Flags
&= ~USBPORT_FLAG_HC_SUSPEND
;
232 USBPORT_PdoDevicePowerState(IN PDEVICE_OBJECT PdoDevice
,
235 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
236 PDEVICE_OBJECT FdoDevice
;
237 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
238 PIO_STACK_LOCATION IoStack
;
239 NTSTATUS Status
= STATUS_SUCCESS
;
242 PdoExtension
= PdoDevice
->DeviceExtension
;
243 FdoDevice
= PdoExtension
->FdoDevice
;
244 FdoExtension
= FdoDevice
->DeviceExtension
;
245 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
247 State
= IoStack
->Parameters
.Power
.State
;
249 DPRINT1("USBPORT_PdoDevicePowerState: Irp - %p, State - %x\n",
253 if (State
.DeviceState
== PowerDeviceD0
)
255 if (FdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
)
257 // FIXME FdoExtension->Flags
258 while (FdoExtension
->SetPowerLockCounter
)
260 USBPORT_Wait(FdoDevice
, 10);
263 USBPORT_ResumeController(FdoDevice
);
265 PdoExtension
->CommonExtension
.DevicePowerState
= PowerDeviceD0
;
267 USBPORT_CompletePdoWaitWake(FdoDevice
);
268 USBPORT_CompletePendingIdleIrp(PdoDevice
);
272 DPRINT1("USBPORT_PdoDevicePowerState: FdoExtension->Flags - %lx\n",
273 FdoExtension
->Flags
);
276 Status
= STATUS_UNSUCCESSFUL
;
279 else if (State
.DeviceState
== PowerDeviceD1
||
280 State
.DeviceState
== PowerDeviceD2
||
281 State
.DeviceState
== PowerDeviceD3
)
283 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_WAKE
;
284 USBPORT_SuspendController(FdoDevice
);
285 PdoExtension
->CommonExtension
.DevicePowerState
= State
.DeviceState
;
293 USBPORT_CancelPendingWakeIrp(IN PDEVICE_OBJECT PdoDevice
,
296 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
298 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
300 DPRINT("USBPORT_CancelPendingWakeIrp: ... \n");
302 IoReleaseCancelSpinLock(Irp
->CancelIrql
);
303 PdoExtension
= PdoDevice
->DeviceExtension
;
304 FdoExtension
= PdoExtension
->FdoDevice
->DeviceExtension
;
306 KeAcquireSpinLock(&FdoExtension
->PowerWakeSpinLock
, &OldIrql
);
308 if (PdoExtension
->WakeIrp
== Irp
)
310 PdoExtension
->WakeIrp
= NULL
;
313 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
315 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
316 Irp
->IoStatus
.Information
= 0;
317 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
322 USBPORT_PdoPower(IN PDEVICE_OBJECT PdoDevice
,
325 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
326 PDEVICE_OBJECT FdoDevice
;
327 PIO_STACK_LOCATION IoStack
;
328 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
332 DPRINT("USBPORT_PdoPower: Irp - %p\n", Irp
);
334 PdoExtension
= PdoDevice
->DeviceExtension
;
335 FdoDevice
= PdoExtension
->FdoDevice
;
336 FdoExtension
= FdoDevice
->DeviceExtension
;
337 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
339 Status
= Irp
->IoStatus
.Status
;
341 switch (IoStack
->MinorFunction
)
343 case IRP_MN_WAIT_WAKE
:
344 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE\n");
346 if (!(FdoExtension
->Flags
& USBPORT_FLAG_HC_STARTED
))
348 /* The device does not support wake-up */
349 Status
= STATUS_NOT_SUPPORTED
;
353 KeAcquireSpinLock(&FdoExtension
->PowerWakeSpinLock
, &OldIrql
);
355 IoSetCancelRoutine(Irp
, USBPORT_CancelPendingWakeIrp
);
357 /* Check if the IRP has been cancelled */
360 if (IoSetCancelRoutine(Irp
, NULL
))
362 /* IRP has been cancelled, release cancel spinlock */
363 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
365 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - STATUS_CANCELLED\n");
367 /* IRP is cancelled */
368 Status
= STATUS_CANCELLED
;
373 if (!PdoExtension
->WakeIrp
)
375 /* The driver received the IRP
376 and is waiting for the device to signal wake-up. */
378 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - No WakeIrp\n");
380 IoMarkIrpPending(Irp
);
381 PdoExtension
->WakeIrp
= Irp
;
383 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
384 return STATUS_PENDING
;
388 /* An IRP_MN_WAIT_WAKE request is already pending and must be
389 completed or canceled before another IRP_MN_WAIT_WAKE request
392 if (IoSetCancelRoutine(Irp
, NULL
))
394 DPRINT("USBPORT_PdoPower: IRP_MN_WAIT_WAKE - STATUS_DEVICE_BUSY\n");
396 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
397 PoStartNextPowerIrp(Irp
);
398 Status
= STATUS_DEVICE_BUSY
;
404 KeReleaseSpinLock(&FdoExtension
->PowerWakeSpinLock
, OldIrql
);
409 case IRP_MN_POWER_SEQUENCE
:
410 DPRINT("USBPORT_PdoPower: IRP_MN_POWER_SEQUENCE\n");
411 PoStartNextPowerIrp(Irp
);
414 case IRP_MN_SET_POWER
:
415 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER\n");
417 if (IoStack
->Parameters
.Power
.Type
== DevicePowerState
)
419 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER/DevicePowerState\n");
420 Status
= USBPORT_PdoDevicePowerState(PdoDevice
, Irp
);
421 PoStartNextPowerIrp(Irp
);
425 DPRINT("USBPORT_PdoPower: IRP_MN_SET_POWER/SystemPowerState \n");
427 if (IoStack
->Parameters
.Power
.State
.SystemState
== PowerSystemWorking
)
429 FdoExtension
->TimerFlags
|= USBPORT_TMFLAG_WAKE
;
433 FdoExtension
->TimerFlags
&= ~USBPORT_TMFLAG_WAKE
;
436 Status
= STATUS_SUCCESS
;
438 PoStartNextPowerIrp(Irp
);
441 case IRP_MN_QUERY_POWER
:
442 DPRINT("USBPORT_PdoPower: IRP_MN_QUERY_POWER\n");
443 Status
= STATUS_SUCCESS
;
444 PoStartNextPowerIrp(Irp
);
448 DPRINT1("USBPORT_PdoPower: unknown IRP_MN_POWER!\n");
449 PoStartNextPowerIrp(Irp
);
453 Irp
->IoStatus
.Status
= Status
;
454 Irp
->IoStatus
.Information
= 0;
455 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
462 USBPORT_HcWake(IN PDEVICE_OBJECT FdoDevice
,
465 DPRINT1("USBPORT_HcWake: UNIMPLEMENTED. FIXME. \n");
466 return STATUS_SUCCESS
;
471 USBPORT_DevicePowerState(IN PDEVICE_OBJECT FdoDevice
,
474 DPRINT1("USBPORT_DevicePowerState: UNIMPLEMENTED. FIXME. \n");
475 return STATUS_SUCCESS
;
480 USBPORT_SystemPowerState(IN PDEVICE_OBJECT FdoDevice
,
483 DPRINT1("USBPORT_SystemPowerState: UNIMPLEMENTED. FIXME. \n");
484 return STATUS_SUCCESS
;
489 USBPORT_FdoPower(IN PDEVICE_OBJECT FdoDevice
,
492 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
493 PIO_STACK_LOCATION IoStack
;
496 DPRINT("USBPORT_FdoPower: ... \n");
498 FdoExtension
= FdoDevice
->DeviceExtension
;
499 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
501 switch (IoStack
->MinorFunction
)
503 case IRP_MN_WAIT_WAKE
:
504 DPRINT("USBPORT_FdoPower: IRP_MN_WAIT_WAKE\n");
505 Status
= USBPORT_HcWake(FdoDevice
, Irp
);
508 case IRP_MN_POWER_SEQUENCE
:
509 DPRINT("USBPORT_FdoPower: IRP_MN_POWER_SEQUENCE\n");
512 case IRP_MN_SET_POWER
:
513 DPRINT("USBPORT_FdoPower: IRP_MN_SET_POWER\n");
514 if (IoStack
->Parameters
.Power
.Type
== DevicePowerState
)
516 Status
= USBPORT_DevicePowerState(FdoDevice
, Irp
);
520 Status
= USBPORT_SystemPowerState(FdoDevice
, Irp
);
523 if (Status
!= STATUS_PENDING
)
528 case IRP_MN_QUERY_POWER
:
529 DPRINT("USBPORT_FdoPower: IRP_MN_QUERY_POWER\n");
530 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
534 DPRINT1("USBPORT_FdoPower: unknown IRP_MN_POWER!\n");
538 IoCopyCurrentIrpStackLocationToNext(Irp
);
539 PoStartNextPowerIrp(Irp
);
540 return PoCallDriver(FdoExtension
->CommonExtension
.LowerDevice
, Irp
);
545 USBPORT_DoIdleNotificationCallback(IN PVOID Context
)
547 PIO_STACK_LOCATION IoStack
;
548 PDEVICE_OBJECT FdoDevice
;
549 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
550 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
552 LARGE_INTEGER CurrentTime
= {{0, 0}};
553 PTIMER_WORK_QUEUE_ITEM IdleQueueItem
;
554 PDEVICE_OBJECT PdoDevice
;
555 PUSB_IDLE_CALLBACK_INFO IdleCallbackInfo
;
558 DPRINT("USBPORT_DoIdleNotificationCallback \n");
560 IdleQueueItem
= Context
;
562 FdoDevice
= IdleQueueItem
->FdoDevice
;
563 FdoExtension
= FdoDevice
->DeviceExtension
;
564 PdoDevice
= FdoExtension
->RootHubPdo
;
565 PdoExtension
= PdoDevice
->DeviceExtension
;
567 KeQuerySystemTime(&CurrentTime
);
569 if ((FdoExtension
->IdleTime
.QuadPart
== 0) ||
570 (((CurrentTime
.QuadPart
- FdoExtension
->IdleTime
.QuadPart
) / 10000) >= 500))
572 if (PdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
&&
573 FdoExtension
->CommonExtension
.DevicePowerState
== PowerDeviceD0
)
575 NextIrp
= IoCsqRemoveNextIrp(&FdoExtension
->IdleIoCsq
, NULL
);
579 IoStack
= IoGetCurrentIrpStackLocation(NextIrp
);
580 IdleCallbackInfo
= IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
582 if (IdleCallbackInfo
&& IdleCallbackInfo
->IdleCallback
)
584 IdleCallbackInfo
->IdleCallback(IdleCallbackInfo
->IdleContext
);
589 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
591 NextIrp
->IoStatus
.Status
= STATUS_CANCELLED
;
592 NextIrp
->IoStatus
.Information
= 0;
593 IoCompleteRequest(NextIrp
, IO_NO_INCREMENT
);
597 IoCsqInsertIrp(&FdoExtension
->IdleIoCsq
, NextIrp
, NULL
);
603 KeAcquireSpinLock(&FdoExtension
->TimerFlagsSpinLock
, &OldIrql
);
604 FdoExtension
->TimerFlags
&= ~USBPORT_TMFLAG_IDLE_QUEUEITEM_ON
;
605 KeReleaseSpinLock(&FdoExtension
->TimerFlagsSpinLock
, OldIrql
);
607 ExFreePoolWithTag(IdleQueueItem
, USB_PORT_TAG
);
612 USBPORT_IdleNotification(IN PDEVICE_OBJECT PdoDevice
,
615 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
616 PDEVICE_OBJECT FdoDevice
;
617 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
619 NTSTATUS Status
= STATUS_PENDING
;
621 DPRINT("USBPORT_IdleNotification: Irp - %p\n", Irp
);
623 PdoExtension
= PdoDevice
->DeviceExtension
;
624 FdoDevice
= PdoExtension
->FdoDevice
;
625 FdoExtension
= FdoDevice
->DeviceExtension
;
627 LockCounter
= InterlockedIncrement(&FdoExtension
->IdleLockCounter
);
629 if (LockCounter
!= 0)
631 if (Status
!= STATUS_PENDING
)
633 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
635 Irp
->IoStatus
.Status
= Status
;
636 Irp
->IoStatus
.Information
= 0;
637 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
642 Status
= STATUS_DEVICE_BUSY
;
645 if (Status
!= STATUS_PENDING
)
647 InterlockedDecrement(&FdoExtension
->IdleLockCounter
);
649 Irp
->IoStatus
.Status
= Status
;
650 Irp
->IoStatus
.Information
= 0;
651 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
656 Irp
->IoStatus
.Status
= STATUS_PENDING
;
657 IoMarkIrpPending(Irp
);
659 KeQuerySystemTime(&FdoExtension
->IdleTime
);
661 IoCsqInsertIrp(&FdoExtension
->IdleIoCsq
, Irp
, 0);
668 USBPORT_AdjustDeviceCapabilities(IN PDEVICE_OBJECT FdoDevice
,
669 IN PDEVICE_OBJECT PdoDevice
)
671 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
672 PUSBPORT_RHDEVICE_EXTENSION PdoExtension
;
673 PDEVICE_CAPABILITIES Capabilities
;
675 DPRINT("USBPORT_AdjustDeviceCapabilities: ... \n");
677 FdoExtension
= FdoDevice
->DeviceExtension
;
678 PdoExtension
= PdoDevice
->DeviceExtension
;
679 Capabilities
= &PdoExtension
->Capabilities
;
681 RtlCopyMemory(Capabilities
,
682 &FdoExtension
->Capabilities
,
683 sizeof(DEVICE_CAPABILITIES
));
685 Capabilities
->DeviceD1
= FALSE
;
686 Capabilities
->DeviceD2
= TRUE
;
688 Capabilities
->Removable
= FALSE
;
689 Capabilities
->UniqueID
= FALSE
;
691 Capabilities
->WakeFromD0
= TRUE
;
692 Capabilities
->WakeFromD1
= FALSE
;
693 Capabilities
->WakeFromD2
= TRUE
;
694 Capabilities
->WakeFromD3
= FALSE
;
696 Capabilities
->Address
= 0;
697 Capabilities
->UINumber
= 0;
699 if (Capabilities
->SystemWake
== PowerSystemUnspecified
)
700 Capabilities
->SystemWake
= PowerSystemWorking
;
702 Capabilities
->DeviceWake
= PowerDeviceD2
;
704 Capabilities
->DeviceState
[PowerSystemSleeping1
] = PowerDeviceD3
;
705 Capabilities
->DeviceState
[PowerSystemSleeping2
] = PowerDeviceD3
;
706 Capabilities
->DeviceState
[PowerSystemSleeping3
] = PowerDeviceD3
;
707 Capabilities
->DeviceState
[PowerSystemHibernate
] = PowerDeviceD3
;