[USBEHCI_NEW]
[reactos.git] / drivers / usb / usbehci_new / usb_queue.cpp
1 /*
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/usbehci/usb_queue.cpp
5 * PURPOSE: USB EHCI device driver.
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 */
10
11 #include "usbehci.h"
12 #include "hardware.h"
13
14 class CUSBQueue : public IUSBQueue
15 {
16 public:
17 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
18
19 STDMETHODIMP_(ULONG) AddRef()
20 {
21 InterlockedIncrement(&m_Ref);
22 return m_Ref;
23 }
24 STDMETHODIMP_(ULONG) Release()
25 {
26 InterlockedDecrement(&m_Ref);
27
28 if (!m_Ref)
29 {
30 delete this;
31 return 0;
32 }
33 return m_Ref;
34 }
35
36 NTSTATUS Initialize(IN PUSBHARDWAREDEVICE Hardware, PADAPTER_OBJECT AdapterObject, IN OPTIONAL PKSPIN_LOCK Lock);
37 ULONG GetPendingRequestCount();
38 NTSTATUS AddUSBRequest(PURB Urb);
39 NTSTATUS AddUSBRequest(IUSBRequest * Request);
40 NTSTATUS CancelRequests();
41 NTSTATUS CreateUSBRequest(IUSBRequest **OutRequest);
42
43 // constructor / destructor
44 CUSBQueue(IUnknown *OuterUnknown){}
45 virtual ~CUSBQueue(){}
46
47 protected:
48 LONG m_Ref;
49 PDMA_ADAPTER m_Adapter;
50 PQUEUE_HEAD ExecutingList;
51 PQUEUE_HEAD PendingList;
52 IDMAMemoryManager *m_MemoryManager;
53 };
54
55 //=================================================================================================
56 // COM
57 //
58 NTSTATUS
59 STDMETHODCALLTYPE
60 CUSBQueue::QueryInterface(
61 IN REFIID refiid,
62 OUT PVOID* Output)
63 {
64 if (IsEqualGUIDAligned(refiid, IID_IUnknown))
65 {
66 *Output = PVOID(PUNKNOWN(this));
67 PUNKNOWN(*Output)->AddRef();
68 return STATUS_SUCCESS;
69 }
70
71 return STATUS_UNSUCCESSFUL;
72 }
73
74 NTSTATUS
75 CUSBQueue::Initialize(
76 IN PUSBHARDWAREDEVICE Hardware,
77 PADAPTER_OBJECT AdapterObject,
78 IN OPTIONAL PKSPIN_LOCK Lock)
79 {
80 NTSTATUS Status;
81
82 ASSERT(Hardware);
83 ASSERT(AdapterObject);
84
85 Status = CreateDMAMemoryManager(&m_MemoryManager);
86 if (!NT_SUCCESS(Status))
87 {
88 DPRINT1("Failed to create DMAMemoryManager Object\n");
89 return Status;
90 }
91
92 return STATUS_SUCCESS;
93 }
94
95 ULONG
96 CUSBQueue::GetPendingRequestCount()
97 {
98 UNIMPLEMENTED
99 return 0;
100 }
101
102 NTSTATUS
103 CUSBQueue::AddUSBRequest(
104 IUSBRequest * Request)
105 {
106 UNIMPLEMENTED
107 return STATUS_NOT_IMPLEMENTED;
108 }
109
110 NTSTATUS
111 CUSBQueue::AddUSBRequest(
112 PURB Urb)
113 {
114 UNIMPLEMENTED
115 return STATUS_NOT_IMPLEMENTED;
116 }
117
118 NTSTATUS
119 CUSBQueue::CancelRequests()
120 {
121 UNIMPLEMENTED
122 return STATUS_NOT_IMPLEMENTED;
123 }
124
125 NTSTATUS
126 CUSBQueue::CreateUSBRequest(
127 IUSBRequest **OutRequest)
128 {
129 UNIMPLEMENTED
130 return STATUS_NOT_IMPLEMENTED;
131 }
132
133 NTSTATUS
134 CreateUSBQueue(
135 PUSBQUEUE *OutUsbQueue)
136 {
137 PUSBQUEUE This;
138
139 //
140 // allocate controller
141 //
142 This = new(NonPagedPool, TAG_USBEHCI) CUSBQueue(0);
143 if (!This)
144 {
145 //
146 // failed to allocate
147 //
148 return STATUS_INSUFFICIENT_RESOURCES;
149 }
150
151 //
152 // add reference count
153 //
154 This->AddRef();
155
156 //
157 // return result
158 //
159 *OutUsbQueue = (PUSBQUEUE)This;
160
161 //
162 // done
163 //
164 return STATUS_SUCCESS;
165 }