ReactOS 0.4.17-dev-1281-g065abb3
ctrlxfer.cpp File Reference
#include "xhcidrv.h"
#include <debug.h>
Include dependency graph for ctrlxfer.cpp:

Go to the source code of this file.

Macros

#define NDEBUG
 

Enumerations

enum class  XhciCtlStep : ULONG {
  Setup , FirstData , MoreData , DataEventData ,
  Status , StatusEventData , Done
}
 

Functions

static XhciControlRing *NTAPI XhciCtlOf (_In_ XhciTransferRing *Ring)
 
static XhciMapState NTAPI XhciCtlMapState (_In_ const XhciTransferRing *Ring)
 
static VOID NTAPI XhciCtlSetMapState (_Inout_ XhciTransferRing *Ring, _In_ XhciMapState State)
 
static ULONG NTAPI XhciCtlTrbType (_In_ enum XhciTrbType Type)
 
static BOOLEAN NTAPI XhciCtlIsHaltCode (_In_ ULONG Code)
 
static BOOLEAN NTAPI XhciCtlIsStopCode (_In_ ULONG Code)
 
static USBD_STATUS NTAPI XhciCtlUsbdStatusFromNt (_In_ NTSTATUS Status)
 
static VOID NTAPI XhciCtlWrap (_Inout_ XhciTransferRing *Ring, _In_ BOOLEAN FirstOfTd, _In_ BOOLEAN InDataStage)
 
static VOID NTAPI XhciCtlPut (_Inout_ XhciTransferRing *Ring, _Inout_ PXHCI_TRB Trb, _In_ BOOLEAN FirstOfTd)
 
 _Requires_lock_held_ (m_Ring->m_Lock) VOID XhciControlRing
 

Variables

static const ULONG_PTR XhciCtlStatusStageFlag = 0x4
 
static const ULONG_PTR XhciCtlValueFlagBits = 0x7
 
static const ULONG XhciCtlTagSignature = 0x6C744358
 
static const ULONG XhciCtlReasonBadTrbPointer = 0x101F
 
static const ULONG XhciCtlReasonDuplicateEvent = 0x1020
 
static const ULONG XhciCtlMaxTransfer = 0x10000
 
static const ULONG XhciCtlMaxTrbLength = 0x10000
 
static const ULONG XhciCtlShortDataStageTrb = 512
 
static const ULONG XhciCtlImmediateBytes = 8
 
static const ULONG XhciCtlSetupBytes = 8
 
static const ULONG XhciCtlWorstCaseTd = 21
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file ctrlxfer.cpp.

Enumeration Type Documentation

◆ XhciCtlStep

Enumerator
Setup 
FirstData 
MoreData 
DataEventData 
Status 
StatusEventData 
Done 

Definition at line 32 of file ctrlxfer.cpp.

Function Documentation

◆ _Requires_lock_held_()

_Requires_lock_held_ ( m_Ring->  m_Lock)

Completes a request; the ring lock is dropped around the WDF call.

Completes the held request unless a cancel or timer callback still has to run.

Definition at line 881 of file ctrlxfer.cpp.

886{
887 if (Transfer->Mechanism == XhciControlMechanism::DoubleBuffer && Transfer->DataIn && Bytes != 0)
888 RtlCopyMemory(Transfer->SystemBuffer, Transfer->DoubleBuffer->VirtualAddress, Bytes);
889}
_In_ UINT Bytes
Definition: mmcopy.h:9
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

◆ XhciCtlIsHaltCode()

static BOOLEAN NTAPI XhciCtlIsHaltCode ( _In_ ULONG  Code)
static

Codes after which the controller halts the endpoint.

Definition at line 84 of file ctrlxfer.cpp.

Referenced by XhciControlRing::OnEventDataEvent(), and XhciControlRing::OnTrbEvent().

◆ XhciCtlIsStopCode()

static BOOLEAN NTAPI XhciCtlIsStopCode ( _In_ ULONG  Code)
static

Definition at line 106 of file ctrlxfer.cpp.

108{
109 return Code == static_cast<ULONG>(XhciCompletionCode::Stopped) ||
112}
uint32_t ULONG
Definition: typedefs.h:59

Referenced by XhciControlRing::OnEventDataEvent(), and XhciControlRing::OnTrbEvent().

◆ XhciCtlMapState()

◆ XhciCtlOf()

◆ XhciCtlPut()

static VOID NTAPI XhciCtlPut ( _Inout_ XhciTransferRing *  Ring,
_Inout_ PXHCI_TRB  Trb,
_In_ BOOLEAN  FirstOfTd 
)
static

Stores a finished TRB; the first TRB of a TD stays invalid until the doorbell step.

Definition at line 160 of file ctrlxfer.cpp.

164{
165 ULONG Cycle = Ring->m_Cycle & XHCI_TRB_CYCLE;
166
167 if (FirstOfTd)
168 Cycle ^= XHCI_TRB_CYCLE;
169
170 Trb->Dword[3] = (Trb->Dword[3] & ~XHCI_TRB_CYCLE) | Cycle;
171 Ring->m_Trbs[Ring->m_EnqueueIndex] = *Trb;
172 Ring->m_EnqueueIndex++;
173}
#define XHCI_TRB_CYCLE
Definition: xhcihw.h:22

Referenced by XhciControlRing::WriteTd().

◆ XhciCtlSetMapState()

static VOID NTAPI XhciCtlSetMapState ( _Inout_ XhciTransferRing *  Ring,
_In_ XhciMapState  State 
)
static

Definition at line 64 of file ctrlxfer.cpp.

67{
68 InterlockedExchange(&Ring->m_MapState, static_cast<LONG>(State));
69}
#define InterlockedExchange
Definition: armddk.h:54
long LONG
Definition: pedump.c:60

Referenced by XhciControlRing::BuildControlTd(), XhciControlRing::Disable(), XhciControlRing::ResumeRingFill(), XhciControlRing::SuspendRingFill(), and XhciControlRing::WriteTd().

◆ XhciCtlTrbType()

static ULONG NTAPI XhciCtlTrbType ( _In_ enum XhciTrbType  Type)
static

Definition at line 74 of file ctrlxfer.cpp.

76{
77 return static_cast<ULONG>(Type) << XHCI_TRB_TYPE_SHIFT;
78}
Type
Definition: Type.h:7
#define XHCI_TRB_TYPE_SHIFT
Definition: xhcihw.h:23

Referenced by XhciControlRing::WriteTd().

◆ XhciCtlUsbdStatusFromNt()

static USBD_STATUS NTAPI XhciCtlUsbdStatusFromNt ( _In_ NTSTATUS  Status)
static

URB status for a request that finished without a hardware completion code.

Definition at line 118 of file ctrlxfer.cpp.

120{
121 switch (Status)
122 {
123 case STATUS_CANCELLED:
129 default:
131 }
132}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
Status
Definition: gdiplustypes.h:24
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define USBD_STATUS_CANCELED
Definition: usb.h:225
#define USBD_STATUS_NOT_SUPPORTED
Definition: usb.h:213
#define USBD_STATUS_INSUFFICIENT_RESOURCES
Definition: usb.h:215
#define USBD_STATUS_INVALID_PARAMETER
Definition: usb.h:203

◆ XhciCtlWrap()

static VOID NTAPI XhciCtlWrap ( _Inout_ XhciTransferRing *  Ring,
_In_ BOOLEAN  FirstOfTd,
_In_ BOOLEAN  InDataStage 
)
static

Writes a Link TRB back to the segment start at the enqueue index and wraps.

Definition at line 138 of file ctrlxfer.cpp.

142{
144 ULONG64 Base = Ring->SegmentBase();
145
146 Ring->BuildLinkTrb(&Link, FirstOfTd, InDataStage);
147 Link.Dword[0] = static_cast<ULONG>(Base);
148 Link.Dword[1] = static_cast<ULONG>(Base >> 32);
149 Link.Dword[3] |= XHCI_LINK_TOGGLE_CYCLE;
150
151 Ring->m_Trbs[Ring->m_EnqueueIndex] = Link;
152 Ring->m_Cycle ^= XHCI_TRB_CYCLE;
153 Ring->m_EnqueueIndex = 0;
154}
Walk Base
Definition: desccheck.cpp:2270
unsigned __int64 ULONG64
Definition: imports.h:198
#define XHCI_LINK_TOGGLE_CYCLE
Definition: xhcihw.h:184

Referenced by XhciControlRing::WriteTd().

Variable Documentation

◆ XhciCtlImmediateBytes

const ULONG XhciCtlImmediateBytes = 8
static

Definition at line 26 of file ctrlxfer.cpp.

Referenced by XhciControlRing::Initialize().

◆ XhciCtlMaxTransfer

const ULONG XhciCtlMaxTransfer = 0x10000
static

Definition at line 23 of file ctrlxfer.cpp.

Referenced by XhciControlRing::PrepareTransfer().

◆ XhciCtlMaxTrbLength

const ULONG XhciCtlMaxTrbLength = 0x10000
static

Definition at line 24 of file ctrlxfer.cpp.

Referenced by XhciControlRing::WriteTd().

◆ XhciCtlReasonBadTrbPointer

const ULONG XhciCtlReasonBadTrbPointer = 0x101F
static

Definition at line 20 of file ctrlxfer.cpp.

Referenced by XhciControlRing::OnTrbEvent().

◆ XhciCtlReasonDuplicateEvent

const ULONG XhciCtlReasonDuplicateEvent = 0x1020
static

Definition at line 21 of file ctrlxfer.cpp.

Referenced by XhciControlRing::OnTrbEvent().

◆ XhciCtlSetupBytes

const ULONG XhciCtlSetupBytes = 8
static

Definition at line 27 of file ctrlxfer.cpp.

Referenced by XhciControlRing::WriteTd().

◆ XhciCtlShortDataStageTrb

const ULONG XhciCtlShortDataStageTrb = 512
static

Definition at line 25 of file ctrlxfer.cpp.

Referenced by XhciControlRing::WriteTd().

◆ XhciCtlStatusStageFlag

const ULONG_PTR XhciCtlStatusStageFlag = 0x4
static

Definition at line 14 of file ctrlxfer.cpp.

Referenced by XhciControlRing::OnEventDataEvent(), and XhciControlRing::WriteTd().

◆ XhciCtlTagSignature

const ULONG XhciCtlTagSignature = 0x6C744358
static

Definition at line 17 of file ctrlxfer.cpp.

Referenced by XhciControlRing::Initialize(), and XhciControlRing::TagFromEvent().

◆ XhciCtlValueFlagBits

const ULONG_PTR XhciCtlValueFlagBits = 0x7
static

Definition at line 15 of file ctrlxfer.cpp.

Referenced by XhciControlRing::TagFromEvent(), and XhciControlRing::WriteTd().

◆ XhciCtlWorstCaseTd

const ULONG XhciCtlWorstCaseTd = 21
static

Definition at line 30 of file ctrlxfer.cpp.

Referenced by XhciControlRing::WriteTd().