13#define NDEBUG_USBHUB_POWER
22 DPRINT(
"USBH_CompletePowerIrp: HubExtension - %p, Irp - %p, NtStatus - %lX\n",
27 Irp->IoStatus.Status = NtStatus;
46 DPRINT(
"USBH_HubCancelWakeIrp: HubExtension - %p, Irp - %p\n",
68 DPRINT(
"USBH_HubESDRecoverySetD3Completion ... \n");
85 DPRINT(
"USBH_HubESDRecoverySetD0Completion: HubExtension - %p\n", HubExtension);
90 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
91 DPRINT(
"USBH_HubESDRecoverySetD0Completion: ESD recovery completed\n");
93 else if (HubExtension)
96 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
97 DPRINT1(
"USBH_HubESDRecoverySetD0Completion: ESD recovery failed with status 0x%08lx\n",
111 DPRINT(
"USBH_HubSetD0: HubExtension - %p\n", HubExtension);
123 DPRINT(
"USBH_HubSetD0: HubFlags - %lX\n", HubExtension->HubFlags);
169 DPRINT(
"USBH_HubStartESDRecovery: HubExtension - %p\n", HubExtension);
176 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
201 DPRINT1(
"USBH_HubStartESDRecovery: Failed to set D3, Status - %lX\n",
Status);
202 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
217 DPRINT1(
"USBH_HubStartESDRecovery: Failed to set D0, Status - %lX\n",
Status);
218 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_ESD_RECOVERING;
232 DPRINT(
"USBH_IdleCancelPowerHubWorker: ... \n");
237 HubExtension->CurrentPowerState.DeviceState !=
PowerDeviceD0 &&
243 Irp = WorkItemIdlePower->
Irp;
261 DPRINT(
"USBH_HubQueuePortWakeIrps ... \n");
263 NumPorts = HubExtension->HubDescriptor->bNumberOfPorts;
271 PortDevice = HubExtension->PortData[
Port].DeviceObject;
282 DPRINT1(
"USBH_HubQueuePortWakeIrps: UNIMPLEMENTED. FIXME\n");
297 DPRINT(
"USBH_HubCompleteQueuedPortWakeIrps ... \n");
301 DPRINT1(
"USBH_HubCompleteQueuedPortWakeIrps: UNIMPLEMENTED. FIXME\n");
313 DPRINT(
"USBH_HubCompletePortWakeIrps: NtStatus - %x\n", NtStatus);
335 DPRINT(
"USBH_FdoPoRequestD0Completion ... \n");
341 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_WAKEUP_START;
356 DPRINT1(
"USBH_CompletePortWakeIrpsWorker: UNIMPLEMENTED. FIXME\n");
372 DPRINT(
"USBH_FdoWWIrpIoCompletion: DeviceObject - %p, Irp - %p\n",
382 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_PENDING_WAKE_IRP;
396 DPRINT(
"USBH_FdoWWIrpIoCompletion: Status - %lX\n",
Status);
400 DPRINT1(
"USBH_FdoWWIrpIoCompletion: DbgBreakPoint() \n");
428 DPRINT(
"USBH_FdoWWIrpIoCompletion: Status - %lX\n",
Status);
450 DPRINT(
"USBH_PowerIrpCompletion: DeviceObject - %p, Irp - %p\n",
460 DPRINT(
"USBH_PowerIrpCompletion: Status - %lX\n",
Status);
467 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_SET_D0_STATE;
472 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_SET_D0_STATE;
477 DPRINT(
"USBH_PowerIrpCompletion: OldDeviceState - %x\n", OldDeviceState);
481 DPRINT1(
"USBH_PowerIrpCompletion: USBHUB_FDO_FLAG_HIBERNATE_STATE. FIXME\n");
485 HubExtension->
HubFlags &= ~USBHUB_FDO_FLAG_HIBERNATE_STATE;
489 DPRINT1(
"USBH_PowerIrpCompletion: PowerDeviceD3. FIXME\n");
499 DPRINT(
"USBH_PowerIrpCompletion: Status - %lX\n",
Status);
524 DPRINT(
"USBH_FdoDeferPoRequestCompletion ... \n");
546 PoCallDriver(
Extension->LowerDevice, PowerIrp);
565 DPRINT_PWR(
"USBH_FdoPower: HubExtension - %p, Irp - %p, Minor - %X\n",
573 DPRINT_PWR(
"USBH_FdoPower: IRP_MN_WAIT_WAKE\n");
586 PoCallDriver(HubExtension->LowerDevice,
Irp);
591 DPRINT_PWR(
"USBH_FdoPower: IRP_MN_POWER_SEQUENCE\n");
595 DPRINT_PWR(
"USBH_FdoPower: IRP_MN_SET_POWER\n");
598 DPRINT_PWR(
"USBH_FdoPower: IRP_MN_SET_POWER/DevicePowerState\n");
603 DPRINT_PWR(
"USBH_FdoPower: PowerState - %x\n",
606 if (HubExtension->CurrentPowerState.DeviceState ==
PowerState.DeviceState)
612 PoCallDriver(HubExtension->LowerDevice,
Irp);
643 PoCallDriver(HubExtension->LowerDevice,
Irp);
649 if (HubExtension->ResetRequestCount)
674 HubExtension->CurrentPowerState.DeviceState =
PowerState.DeviceState;
691 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
712 PoCallDriver(HubExtension->LowerDevice,
Irp);
716 HubExtension->HubFlags &= ~USBHUB_FDO_FLAG_DO_SUSPENSE;
727 DPRINT1(
"USBH_FdoPower: Unsupported PowerState.DeviceState\n");
745 PortData = HubExtension->PortData;
749 if (PortData && HubExtension->HubDescriptor)
752 Port < HubExtension->HubDescriptor->bNumberOfPorts;
763 IsAllPortsD3 =
FALSE;
789 if (DevicePwrState.
DeviceState != HubExtension->CurrentPowerState.DeviceState &&
792 HubExtension->PowerIrp =
Irp;
808 PoCallDriver(HubExtension->LowerDevice,
Irp);
815 HubExtension->SystemPowerState.SystemState =
PowerState.SystemState;
825 return PoCallDriver(HubExtension->LowerDevice,
Irp);
831 DPRINT_PWR(
"USBH_FdoPower: IRP_MN_QUERY_POWER\n");
835 DPRINT1(
"USBH_FdoPower: unknown IRP_MN_POWER!\n");
841 Status = PoCallDriver(HubExtension->LowerDevice,
Irp);
854 DPRINT_PWR(
"USBH_FdoPower: PortExtension - %p, Irp - %p, Minor - %X\n",
862 DPRINT_PWR(
"USBHUB_PdoPower: IRP_MN_WAIT_WAKE\n");
867 DPRINT_PWR(
"USBHUB_PdoPower: IRP_MN_POWER_SEQUENCE\n");
872 DPRINT_PWR(
"USBHUB_PdoPower: IRP_MN_SET_POWER\n");
877 DPRINT_PWR(
"USBHUB_PdoPower: IRP_MN_QUERY_POWER\n");
882 DPRINT1(
"USBHUB_PdoPower: unknown IRP_MN_POWER!\n");
888 Irp->IoStatus.Information = 0;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define InterlockedIncrement
#define InterlockedExchange
#define InterlockedDecrement
#define NT_SUCCESS(StatCode)
VOID NTAPI USBH_HubCancelWakeIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp)
NTSTATUS NTAPI USBH_HubSetD0(IN PUSBHUB_FDO_EXTENSION HubExtension)
VOID NTAPI USBH_HubCompletePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN NTSTATUS NtStatus)
NTSTATUS NTAPI USBH_FdoPower(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN UCHAR Minor)
VOID NTAPI USBH_HubESDRecoverySetD0Completion(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)
VOID NTAPI USBH_HubQueuePortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps)
VOID NTAPI USBH_FdoPoRequestD0Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
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)
VOID NTAPI USBH_HubCompleteQueuedPortWakeIrps(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PLIST_ENTRY ListIrps, IN NTSTATUS NtStatus)
VOID NTAPI USBH_IdleCancelPowerHubWorker(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PVOID Context)
VOID NTAPI USBH_CompletePowerIrp(IN PUSBHUB_FDO_EXTENSION HubExtension, IN PIRP Irp, IN NTSTATUS NtStatus)
NTSTATUS NTAPI USBH_PdoPower(IN PUSBHUB_PORT_PDO_EXTENSION PortExtension, IN PIRP Irp, IN UCHAR Minor)
VOID NTAPI USBH_HubESDRecoverySetD3Completion(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
NTSTATUS NTAPI USBH_HubStartESDRecovery(IN PUSBHUB_FDO_EXTENSION HubExtension)
NTSTATUS NTAPI USBH_FdoWWIrpIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define InterlockedExchangePointer(Target, Value)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define InitializeListHead(ListHead)
_Inout_opt_ PUNICODE_STRING Extension
NTSYSAPI void WINAPI DbgBreakPoint(void)
#define LOW_REALTIME_PRIORITY
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
#define IoCopyCurrentIrpStackLocationToNext(Irp)
#define IoCompleteRequest
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
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)
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
#define STATUS_MORE_PROCESSING_REQUIRED
struct _IO_STACK_LOCATION::@4254::@4290 Power
union _IO_STACK_LOCATION::@1658 Parameters
POWER_STATE CurrentPowerState
KEVENT PendingRequestEvent
PDEVICE_OBJECT RootHubPdo
POWER_STATE SystemPowerState
PDEVICE_OBJECT DeviceObject
POWER_STATE CurrentPowerState
#define STATUS_UNSUCCESSFUL
#define STATUS_INVALID_DEVICE_STATE
DEVICE_POWER_STATE DeviceState
SYSTEM_POWER_STATE SystemState
PUSBHUB_FDO_EXTENSION NTAPI USBH_GetRootHubExtension(IN PUSBHUB_FDO_EXTENSION HubExtension)
NTSTATUS NTAPI USBH_SubmitStatusChangeTransfer(IN PUSBHUB_FDO_EXTENSION HubExtension)
NTSTATUS NTAPI USBH_Wait(IN ULONG Milliseconds)
VOID NTAPI USBH_CheckIdleDeferred(IN PUSBHUB_FDO_EXTENSION HubExtension)
BOOLEAN NTAPI USBH_CheckIdleAbort(IN PUSBHUB_FDO_EXTENSION HubExtension, IN BOOLEAN IsWait, IN BOOLEAN IsExtCheck)
#define USBHUB_FDO_FLAG_DEVICE_STARTED
#define USBHUB_FDO_FLAG_DEVICE_STOPPING
struct _USBHUB_FDO_EXTENSION * PUSBHUB_FDO_EXTENSION
#define USBHUB_FDO_FLAG_DO_SUSPENSE
#define USBHUB_FDO_FLAG_HIBERNATE_STATE
#define USBH_EXTENSION_TYPE_HUB
#define USBHUB_FDO_FLAG_DO_ENUMERATION
#define USBHUB_FDO_FLAG_WAKEUP_START
#define USBHUB_FDO_FLAG_NOT_D0_STATE
#define USBHUB_FDO_FLAG_PENDING_WAKE_IRP
#define USBHUB_FDO_FLAG_SET_D0_STATE
#define USBHUB_FDO_FLAG_WAIT_IDLE_REQUEST
#define USBHUB_FDO_FLAG_DEVICE_STOPPED
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
_In_ UCHAR _In_ UCHAR MinorFunction
#define IRP_MN_POWER_SEQUENCE
#define IRP_MN_QUERY_POWER
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql