2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbohci/usb_queue.cpp
5 * PURPOSE: USB OHCI device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
14 class CUSBQueue
: public IUSBQueue
17 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
19 STDMETHODIMP_(ULONG
) AddRef()
21 InterlockedIncrement(&m_Ref
);
24 STDMETHODIMP_(ULONG
) Release()
26 InterlockedDecrement(&m_Ref
);
36 virtual NTSTATUS
Initialize(IN PUSBHARDWAREDEVICE Hardware
, PDMA_ADAPTER AdapterObject
, IN PDMAMEMORYMANAGER MemManager
, IN OPTIONAL PKSPIN_LOCK Lock
);
37 virtual ULONG
GetPendingRequestCount();
38 virtual NTSTATUS
AddUSBRequest(IUSBRequest
* Request
);
39 virtual NTSTATUS
CancelRequests();
40 virtual NTSTATUS
CreateUSBRequest(IUSBRequest
**OutRequest
);
42 // constructor / destructor
43 CUSBQueue(IUnknown
*OuterUnknown
){}
44 virtual ~CUSBQueue(){}
47 LONG m_Ref
; // reference count
48 KSPIN_LOCK m_Lock
; // list lock
51 //=================================================================================================
56 CUSBQueue::QueryInterface(
60 if (IsEqualGUIDAligned(refiid
, IID_IUnknown
))
62 *Output
= PVOID(PUNKNOWN(this));
63 PUNKNOWN(*Output
)->AddRef();
64 return STATUS_SUCCESS
;
67 return STATUS_UNSUCCESSFUL
;
71 CUSBQueue::Initialize(
72 IN PUSBHARDWAREDEVICE Hardware
,
73 IN PDMA_ADAPTER AdapterObject
,
74 IN PDMAMEMORYMANAGER MemManager
,
75 IN OPTIONAL PKSPIN_LOCK Lock
)
78 return STATUS_SUCCESS
;
82 CUSBQueue::GetPendingRequestCount()
85 // Loop through the pending list and iterrate one for each QueueHead that
86 // has a IRP to complete.
93 CUSBQueue::AddUSBRequest(
94 IUSBRequest
* Request
)
103 ASSERT(Request
!= NULL
);
108 Type
= Request
->GetTransferType();
111 // check if supported
115 case USB_ENDPOINT_TYPE_ISOCHRONOUS
:
116 case USB_ENDPOINT_TYPE_INTERRUPT
:
117 /* NOT IMPLEMENTED IN QUEUE */
118 Status
= STATUS_NOT_SUPPORTED
;
120 case USB_ENDPOINT_TYPE_BULK
:
121 case USB_ENDPOINT_TYPE_CONTROL
:
122 Status
= STATUS_SUCCESS
;
127 Status
= STATUS_NOT_SUPPORTED
;
133 if (!NT_SUCCESS(Status
))
136 // request not supported, please try later
142 // add extra reference which is released when the request is completed
147 return STATUS_SUCCESS
;
151 CUSBQueue::CancelRequests()
154 return STATUS_NOT_IMPLEMENTED
;
158 CUSBQueue::CreateUSBRequest(
159 IUSBRequest
**OutRequest
)
161 PUSBREQUEST UsbRequest
;
165 Status
= InternalCreateUSBRequest(&UsbRequest
);
167 if (NT_SUCCESS(Status
))
169 *OutRequest
= UsbRequest
;
178 PUSBQUEUE
*OutUsbQueue
)
183 // allocate controller
185 This
= new(NonPagedPool
, TAG_USBOHCI
) CUSBQueue(0);
189 // failed to allocate
191 return STATUS_INSUFFICIENT_RESOURCES
;
195 // add reference count
202 *OutUsbQueue
= (PUSBQUEUE
)This
;
207 return STATUS_SUCCESS
;