mirror of
https://github.com/reactos/reactos.git
synced 2024-07-28 23:29:19 +00:00
166 lines
3.2 KiB
C++
166 lines
3.2 KiB
C++
![]() |
/*
|
||
|
* PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
|
||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||
|
* FILE: drivers/usb/usbehci/usb_queue.cpp
|
||
|
* PURPOSE: USB EHCI device driver.
|
||
|
* PROGRAMMERS:
|
||
|
* Michael Martin (michael.martin@reactos.org)
|
||
|
* Johannes Anderwald (johannes.anderwald@reactos.org)
|
||
|
*/
|
||
|
|
||
|
#include "usbehci.h"
|
||
|
#include "hardware.h"
|
||
|
|
||
|
class CUSBQueue : public IUSBQueue
|
||
|
{
|
||
|
public:
|
||
|
STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
|
||
|
|
||
|
STDMETHODIMP_(ULONG) AddRef()
|
||
|
{
|
||
|
InterlockedIncrement(&m_Ref);
|
||
|
return m_Ref;
|
||
|
}
|
||
|
STDMETHODIMP_(ULONG) Release()
|
||
|
{
|
||
|
InterlockedDecrement(&m_Ref);
|
||
|
|
||
|
if (!m_Ref)
|
||
|
{
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
return m_Ref;
|
||
|
}
|
||
|
|
||
|
NTSTATUS Initialize(IN PUSBHARDWAREDEVICE Hardware, PADAPTER_OBJECT AdapterObject, IN OPTIONAL PKSPIN_LOCK Lock);
|
||
|
ULONG GetPendingRequestCount();
|
||
|
NTSTATUS AddUSBRequest(PURB Urb);
|
||
|
NTSTATUS AddUSBRequest(IUSBRequest * Request);
|
||
|
NTSTATUS CancelRequests();
|
||
|
NTSTATUS CreateUSBRequest(IUSBRequest **OutRequest);
|
||
|
|
||
|
// constructor / destructor
|
||
|
CUSBQueue(IUnknown *OuterUnknown){}
|
||
|
virtual ~CUSBQueue(){}
|
||
|
|
||
|
protected:
|
||
|
LONG m_Ref;
|
||
|
PDMA_ADAPTER m_Adapter;
|
||
|
PQUEUE_HEAD ExecutingList;
|
||
|
PQUEUE_HEAD PendingList;
|
||
|
IDMAMemoryManager *m_MemoryManager;
|
||
|
};
|
||
|
|
||
|
//=================================================================================================
|
||
|
// COM
|
||
|
//
|
||
|
NTSTATUS
|
||
|
STDMETHODCALLTYPE
|
||
|
CUSBQueue::QueryInterface(
|
||
|
IN REFIID refiid,
|
||
|
OUT PVOID* Output)
|
||
|
{
|
||
|
if (IsEqualGUIDAligned(refiid, IID_IUnknown))
|
||
|
{
|
||
|
*Output = PVOID(PUNKNOWN(this));
|
||
|
PUNKNOWN(*Output)->AddRef();
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
return STATUS_UNSUCCESSFUL;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CUSBQueue::Initialize(
|
||
|
IN PUSBHARDWAREDEVICE Hardware,
|
||
|
PADAPTER_OBJECT AdapterObject,
|
||
|
IN OPTIONAL PKSPIN_LOCK Lock)
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
ASSERT(Hardware);
|
||
|
ASSERT(AdapterObject);
|
||
|
|
||
|
Status = CreateDMAMemoryManager(&m_MemoryManager);
|
||
|
if (!NT_SUCCESS(Status))
|
||
|
{
|
||
|
DPRINT1("Failed to create DMAMemoryManager Object\n");
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
ULONG
|
||
|
CUSBQueue::GetPendingRequestCount()
|
||
|
{
|
||
|
UNIMPLEMENTED
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CUSBQueue::AddUSBRequest(
|
||
|
IUSBRequest * Request)
|
||
|
{
|
||
|
UNIMPLEMENTED
|
||
|
return STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CUSBQueue::AddUSBRequest(
|
||
|
PURB Urb)
|
||
|
{
|
||
|
UNIMPLEMENTED
|
||
|
return STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CUSBQueue::CancelRequests()
|
||
|
{
|
||
|
UNIMPLEMENTED
|
||
|
return STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CUSBQueue::CreateUSBRequest(
|
||
|
IUSBRequest **OutRequest)
|
||
|
{
|
||
|
UNIMPLEMENTED
|
||
|
return STATUS_NOT_IMPLEMENTED;
|
||
|
}
|
||
|
|
||
|
NTSTATUS
|
||
|
CreateUSBQueue(
|
||
|
PUSBQUEUE *OutUsbQueue)
|
||
|
{
|
||
|
PUSBQUEUE This;
|
||
|
|
||
|
//
|
||
|
// allocate controller
|
||
|
//
|
||
|
This = new(NonPagedPool, TAG_USBEHCI) CUSBQueue(0);
|
||
|
if (!This)
|
||
|
{
|
||
|
//
|
||
|
// failed to allocate
|
||
|
//
|
||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// add reference count
|
||
|
//
|
||
|
This->AddRef();
|
||
|
|
||
|
//
|
||
|
// return result
|
||
|
//
|
||
|
*OutUsbQueue = (PUSBQUEUE)This;
|
||
|
|
||
|
//
|
||
|
// done
|
||
|
//
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|