128 DPRINT(
"CUSBQueue::Initialize()\n");
206 DPRINT1(
"Failed to allocate sync frame list\n");
221 DPRINT1(
"Failed to create queue head\n");
231 QueueHead->EndPointCharacteristics.MaximumPacketLength = 64;
232 QueueHead->EndPointCharacteristics.NakCountReload = 0x3;
234 QueueHead->EndPointCapabilities.NumberOfTransactionPerFrame = 0x01;
235 QueueHead->PhysicalAddr = QueueHeadPhysAddr.
LowPart;
236 QueueHead->Token.Bits.Halted =
TRUE;
256 DPRINT(
"Index %lu IntervalIndex %lu\n",
Index, IntervalIndex);
276 CUSBQueue::AddUSBRequest(
356 CUSBQueue::CreateUSBRequest(
357 IUSBRequest **OutRequest)
367 *OutRequest = UsbRequest;
400 return IntervalIndex;
617 DPRINT1(
"Warning; Only %lu QueueHeads in HeadQueueHead\n",
Index);
635 return FirstQueueHead;
670 while(InterruptQueueHead !=
NULL)
672 if (InterruptQueueHead == QueueHead)
676 LastQueueHead = InterruptQueueHead;
680 if (InterruptQueueHead != QueueHead)
786 *ShouldRingDoorBell =
TRUE;
861 *ShouldRingDoorBell =
TRUE;
874 CUSBQueue::InterruptCallback(
878 DPRINT(
"CUSBQueue::InterruptCallback\n");
888 *ShouldRingDoorBell =
FALSE;
967 Request->FreeQueueHead(CurrentQH);
989 DPRINT1(
"Unable to create a new QueueHead\n");
1000 DPRINT1(
"URB failed with status 0x%x\n", UrbStatus);
1014 Request->FreeQueueHead(CurrentQH);
1019 ShouldReleaseWhenDone =
Request->ShouldReleaseRequestAfterCompletion();
1029 if (ShouldReleaseWhenDone)
1044 CUSBQueue::CompleteAsyncRequests()
1050 DPRINT(
"CUSBQueue::CompleteAsyncRequests\n");
1119 CUSBQueue::AbortDevicePipe(
1133 DPRINT1(
"AbortDevicePipe DeviceAddress %x EndpointDescriptor %p Addr %x\n",
DeviceAddress, EndpointDescriptor, EndpointDescriptor->bEndpointAddress);
LIST_ENTRY m_CompletedRequestAsyncList
ULONG InterruptScheduleMask
#define STATUS_INSUFFICIENT_RESOURCES
#define _ReadWriteBarrier()
IUSBHardwareDevice * PUSBHARDWAREDEVICE
STDMETHODIMP_(ULONG) Release()
struct _LIST_ENTRY * Blink
END_POINT_CHARACTERISTICS EndPointCharacteristics
ULONG m_MaxPeriodicListEntries
VOID QueueHeadCompletion(PQUEUE_HEAD QueueHead, NTSTATUS Status)
VOID QueueHeadInterruptCompletion(PQUEUE_HEAD QueueHead, NTSTATUS Status)
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
ULONG HorizontalLinkPointer
#define USB_ENDPOINT_TYPE_CONTROL
#define InsertTailList(ListHead, Entry)
BOOLEAN IsQueueHeadComplete(PUHCI_QUEUE_HEAD QueueHead)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define IsEqualGUIDAligned(guid1, guid2)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
#define USBD_STATUS_INSUFFICIENT_RESOURCES
_In_ NDIS_HANDLE _In_ PNDIS_REQUEST Request
PQUEUE_HEAD AsyncListQueueHead
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define USBD_STATUS_BABBLE_DETECTED
_In_ PUSB_DEVICE_HANDLE _Out_ PUSHORT DeviceAddress
PEHCIHARDWAREDEVICE m_Hardware
VOID ProcessPeriodicSchedule(IN NTSTATUS Status, OUT PULONG ShouldRingDoorBell)
#define QH_ENDPOINT_HIGHSPEED
UCHAR GetIntervalIndex(UCHAR Interval)
VOID LinkInterruptQueueHead(PQUEUE_HEAD QueueHead)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
NTSTATUS InitializeSyncSchedule(IN PEHCIHARDWAREDEVICE Hardware, IN PDMAMEMORYMANAGER MemManager)
struct _QUEUE_HEAD * PQUEUE_HEAD
VOID ProcessAsyncList(IN NTSTATUS Status, OUT PULONG ShouldRingDoorBell)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
NTSTATUS NTAPI CreateUSBQueue(PUSBQUEUE *OutUsbQueue)
enum _USB_DEVICE_SPEED USB_DEVICE_SPEED
STDMETHODIMP QueryInterface(REFIID InterfaceId, PVOID *Interface)
IEHCIHardwareDevice * PEHCIHARDWAREDEVICE
struct _LIST_ENTRY * Flink
STDMETHODIMP_(ULONG) AddRef()
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
VOID QueueHeadCleanup(PQUEUE_HEAD QueueHead)
#define USBD_STATUS_DATA_BUFFER_ERROR
#define NT_SUCCESS(StatCode)
#define KeAcquireSpinLock(sl, irql)
static const UCHAR Index[8]
#define STDMETHODCALLTYPE
#define USB_ENDPOINT_TYPE_ISOCHRONOUS
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
#define USBD_STATUS_SUCCESS
PQUEUE_HEAD m_InterruptQueueHeads[EHCI_INTERRUPT_ENTRIES_COUNT]
#define InterlockedDecrement
#define EHCI_INTERRUPT_ENTRIES_COUNT
union _QUEUE_HEAD::@1275 Token
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG IN OUT PLONG IN LONG Increment IN PNDIS_RW_LOCK Lock
#define USB_ENDPOINT_TYPE_BULK
#define TERMINATE_POINTER
#define USBD_STATUS_STALL_PID
VOID LinkQueueHeadChain(PQUEUE_HEAD HeadQueueHead, PQUEUE_HEAD NewQueueHead)
LIST_ENTRY m_PeriodicQueueHeads
#define InterlockedIncrement
VOID UnlinkQueueHead(PQUEUE_HEAD QueueHead)
#define InitializeListHead(ListHead)
IUSBRequest * PUSBREQUEST
BOOL Initialize(HINSTANCE hInstance)
IEHCIRequest * PEHCIREQUEST
IDMAMemoryManager * PDMAMEMORYMANAGER
#define KeReleaseSpinLock(sl, irql)
static ULONG WINAPI AddRef(IStream *iface)
END_POINT_CAPABILITIES EndPointCapabilities
#define EHCI_FRAMELIST_ENTRIES_COUNT
LIST_ENTRY LinkedQueueHeads
NTSTATUS NTAPI InternalCreateUSBRequest(PUSBREQUEST *OutRequest)
#define STATUS_NOT_SUPPORTED
ULONG SplitCompletionMask
PQUEUE_HEAD UnlinkQueueHeadChain(PQUEUE_HEAD HeadQueueHead, ULONG Count)
IMP_IUSBQUEUE IMP_IEHCIQUEUE CUSBQueue(IUnknown *OuterUnknown)
LIST_ENTRY m_PendingRequestAsyncList
_In_ PUSBD_PIPE_INFORMATION _In_ USB_DEVICE_SPEED DeviceSpeed
VOID LinkQueueHead(PQUEUE_HEAD HeadQueueHead, PQUEUE_HEAD NewQueueHead)
base of all file and directory entries
ULONG m_MaxPollingInterval
PHYSICAL_ADDRESS m_SyncFrameListAddr
#define USB_ENDPOINT_TYPE_INTERRUPT
PULONG MinorVersion OPTIONAL