ReactOS 0.4.16-dev-2279-gc890759
power.c File Reference
#include "usbhub.h"
#include <debug.h>
#include "dbg_uhub.h"
Include dependency graph for power.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define NDEBUG_USBHUB_POWER
 

Functions

VOID NTAPI USBH_CompletePowerIrp (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_HubCancelWakeIrp (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
 
VOID NTAPI USBH_HubESDRecoverySetD3Completion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
VOID NTAPI USBH_HubESDRecoverySetD0Completion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
NTSTATUS NTAPI USBH_HubSetD0 (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
NTSTATUS NTAPI USBH_HubStartESDRecovery (IN PUSBHUB_FDO_EXTENSION HubExtension)
 
VOID NTAPI USBH_IdleCancelPowerHubWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
VOID NTAPI USBH_HubQueuePortWakeIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps)
 
VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_HubCompletePortWakeIrps (IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
 
VOID NTAPI USBH_FdoPoRequestD0Completion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
VOID NTAPI USBH_CompletePortWakeIrpsWorker (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
 
NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI USBH_PowerIrpCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
VOID NTAPI USBH_FdoDeferPoRequestCompletion (IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
 
NTSTATUS NTAPI USBH_FdoPower (IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
 
NTSTATUS NTAPI USBH_PdoPower (IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file power.c.

◆ NDEBUG_USBHUB_POWER

#define NDEBUG_USBHUB_POWER

Definition at line 13 of file power.c.

Function Documentation

◆ USBH_CompletePortWakeIrpsWorker()

VOID NTAPI USBH_CompletePortWakeIrpsWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 353 of file power.c.

355{
356 DPRINT1("USBH_CompletePortWakeIrpsWorker: UNIMPLEMENTED. FIXME\n");
358}
#define DPRINT1
Definition: precomp.h:8
NTSYSAPI void WINAPI DbgBreakPoint(void)

◆ USBH_CompletePowerIrp()

VOID NTAPI USBH_CompletePowerIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN NTSTATUS  NtStatus 
)

Definition at line 18 of file power.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52
_In_ PIRP Irp
Definition: csq.h:116
#define FALSE
Definition: types.h:117
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define IoCompleteRequest
Definition: irp.c:1240
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
#define DPRINT
Definition: sndvol32.h:73
#define EVENT_INCREMENT
Definition: iotypes.h:597
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by USBH_FdoCleanup(), and USBH_PdoRemoveDevice().

◆ USBH_FdoDeferPoRequestCompletion()

VOID NTAPI USBH_FdoDeferPoRequestCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 513 of file power.c.

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}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define NULL
Definition: types.h:112
_Inout_opt_ PUNICODE_STRING Extension
Definition: fltkernel.h:1092
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
@ PowerSystemWorking
Definition: ntpoapi.h:36
struct _IO_STACK_LOCATION::@4253::@4289 Power
union _IO_STACK_LOCATION::@1657 Parameters
PDEVICE_OBJECT LowerPDO
Definition: usbhub.h:149
PDEVICE_OBJECT RootHubPdo
Definition: usbhub.h:151
POWER_STATE SystemPowerState
Definition: usbhub.h:161
SYSTEM_POWER_STATE SystemState
Definition: ntpoapi.h:57
VOID NTAPI USBH_CheckIdleDeferred(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: usbhub.c:3972
#define USBH_EXTENSION_TYPE_HUB
Definition: usbhub.h:28

Referenced by USBH_FdoPower().

◆ USBH_FdoPoRequestD0Completion()

VOID NTAPI USBH_FdoPoRequestD0Completion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 327 of file power.c.

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}
VOID NTAPI USBH_HubCompletePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
Definition: power.c:308
#define STATUS_SUCCESS
Definition: shellext.h:65
LONG PendingRequestCount
Definition: usbhub.h:180
KEVENT PendingRequestEvent
Definition: usbhub.h:181

Referenced by USBH_FdoWWIrpIoCompletion().

◆ USBH_FdoPower()

NTSTATUS NTAPI USBH_FdoPower ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp,
IN UCHAR  Minor 
)

Definition at line 551 of file power.c.

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}
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT_PWR(...)
Definition: dbg_uhub.h:108
#define TRUE
Definition: types.h:120
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
NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: power.c:362
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
Status
Definition: gdiplustypes.h:25
CPPORT Port[4]
Definition: headless.c:35
#define LOW_REALTIME_PRIORITY
IoMarkIrpPending(Irp)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
#define KernelMode
Definition: asm.h:38
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
Definition: irp.c:1101
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
@ 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
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
Definition: semphobj.c:54
static void Exit(void)
Definition: sock.c:1330
PVOID DeviceExtension
Definition: env_spec_w32.h:418
PDEVICE_OBJECT DeviceObject
Definition: usbhub.h:119
POWER_STATE CurrentPowerState
Definition: usbhub.h:222
#define STATUS_PENDING
Definition: telnetd.h:14
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
DEVICE_POWER_STATE DeviceState
Definition: ntpoapi.h:58
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
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
#define USBHUB_FDO_FLAG_DO_SUSPENSE
Definition: usbhub.h:56
#define USBHUB_FDO_FLAG_HIBERNATE_STATE
Definition: usbhub.h:54
#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_DEVICE_STOPPED
Definition: usbhub.h:37
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3040
_Out_opt_ PULONG Minor
Definition: cmfuncs.h:44
#define IRP_MN_WAIT_WAKE
#define IRP_MN_POWER_SEQUENCE
#define IRP_MN_SET_POWER
#define IRP_MN_QUERY_POWER
@ Executive
Definition: ketypes.h:467

Referenced by USBH_FdoDispatch().

◆ USBH_FdoWWIrpIoCompletion()

NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 362 of file power.c.

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}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedExchange
Definition: armddk.h:54
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
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
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
UCHAR KIRQL
Definition: env_spec_w32.h:591
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
Definition: util.c:150
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
Definition: util.c:56
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define USBHUB_FDO_FLAG_WAKEUP_START
Definition: usbhub.h:49
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by USBH_FdoPower().

◆ USBH_HubCancelWakeIrp()

VOID NTAPI USBH_HubCancelWakeIrp ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PIRP  Irp 
)

Definition at line 43 of file power.c.

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}
int32_t * PLONG
Definition: typedefs.h:58
#define STATUS_CANCELLED
Definition: udferr_usr.h:170

Referenced by USBH_FdoCleanup().

◆ USBH_HubCompletePortWakeIrps()

VOID NTAPI USBH_HubCompletePortWakeIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN NTSTATUS  NtStatus 
)

Definition at line 308 of file power.c.

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}
VOID NTAPI USBH_HubQueuePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps)
Definition: power.c:251
VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps, IN NTSTATUS NtStatus)
Definition: power.c:293
Definition: typedefs.h:120

Referenced by USBH_FdoCleanup(), and USBH_FdoPoRequestD0Completion().

◆ USBH_HubCompleteQueuedPortWakeIrps()

VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PLIST_ENTRY  ListIrps,
IN NTSTATUS  NtStatus 
)

Definition at line 293 of file power.c.

296{
297 DPRINT("USBH_HubCompleteQueuedPortWakeIrps ... \n");
298
299 while (!IsListEmpty(ListIrps))
300 {
301 DPRINT1("USBH_HubCompleteQueuedPortWakeIrps: UNIMPLEMENTED. FIXME\n");
303 }
304}
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954

Referenced by USBH_HubCompletePortWakeIrps().

◆ USBH_HubESDRecoverySetD0Completion()

VOID NTAPI USBH_HubESDRecoverySetD0Completion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 77 of file power.c.

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}
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
struct _USBHUB_FDO_EXTENSION * PUSBHUB_FDO_EXTENSION
Definition: usbhub.h:124

Referenced by USBH_HubStartESDRecovery().

◆ USBH_HubESDRecoverySetD3Completion()

VOID NTAPI USBH_HubESDRecoverySetD3Completion ( IN PDEVICE_OBJECT  DeviceObject,
IN UCHAR  MinorFunction,
IN POWER_STATE  PowerState,
IN PVOID  Context,
IN PIO_STATUS_BLOCK  IoStatus 
)

Definition at line 62 of file power.c.

67{
68 DPRINT("USBH_HubESDRecoverySetD3Completion ... \n");
69
72 FALSE);
73}

Referenced by USBH_HubSetD0(), and USBH_HubStartESDRecovery().

◆ USBH_HubQueuePortWakeIrps()

VOID NTAPI USBH_HubQueuePortWakeIrps ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PLIST_ENTRY  ListIrps 
)

Definition at line 251 of file power.c.

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}
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
unsigned short USHORT
Definition: pedump.c:61

Referenced by USBH_HubCompletePortWakeIrps().

◆ USBH_HubSetD0()

NTSTATUS NTAPI USBH_HubSetD0 ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 104 of file power.c.

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}
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
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
@ NotificationEvent
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178
NTSTATUS NTAPI USBH_Wait(IN ULONG Milliseconds)
Definition: usbhub.c:23
#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST
Definition: usbhub.h:44
@ Suspended
Definition: ketypes.h:472

Referenced by USBH_DeviceControl(), USBH_FdoPnP(), USBH_IdleCancelPowerHubWorker(), USBH_IdleCompletePowerHubWorker(), and USBH_PdoRemoveDevice().

◆ USBH_HubStartESDRecovery()

NTSTATUS NTAPI USBH_HubStartESDRecovery ( IN PUSBHUB_FDO_EXTENSION  HubExtension)

Definition at line 162 of file power.c.

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}
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

Referenced by USBH_ChangeIndicationWorker().

◆ USBH_IdleCancelPowerHubWorker()

VOID NTAPI USBH_IdleCancelPowerHubWorker ( IN PUSBHUB_FDO_EXTENSION  HubExtension,
IN PVOID  Context 
)

Definition at line 226 of file power.c.

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}
NTSTATUS NTAPI USBH_HubSetD0(IN PUSBHUB_FDO_EXTENSION HubExtension)
Definition: power.c:104
IO_STATUS_BLOCK IoStatus

Referenced by USBH_PortIdleNotificationCancelRoutine().

◆ USBH_PdoPower()

NTSTATUS NTAPI USBH_PdoPower ( IN PUSBHUB_PORT_PDO_EXTENSION  PortExtension,
IN PIRP  Irp,
IN UCHAR  Minor 
)

Definition at line 848 of file power.c.

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}

Referenced by USBH_PdoDispatch().

◆ USBH_PowerIrpCompletion()

NTSTATUS NTAPI USBH_PowerIrpCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 440 of file power.c.

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}
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
POWER_STATE CurrentPowerState
Definition: usbhub.h:160
#define USBHUB_FDO_FLAG_DO_ENUMERATION
Definition: usbhub.h:52

Referenced by USBH_FdoPower().