17#define XEP_STOP_TIMEOUT_MS 2000
18#define XEP_STOP_RETRY_SHORT_MS 200
19#define XEP_STOP_RETRY_LONG_MS 500
50 "EventInfo must have one entry per XepEvent");
105 { &Fenced,
"AwaitingControllerReset", 0,
138 { &Commanding,
"ResettingDefaultPipe", 0,
146 { &ClientResetCommand,
"ResettingPipe", 0,
150 { &ClientResetCommand,
"RebuildingContextForReset", 0,
168 { &Timed,
"AwaitingStoppedEvent", 0,
218 case XepEvent::ControllerResetDone:
223 case XepEvent::Enable:
235 if (
Event == XepEvent::Disable)
245 if (
Event != XepEvent::ControllerResetDone)
258 case XepEvent::ControllerResetStarting:
261 case XepEvent::StreamsOn:
262 case XepEvent::StreamsOff:
265 case XepEvent::TransferAborted:
268 case XepEvent::HaltReported:
271 case XepEvent::ControllerRemoved:
274 case XepEvent::ClientReset:
293 case XepEvent::ControllerResetStarting:
296 case XepEvent::ControllerRemoved:
308 if (
Event != XepEvent::ClientReset)
329 if (
Event == XepEvent::ControllerResetDone)
357 if (
Event != XepEvent::StreamMapStopped)
390 if (
Event == XepEvent::CancelAllowed)
400 if (
Event == XepEvent::CommandFailed)
420 case XepEvent::CommandSucceeded:
423 case XepEvent::StopFailedHalted:
426 case XepEvent::StopFailedRunning:
429 case XepEvent::StopFailedStopped:
448 if (
Event == XepEvent::CommandSucceeded)
465 if (
Event == XepEvent::CommandSucceeded)
482 if (
Event == XepEvent::CommandSucceeded)
492 if (
Event != XepEvent::CommandFailed)
510 if (
Event == XepEvent::CommandSucceeded)
527 if ((
Event != XepEvent::CommandSucceeded) && (
Event != XepEvent::BufferAllocFailed))
549 if (
Event == XepEvent::TransferAborted)
552 if (
Event != XepEvent::TransfersRecovered)
584 case XepEvent::TimerFired:
595 case XepEvent::HaltReported:
616 case XepEvent::TimerFired:
620 case XepEvent::HaltReported:
642 case XepEvent::TimerFired:
646 case XepEvent::StoppedEventSeen:
671 case XepEvent::TimerFired:
681 case XepEvent::ExpectedEventsDone:
684 case XepEvent::TransferAborted:
VOID SmDiscardQueued(_In_ XepEvent Ev)
VOID SmInitialize(_In_ const State *Initial)
static SM_RESULT SmTransition(_In_ const State *Target)
static SM_RESULT SmHandled()
static SM_RESULT SmUnhandled()
SM_RESULT OnCommanding(_In_ XepEvent Event)
static const State AwaitingDisable
VOID ReportStoppedEvent()
SM_RESULT OnResettingDefaultPipe(_In_ XepEvent Event)
SM_RESULT OnDraining(_In_ XepEvent Event)
static const State Commanding
SM_RESULT OnDisabled(_In_ XepEvent Event)
SM_RESULT EnterReclaiming()
SM_RESULT LeaveTimerFor(_In_ TIMER_EXIT Exit)
SM_RESULT OnRebuildingContextAfterStop(_In_ XepEvent Event)
static const State Active
SM_RESULT AfterStoppedEvent()
static const State AwaitingClientReset
static const State RebuildingContextForReset
static const State UpdatingDequeue
static const State Fenced
SM_RESULT OnAwaitingStoppedEvent(_In_ XepEvent Event)
XhciEndpoint * Endpoint() const
VOID NotifyRingsClientReset()
VOID UpdateDequeuePointers()
static const State ClientResetCommand
SM_RESULT AfterHaltDrained()
SM_RESULT OnReclaiming(_In_ XepEvent Event)
SM_RESULT OnAwaitingHalt(_In_ XepEvent Event)
BOOLEAN StopAttemptsExhausted()
VOID StartTimer(_In_ ULONG Milliseconds)
SM_RESULT OnAwaitingStopRetry(_In_ XepEvent Event)
SM_RESULT OnRunning(_In_ XepEvent Event)
VOID ReportTimeout(_In_ XEP_TIMEOUT Timeout)
SM_RESULT OnMapping(_In_ XepEvent Event)
static const State Mapping
SM_RESULT OnAwaitingClientReset(_In_ XepEvent Event)
static const State Draining
VOID NotifyRingsReclaim()
static const State Reclaiming
@ ReclaimAfterControllerReset
SM_RESULT EnterHaltingRingFill()
SM_RESULT EnterAwaitingStopRetry()
static const State AwaitingCancelOk
SM_RESULT OnAwaitingCancelOk(_In_ XepEvent Event)
VOID ReconfigureForReset()
VOID AckControllerReset()
static const State ResettingPipe
SM_RESULT EnterUpdatingDequeue()
SM_RESULT EnterResettingPipe()
static const State StoppingPipe
VOID NotifyRingsReclaimOnCancel()
SM_RESULT EnterLeavingTimer()
Runs the timer exit; the engine already stopped the timer, so it cannot fire after this.
VOID Initialize(_In_ XhciEndpoint *Endpoint)
SM_RESULT AfterStopDrained()
SM_RESULT RunTimerExit(_In_ TIMER_EXIT Exit)
VOID CompleteResetRequestIfAllowed()
SM_RESULT SuspendRingFillFor(_In_ MAPPING_STOP_REASON Reason)
VOID CompleteResetRequest()
SM_RESULT OnActive(_In_ XepEvent Event)
SM_RESULT EnterAwaitingStoppedEvent()
static const State ResetWhileMapping
RECLAIM_REASON m_AfterReclaim
BOOLEAN OnPrimaryInterrupterOnly()
SM_RESULT OnHaltingRingFill(_In_ XepEvent Event)
SM_RESULT EnterDraining()
static const State LeavingTimer
BOOLEAN CanResetAfterHalt()
static const State AwaitingStoppedEvent
SM_RESULT EnterRebuildingContextAfterStop()
static const State RebuildingContextAfterStop
SM_RESULT OnUpdatingDequeue(_In_ XepEvent Event)
VOID RequestControllerReset()
SM_RESULT EnterAwaitingCancelOk()
SM_RESULT OnParked(_In_ XepEvent Event)
static const State ResettingDefaultPipe
SM_RESULT OnClientResetCommand(_In_ XepEvent Event)
BOOLEAN IgnoresStopContextError()
SM_RESULT EnterResettingDefaultPipe()
static const State AwaitingHalt
static const State Removed
VOID NotifyRingsStoppedEvent()
SM_RESULT AfterStopCommand()
MAPPING_STOP_REASON m_AfterMapping
static const State Disabled
SM_RESULT EnterRebuildingContextForReset()
SM_RESULT OnStoppingPipe(_In_ XepEvent Event)
static const State Parked
static const State HaltingRingFill
BOOLEAN ReclaimIgnoresCancel() const
XhciEndpoint * m_Endpoint
static const State Running
SM_RESULT OnResettingPipe(_In_ XepEvent Event)
SM_RESULT OnAwaitingControllerReset(_In_ XepEvent Event)
BOOLEAN ShouldReconfigureForReset()
static const State AwaitingRecovery
static const SM_EVENT_INFO EventInfo[]
BOOLEAN DelaysFirstStop()
VOID DereferenceEndpoint()
SM_RESULT DrainFor(_In_ BOOLEAN AfterHalt)
static const State AwaitingControllerReset
BOOLEAN DoorbellRungSinceFill()
SM_RESULT RetryStopAfter(_In_ ULONG Milliseconds)
SM_RESULT EnterStoppingPipe()
static const State AwaitingStopRetry
VOID ReconfigureAfterStop()
VOID RestartStreamQueues()
BOOLEAN IsControlEndpoint()
SM_RESULT ReclaimFor(_In_ RECLAIM_REASON Reason)
BOOLEAN NeedsContextRebuildAfterStop()
VOID NotifyRingsDrainEvents()
SM_RESULT OnRebuildingContextForReset(_In_ XepEvent Event)
SM_RESULT EnterAwaitingHalt()
SM_RESULT EnterAwaitingControllerReset()
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
static const XepEvent FencedDiscards[]
#define XEP_STOP_TIMEOUT_MS
#define XEP_STOP_RETRY_SHORT_MS
#define XEP_STOP_RETRY_LONG_MS
static const XepEvent DisabledDiscards[]
static const XepEvent AwaitingRecoveryDiscards[]
static const XepEvent CancelDiscards[]
static const XepEvent AwaitingDisableDiscards[]
@ ControllerResetStarting
@ XepTimeoutDrainAfterStop
@ XepTimeoutDrainAfterHalt
_In_ UCXHUB_DEVICE_CONTEXT _In_ UCXENDPOINT Endpoint
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
#define SM_STATE_TAKES_REQUESTS
#define SM_STATE_STOP_TIMER_ON_EXIT
#define SM_STATE_CRITICAL_ONLY
One state. Handler gets every event the state sees.
_In_ ULONG _In_ BOOLEAN Active