ReactOS 0.4.16-dev-2284-g3529151
power.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Hub Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBHub power handling functions
5 * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
6 */
7
8#include "usbhub.h"
9
10#define NDEBUG
11#include <debug.h>
12
13#define NDEBUG_USBHUB_POWER
14#include "dbg_uhub.h"
15
16VOID
19 IN PIRP Irp,
20 IN NTSTATUS NtStatus)
21{
22 DPRINT("USBH_CompletePowerIrp: HubExtension - %p, Irp - %p, NtStatus - %lX\n",
23 HubExtension,
24 Irp,
25 NtStatus);
26
27 Irp->IoStatus.Status = NtStatus;
28
30
31 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
32 {
33 KeSetEvent(&HubExtension->PendingRequestEvent,
35 FALSE);
36 }
37
39}
40
41VOID
44 IN PIRP Irp)
45{
46 DPRINT("USBH_HubCancelWakeIrp: HubExtension - %p, Irp - %p\n",
47 HubExtension,
48 Irp);
49
51
52 if (InterlockedExchange((PLONG)&HubExtension->FdoWaitWakeLock, 1))
53 {
55 Irp->IoStatus.Status = STATUS_CANCELLED;
57 }
58}
59
60VOID
67{
68 DPRINT("USBH_HubESDRecoverySetD3Completion ... \n");
69
72 FALSE);
73}
74
75VOID
82{
84
85 DPRINT("USBH_HubESDRecoverySetD0Completion: HubExtension - %p\n", HubExtension);
86
87 if (HubExtension && NT_SUCCESS(IoStatus->Status))
88 {
89 /* Clear the ESD recovery flag after successful power cycle */
90 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
91 DPRINT("USBH_HubESDRecoverySetD0Completion: ESD recovery completed\n");
92 }
93 else if (HubExtension)
94 {
95 /* If D0 transition failed, clear the flag anyway to allow retry */
96 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
97 DPRINT1("USBH_HubESDRecoverySetD0Completion: ESD recovery failed with status 0x%08lx\n",
98 IoStatus->Status);
99 }
100}
101
103NTAPI
105{
106 PUSBHUB_FDO_EXTENSION RootHubDevExt;
110
111 DPRINT("USBH_HubSetD0: HubExtension - %p\n", HubExtension);
112
113 RootHubDevExt = USBH_GetRootHubExtension(HubExtension);
114
115 if (RootHubDevExt->SystemPowerState.SystemState != PowerSystemWorking)
116 {
118 return Status;
119 }
120
121 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST)
122 {
123 DPRINT("USBH_HubSetD0: HubFlags - %lX\n", HubExtension->HubFlags);
124
125 KeWaitForSingleObject(&HubExtension->IdleEvent,
126 Suspended,
128 FALSE,
129 NULL);
130 }
131
133
134 PowerState.DeviceState = PowerDeviceD0;
135
136 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
140 &Event,
141 NULL);
142
143 if (Status == STATUS_PENDING)
144 {
146 Suspended,
148 FALSE,
149 NULL);
150 }
151
152 while (HubExtension->HubFlags & USBHUB_FDO_FLAG_WAKEUP_START)
153 {
154 USBH_Wait(10);
155 }
156
157 return Status;
158}
159
161NTAPI
163{
164 PUSBHUB_FDO_EXTENSION RootHubDevExt;
168
169 DPRINT("USBH_HubStartESDRecovery: HubExtension - %p\n", HubExtension);
170
171 RootHubDevExt = USBH_GetRootHubExtension(HubExtension);
172
173 if (RootHubDevExt->SystemPowerState.SystemState != PowerSystemWorking)
174 {
176 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
177 return Status;
178 }
179
181
182 /* First, set the hub to D3 (power off) */
183 PowerState.DeviceState = PowerDeviceD3;
184
185 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
189 &Event,
190 NULL);
191 if (Status == STATUS_PENDING)
192 {
194 Suspended,
196 FALSE,
197 NULL);
198 }
199 if (!NT_SUCCESS(Status))
200 {
201 DPRINT1("USBH_HubStartESDRecovery: Failed to set D3, Status - %lX\n", Status);
202 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
203 return Status;
204 }
205
206 /* Now set it back to D0 (power on) to complete the recovery */
207 PowerState.DeviceState = PowerDeviceD0;
208
209 Status = PoRequestPowerIrp(HubExtension->LowerPDO,
213 HubExtension,
214 NULL);
216 {
217 DPRINT1("USBH_HubStartESDRecovery: Failed to set D0, Status - %lX\n", Status);
218 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
219 }
220
221 return Status;
222}
223
224VOID
225NTAPI
228{
229 PUSBHUB_IDLE_PORT_CANCEL_CONTEXT WorkItemIdlePower;
230 PIRP Irp;
231
232 DPRINT("USBH_IdleCancelPowerHubWorker: ... \n");
233
234 WorkItemIdlePower = Context;
235
236 if (HubExtension &&
237 HubExtension->CurrentPowerState.DeviceState != PowerDeviceD0 &&
238 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
239 {
240 USBH_HubSetD0(HubExtension);
241 }
242
243 Irp = WorkItemIdlePower->Irp;
245
247}
248
249VOID
250NTAPI
252 IN PLIST_ENTRY ListIrps)
253{
254 PDEVICE_OBJECT PortDevice;
255 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
256 USHORT NumPorts;
257 USHORT Port;
258 PIRP WakeIrp;
260
261 DPRINT("USBH_HubQueuePortWakeIrps ... \n");
262
263 NumPorts = HubExtension->HubDescriptor->bNumberOfPorts;
264
265 InitializeListHead(ListIrps);
266
268
269 for (Port = 0; Port < NumPorts; ++Port)
270 {
271 PortDevice = HubExtension->PortData[Port].DeviceObject;
272
273 if (PortDevice)
274 {
275 PortExtension = PortDevice->DeviceExtension;
276
277 WakeIrp = PortExtension->PdoWaitWakeIrp;
278 PortExtension->PdoWaitWakeIrp = NULL;
279
280 if (WakeIrp)
281 {
282 DPRINT1("USBH_HubQueuePortWakeIrps: UNIMPLEMENTED. FIXME\n");
284 }
285 }
286 }
287
289}
290
291VOID
292NTAPI
294 IN PLIST_ENTRY ListIrps,
295 IN NTSTATUS NtStatus)
296{
297 DPRINT("USBH_HubCompleteQueuedPortWakeIrps ... \n");
298
299 while (!IsListEmpty(ListIrps))
300 {
301 DPRINT1("USBH_HubCompleteQueuedPortWakeIrps: UNIMPLEMENTED. FIXME\n");
303 }
304}
305
306VOID
307NTAPI
309 IN NTSTATUS NtStatus)
310{
311 LIST_ENTRY ListIrps;
312
313 DPRINT("USBH_HubCompletePortWakeIrps: NtStatus - %x\n", NtStatus);
314
315 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
316 {
317 USBH_HubQueuePortWakeIrps(HubExtension, &ListIrps);
318
320 &ListIrps,
321 NtStatus);
322 }
323}
324
325VOID
326NTAPI
332{
333 PUSBHUB_FDO_EXTENSION HubExtension;
334
335 DPRINT("USBH_FdoPoRequestD0Completion ... \n");
336
337 HubExtension = Context;
338
340
341 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_WAKEUP_START;
342
343 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
344 {
345 KeSetEvent(&HubExtension->PendingRequestEvent,
347 FALSE);
348 }
349}
350
351VOID
352NTAPI
355{
356 DPRINT1("USBH_CompletePortWakeIrpsWorker: UNIMPLEMENTED. FIXME\n");
358}
359
361NTAPI
363 IN PIRP Irp,
365{
366 PUSBHUB_FDO_EXTENSION HubExtension;
370 PIRP WakeIrp;
371
372 DPRINT("USBH_FdoWWIrpIoCompletion: DeviceObject - %p, Irp - %p\n",
374 Irp);
375
376 HubExtension = Context;
377
378 Status = Irp->IoStatus.Status;
379
381
382 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
383
384 WakeIrp = InterlockedExchangePointer((PVOID *)&HubExtension->PendingWakeIrp,
385 NULL);
386
387 if (!InterlockedDecrement(&HubExtension->PendingRequestCount))
388 {
389 KeSetEvent(&HubExtension->PendingRequestEvent,
391 FALSE);
392 }
393
395
396 DPRINT("USBH_FdoWWIrpIoCompletion: Status - %lX\n", Status);
397
398 if (!NT_SUCCESS(Status))
399 {
400 DPRINT1("USBH_FdoWWIrpIoCompletion: DbgBreakPoint() \n");
402 }
403 else
404 {
405 PowerState.DeviceState = PowerDeviceD0;
406
407 HubExtension->HubFlags |= USBHUB_FDO_FLAG_WAKEUP_START;
409
411
412 PoRequestPowerIrp(HubExtension->LowerPDO,
416 (PVOID)HubExtension,
417 NULL);
418 }
419
420 if (!WakeIrp)
421 {
422 if (!InterlockedExchange(&HubExtension->FdoWaitWakeLock, 1))
423 {
425 }
426 }
427
428 DPRINT("USBH_FdoWWIrpIoCompletion: Status - %lX\n", Status);
429
431 {
433 }
434
435 return Status;
436}
437
439NTAPI
441 IN PIRP Irp,
443{
444 PUSBHUB_FDO_EXTENSION HubExtension;
445 PIO_STACK_LOCATION IoStack;
446 DEVICE_POWER_STATE OldDeviceState;
449
450 DPRINT("USBH_PowerIrpCompletion: DeviceObject - %p, Irp - %p\n",
452 Irp);
453
454 HubExtension = Context;
455
457 PowerState = IoStack->Parameters.Power.State;
458
459 Status = Irp->IoStatus.Status;
460 DPRINT("USBH_PowerIrpCompletion: Status - %lX\n", Status);
461
462 if (!NT_SUCCESS(Status))
463 {
464 if (PowerState.DeviceState == PowerDeviceD0)
465 {
467 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_SET_D0_STATE;
468 }
469 }
470 else if (PowerState.DeviceState == PowerDeviceD0)
471 {
472 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_SET_D0_STATE;
473
474 OldDeviceState = HubExtension->CurrentPowerState.DeviceState;
476
477 DPRINT("USBH_PowerIrpCompletion: OldDeviceState - %x\n", OldDeviceState);
478
479 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_HIBERNATE_STATE)
480 {
481 DPRINT1("USBH_PowerIrpCompletion: USBHUB_FDO_FLAG_HIBERNATE_STATE. FIXME\n");
483 }
484
485 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_HIBERNATE_STATE;
486
487 if (OldDeviceState == PowerDeviceD3)
488 {
489 DPRINT1("USBH_PowerIrpCompletion: PowerDeviceD3. FIXME\n");
491 }
492
493 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED) &&
495 {
497 }
498
499 DPRINT("USBH_PowerIrpCompletion: Status - %lX\n", Status);
500
502 {
504 return Status;
505 }
506 }
507
508 return Status;
509}
510
511VOID
512NTAPI
518{
520 PUSBHUB_FDO_EXTENSION HubExtension = NULL;
521 PIRP PowerIrp;
522 PIO_STACK_LOCATION IoStack;
523
524 DPRINT("USBH_FdoDeferPoRequestCompletion ... \n");
525
527
528 PowerIrp = Extension->PowerIrp;
529
530 if (Extension->Common.ExtensionType == USBH_EXTENSION_TYPE_HUB)
531 {
532 HubExtension = Context;
533 }
534
535 IoStack = IoGetCurrentIrpStackLocation(PowerIrp);
536
537 if (IoStack->Parameters.Power.State.SystemState == PowerSystemWorking &&
538 HubExtension && HubExtension->LowerPDO == HubExtension->RootHubPdo)
539 {
541 USBH_CheckIdleDeferred(HubExtension);
542 }
543
545 PoStartNextPowerIrp(PowerIrp);
546 PoCallDriver(Extension->LowerDevice, PowerIrp);
547}
548
550NTAPI
552 IN PIRP Irp,
553 IN UCHAR Minor)
554{
556 PIO_STACK_LOCATION IoStack;
558 POWER_STATE DevicePwrState;
559 BOOLEAN IsAllPortsD3;
560 PUSBHUB_PORT_DATA PortData;
561 PDEVICE_OBJECT PdoDevice;
562 PUSBHUB_PORT_PDO_EXTENSION PortExtension;
563 ULONG Port;
564
565 DPRINT_PWR("USBH_FdoPower: HubExtension - %p, Irp - %p, Minor - %X\n",
566 HubExtension,
567 Irp,
568 Minor);
569
570 switch (Minor)
571 {
572 case IRP_MN_WAIT_WAKE:
573 DPRINT_PWR("USBH_FdoPower: IRP_MN_WAIT_WAKE\n");
574
576
579 HubExtension,
580 TRUE,
581 TRUE,
582 TRUE);
583
586 PoCallDriver(HubExtension->LowerDevice, Irp);
587
588 return STATUS_PENDING;
589
591 DPRINT_PWR("USBH_FdoPower: IRP_MN_POWER_SEQUENCE\n");
592 break;
593
594 case IRP_MN_SET_POWER:
595 DPRINT_PWR("USBH_FdoPower: IRP_MN_SET_POWER\n");
596
598 DPRINT_PWR("USBH_FdoPower: IRP_MN_SET_POWER/DevicePowerState\n");
599 PowerState = IoStack->Parameters.Power.State;
600
601 if (IoStack->Parameters.Power.Type == DevicePowerState)
602 {
603 DPRINT_PWR("USBH_FdoPower: PowerState - %x\n",
604 PowerState.DeviceState);
605
606 if (HubExtension->CurrentPowerState.DeviceState == PowerState.DeviceState)
607 {
609
612 PoCallDriver(HubExtension->LowerDevice, Irp);
613
614 return STATUS_PENDING;
615 }
616
617 switch (PowerState.DeviceState)
618 {
619 case PowerDeviceD0:
620 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_SET_D0_STATE))
621 {
622 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_NOT_D0_STATE |
624
625 HubExtension->HubFlags |= USBHUB_FDO_FLAG_SET_D0_STATE;
626
628
631 HubExtension,
632 TRUE,
633 TRUE,
634 TRUE);
635 }
636 else
637 {
640 }
641
643 PoCallDriver(HubExtension->LowerDevice, Irp);
644 return STATUS_PENDING;
645
646 case PowerDeviceD1:
647 case PowerDeviceD2:
648 case PowerDeviceD3:
649 if (HubExtension->ResetRequestCount)
650 {
651 IoCancelIrp(HubExtension->ResetPortIrp);
652
653 KeWaitForSingleObject(&HubExtension->ResetEvent,
654 Executive,
656 FALSE,
657 NULL);
658 }
659
660 if (!(HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STOPPED))
661 {
662 HubExtension->HubFlags |= (USBHUB_FDO_FLAG_NOT_D0_STATE |
664
665 IoCancelIrp(HubExtension->SCEIrp);
666
667 KeWaitForSingleObject(&HubExtension->StatusChangeEvent,
668 Executive,
670 FALSE,
671 NULL);
672 }
673
674 HubExtension->CurrentPowerState.DeviceState = PowerState.DeviceState;
675
676 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DO_SUSPENSE &&
677 USBH_CheckIdleAbort(HubExtension, TRUE, TRUE) == TRUE)
678 {
679 HubExtension->HubFlags &= ~(USBHUB_FDO_FLAG_NOT_D0_STATE |
681
682 HubExtension->CurrentPowerState.DeviceState = PowerDeviceD0;
683
685
687
688 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
690
691 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
692
693 KeReleaseSemaphore(&HubExtension->IdleSemaphore,
695 1,
696 FALSE);
697
698 return STATUS_UNSUCCESSFUL;
699 }
700
702
705 HubExtension,
706 TRUE,
707 TRUE,
708 TRUE);
709
712 PoCallDriver(HubExtension->LowerDevice, Irp);
713
714 if (HubExtension->HubFlags & USBHUB_FDO_FLAG_DO_SUSPENSE)
715 {
716 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
717
718 KeReleaseSemaphore(&HubExtension->IdleSemaphore,
720 1,
721 FALSE);
722 }
723
724 return STATUS_PENDING;
725
726 default:
727 DPRINT1("USBH_FdoPower: Unsupported PowerState.DeviceState\n");
729 break;
730 }
731 }
732 else
733 {
734 if (PowerState.SystemState != PowerSystemWorking)
735 {
737 PowerState.SystemState;
738 }
739
740 if (PowerState.SystemState == PowerSystemHibernate)
741 {
742 HubExtension->HubFlags |= USBHUB_FDO_FLAG_HIBERNATE_STATE;
743 }
744
745 PortData = HubExtension->PortData;
746
747 IsAllPortsD3 = TRUE;
748
749 if (PortData && HubExtension->HubDescriptor)
750 {
751 for (Port = 0;
752 Port < HubExtension->HubDescriptor->bNumberOfPorts;
753 Port++)
754 {
755 PdoDevice = PortData[Port].DeviceObject;
756
757 if (PdoDevice)
758 {
759 PortExtension = PdoDevice->DeviceExtension;
760
761 if (PortExtension->CurrentPowerState.DeviceState != PowerDeviceD3)
762 {
763 IsAllPortsD3 = FALSE;
764 break;
765 }
766 }
767 }
768 }
769
770 if (PowerState.SystemState == PowerSystemWorking)
771 {
772 DevicePwrState.DeviceState = PowerDeviceD0;
773 }
774 else if (HubExtension->HubFlags & USBHUB_FDO_FLAG_PENDING_WAKE_IRP ||
775 !IsAllPortsD3)
776 {
777 DevicePwrState.DeviceState = HubExtension->DeviceState[PowerState.SystemState];
778
779 if (DevicePwrState.DeviceState == PowerDeviceUnspecified)
780 {
781 goto Exit;
782 }
783 }
784 else
785 {
786 DevicePwrState.DeviceState = PowerDeviceD3;
787 }
788
789 if (DevicePwrState.DeviceState != HubExtension->CurrentPowerState.DeviceState &&
790 HubExtension->HubFlags & USBHUB_FDO_FLAG_DEVICE_STARTED)
791 {
792 HubExtension->PowerIrp = Irp;
793
795
796 if (PoRequestPowerIrp(HubExtension->LowerPDO,
798 DevicePwrState,
800 (PVOID)HubExtension,
802 {
803 return STATUS_PENDING;
804 }
805
808 PoCallDriver(HubExtension->LowerDevice, Irp);
809
810 return STATUS_PENDING;
811 }
812
813 Exit:
814
815 HubExtension->SystemPowerState.SystemState = PowerState.SystemState;
816
817 if (PowerState.SystemState == PowerSystemWorking)
818 {
819 USBH_CheckIdleDeferred(HubExtension);
820 }
821
824
825 return PoCallDriver(HubExtension->LowerDevice, Irp);
826 }
827
828 break;
829
831 DPRINT_PWR("USBH_FdoPower: IRP_MN_QUERY_POWER\n");
832 break;
833
834 default:
835 DPRINT1("USBH_FdoPower: unknown IRP_MN_POWER!\n");
836 break;
837 }
838
841 Status = PoCallDriver(HubExtension->LowerDevice, Irp);
842
843 return Status;
844}
845
847NTAPI
849 IN PIRP Irp,
850 IN UCHAR Minor)
851{
852 NTSTATUS Status = Irp->IoStatus.Status;
853
854 DPRINT_PWR("USBH_FdoPower: PortExtension - %p, Irp - %p, Minor - %X\n",
855 PortExtension,
856 Irp,
857 Minor);
858
859 switch (Minor)
860 {
861 case IRP_MN_WAIT_WAKE:
862 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_WAIT_WAKE\n");
864 break;
865
867 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_POWER_SEQUENCE\n");
869 break;
870
871 case IRP_MN_SET_POWER:
872 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_SET_POWER\n");
874 break;
875
877 DPRINT_PWR("USBHUB_PdoPower: IRP_MN_QUERY_POWER\n");
879 break;
880
881 default:
882 DPRINT1("USBHUB_PdoPower: unknown IRP_MN_POWER!\n");
884 break;
885 }
886
887 Irp->IoStatus.Status = Status;
888 Irp->IoStatus.Information = 0;
890
891 return Status;
892}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedExchange
Definition: armddk.h:54
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
_In_ PIRP Irp
Definition: csq.h:116
#define DPRINT_PWR(...)
Definition: dbg_uhub.h:108
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
VOID NTAPI USBH_HubCancelWakeIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
Definition: power.c:43
NTSTATUS NTAPI USBH_HubSetD0(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:104
VOID NTAPI USBH_HubCompletePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
Definition: power.c:308
NTSTATUS NTAPI USBH_FdoPower(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
Definition: power.c:551
VOID NTAPI USBH_HubESDRecoverySetD0Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:77
VOID NTAPI USBH_CompletePortWakeIrpsWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: power.c:353
VOID NTAPI USBH_HubQueuePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps)
Definition: power.c:251
VOID NTAPI USBH_FdoPoRequestD0Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:327
NTSTATUS NTAPI USBH_PowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: power.c:440
VOID NTAPI USBH_FdoDeferPoRequestCompletion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:513
VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps, IN NTSTATUS NtStatus)
Definition: power.c:293
VOID NTAPI USBH_IdleCancelPowerHubWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
Definition: power.c:226
VOID NTAPI USBH_CompletePowerIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN NTSTATUS NtStatus)
Definition: power.c:18
NTSTATUS NTAPI USBH_PdoPower(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor)
Definition: power.c:848
VOID NTAPI USBH_HubESDRecoverySetD3Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
Definition: power.c:62
NTSTATUS NTAPI USBH_HubStartESDRecovery(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:162
NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: power.c:362
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
_Inout_opt_ PUNICODE_STRING Extension
Definition: fltkernel.h:1092
Status
Definition: gdiplustypes.h:25
CPPORT Port[4]
Definition: headless.c:35
NTSYSAPI void WINAPI DbgBreakPoint(void)
#define LOW_REALTIME_PRIORITY
IoMarkIrpPending(Irp)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
#define KernelMode
Definition: asm.h:38
@ NotificationEvent
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
#define IoCompleteRequest
Definition: irp.c:1240
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1101
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
Definition: util.c:150
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
Definition: util.c:56
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
NTSTATUS NTAPI PoRequestPowerIrp(_In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR MinorFunction, _In_ POWER_STATE PowerState, _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction, _In_opt_ __drv_aliasesMem PVOID Context, _Outptr_opt_ PIRP *pIrp)
Definition: power.c:659
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerSystemHibernate
Definition: ntpoapi.h:40
@ DevicePowerState
Definition: ntpoapi.h:63
@ PowerDeviceD1
Definition: ntpoapi.h:50
@ PowerDeviceUnspecified
Definition: ntpoapi.h:48
@ PowerDeviceD0
Definition: ntpoapi.h:49
@ PowerDeviceD2
Definition: ntpoapi.h:51
@ PowerDeviceD3
Definition: ntpoapi.h:52
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
unsigned short USHORT
Definition: pedump.c:61
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
Definition: semphobj.c:54
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
static void Exit(void)
Definition: sock.c:1330
PVOID DeviceExtension
Definition: env_spec_w32.h:418
struct _IO_STACK_LOCATION::@4254::@4290 Power
union _IO_STACK_LOCATION::@1658 Parameters
IO_STATUS_BLOCK IoStatus
Definition: typedefs.h:120
LONG PendingRequestCount
Definition: usbhub.h:180
PDEVICE_OBJECT LowerPDO
Definition: usbhub.h:149
POWER_STATE CurrentPowerState
Definition: usbhub.h:160
KEVENT PendingRequestEvent
Definition: usbhub.h:181
PDEVICE_OBJECT RootHubPdo
Definition: usbhub.h:151
POWER_STATE SystemPowerState
Definition: usbhub.h:161
PDEVICE_OBJECT DeviceObject
Definition: usbhub.h:119
POWER_STATE CurrentPowerState
Definition: usbhub.h:222
#define STATUS_PENDING
Definition: telnetd.h:14
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
int32_t * PLONG
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
DEVICE_POWER_STATE DeviceState
Definition: ntpoapi.h:58
SYSTEM_POWER_STATE SystemState
Definition: ntpoapi.h:57
PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:699
NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:2457
NTSTATUS NTAPI USBH_Wait(IN ULONG Milliseconds)
Definition: usbhub.c:23
VOID NTAPI USBH_CheckIdleDeferred(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3972
BOOLEAN NTAPI USBH_CheckIdleAbort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
Definition: usbhub.c:3236
#define USBHUB_FDO_FLAG_DEVICE_STARTED
Definition: usbhub.h:33
#define USBHUB_FDO_FLAG_DEVICE_STOPPING
Definition: usbhub.h:34
struct _USBHUB_FDO_EXTENSION * PUSBHUB_FDO_EXTENSION
Definition: usbhub.h:124
#define USBHUB_FDO_FLAG_DO_SUSPENSE
Definition: usbhub.h:56
#define USBHUB_FDO_FLAG_HIBERNATE_STATE
Definition: usbhub.h:54
#define USBH_EXTENSION_TYPE_HUB
Definition: usbhub.h:28
#define USBHUB_FDO_FLAG_DO_ENUMERATION
Definition: usbhub.h:52
#define USBHUB_FDO_FLAG_WAKEUP_START
Definition: usbhub.h:49
#define USBHUB_FDO_FLAG_NOT_D0_STATE
Definition: usbhub.h:43
#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP
Definition: usbhub.h:39
#define USBHUB_FDO_FLAG_SET_D0_STATE
Definition: usbhub.h:42
#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST
Definition: usbhub.h:44
#define USBHUB_FDO_FLAG_DEVICE_STOPPED
Definition: usbhub.h:37
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3040
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
_Out_opt_ PULONG Minor
Definition: cmfuncs.h:44
#define IRP_MN_WAIT_WAKE
#define EVENT_INCREMENT
Definition: iotypes.h:597
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_POWER_SEQUENCE
#define IRP_MN_SET_POWER
#define IRP_MN_QUERY_POWER
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
@ Suspended
Definition: ketypes.h:472
@ Executive
Definition: ketypes.h:467
unsigned char UCHAR
Definition: xmlstorage.h:181