139 XhciGetCommandTimerContext(
m_Timer)->Ring =
this;
194 DPRINT1(
"Command ring released with commands outstanding\n");
372XhciCommandRing::Submit(
384 Command->Code = XhciCompletionCode::Invalid;
397 Command->Code = XhciCompletionCode::Invalid;
412XhciCommandRing::SubmitAndWait(
451 if (
Code == XhciCompletionCode::CommandRingStopped)
497 DPRINT1(
"Command completion out of order: TRB 0x%I64x code %lu\n",
541 Head->
Code = XhciCompletionCode::CommandAborted;
547 DPRINT1(
"Command type %lu still not done after the first abort, retrying\n",
552 DPRINT1(
"Unexpected command countdown %ld after the ring stopped\n", Head->
Countdown);
589 DPRINT1(
"Command ring stopped at 0x%I64x, expected 0x%I64x; asking for a reset\n",
610 XhciGetCommandTimerContext(
Timer)->Ring->OnTimer();
646 DPRINT1(
"Command ring control reads all ones, controller is gone\n");
659 DPRINT1(
"Command abort timed out with the ring running; asking for a reset\n");
667 DPRINT1(
"Command abort timed out with the ring stopped; restarting it\n");
687 DPRINT1(
"Controller did not finish a command within %ld s\n",
698 DPRINT1(
"Command ring not running with a command pending; asking for a reset\n");
726 m_Controller->RaiseControllerFault(WantInternal ? XhciRecovery::InternalReset : XhciRecovery::ResetHost,
VOID PostInterruptsEntry()
static EVT_WDF_TIMER EvtTimer
XhciDmaBuffer * m_Segment
VOID DrainAllLocked(_Inout_ PLIST_ENTRY Finished)
XhciController * m_Controller
VOID PlaceLocked(_Inout_ XhciCommand *Command, _In_ BOOLEAN FrontOfLine, _Inout_ PLIST_ENTRY Finished)
ULONG64 TrbAddress(_In_ ULONG Index) const
VOID PutOnRingLocked(_Inout_ XhciCommand *Command)
VOID OnCompletionEvent(_In_ const XHCI_TRB *Event)
NTSTATUS Create(_In_ XhciController *Controller)
VOID RestartStoppedRingLocked(_Inout_ PLIST_ENTRY Finished)
VOID HandleRingStopped(_In_ const XHCI_TRB *Event)
XhciCommonBuffer m_Buffers
BOOLEAN HasErrata(_In_ XhciErrata Bit) const
BOOLEAN IsAccessible() const
XhciRegisters m_Registers
ULONG64 ReadOperational64(_In_ ULONG Offset) const
VOID WriteOperational64(_In_ ULONG Offset, _In_ ULONG64 Value)
VOID RingDoorbell(_In_ ULONG Index, _In_ ULONG Value)
static const ULONG XhciCmdTickSlackMs
static VOID NTAPI XhciCmdWaiterDone(_In_ XhciCommand *Command)
static const ULONG XhciCmdUsable
static VOID NTAPI XhciCmdCompleteList(_Inout_ PLIST_ENTRY Finished)
static const ULONG XhciCmdReasonAbortFailed
struct _XHCI_COMMAND_TIMER_CONTEXT XHCI_COMMAND_TIMER_CONTEXT
static const ULONG XhciCmdReasonOutOfOrder
static const LONG XhciCmdTicksAbortWait
static const ULONG XhciCmdTrbCount
static const LONG XhciCmdTicksFirstAbort
static const LONG XhciCmdTicksInitial
static NTSTATUS NTAPI XhciCmdStatusFromCode(_In_ XhciCompletionCode Code)
static const ULONG XhciCmdReasonDequeueMismatch
static const ULONG XhciCmdBlockSetAddress
struct _XHCI_COMMAND_TIMER_CONTEXT * PXHCI_COMMAND_TIMER_CONTEXT
static XhciCommand *NTAPI XhciCmdFromLink(_In_ PLIST_ENTRY Entry)
static const ULONG XhciCmdTickMs
_Inout_ HubConfiguration ** Slot
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
#define KeSetEvent(pEvt, foo, foo2)
#define KeAcquireSpinLock(sl, irql)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
FORCEINLINE VOID KeMemoryBarrier(VOID)
PHYSICAL_ADDRESS LogicalAddress
struct _LIST_ENTRY * Flink
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
#define STATUS_IO_TIMEOUT
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
FORCEINLINE LONGLONG WDF_REL_TIMEOUT_IN_MS(_In_ ULONGLONG Time)
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
#define WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
@ WdfExecutionLevelDispatch
#define WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(_contexttype, _castingfunction)
_In_ WDFREQUEST _In_ BOOLEAN Requeue
FORCEINLINE VOID WDF_TIMER_CONFIG_INIT_PERIODIC(_Out_ PWDF_TIMER_CONFIG Config, _In_ PFN_WDF_TIMER EvtTimerFunc, _In_ LONG Period)
_In_ WDF_WMI_PROVIDER_CONTROL Control
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define XHCI_TRB_TYPE_SHIFT
FORCEINLINE ULONG64 NTAPI XhciTrbPointer(_In_ const XHCI_TRB *Trb)
#define XHCI_LINK_TOGGLE_CYCLE
#define XHCI_CRCR_RUNNING
FORCEINLINE ULONG NTAPI XhciTrbCompletionCode(_In_ const XHCI_TRB *Trb)
FORCEINLINE VOID NTAPI XhciClearListEntry(_Out_ PLIST_ENTRY Entry)