[USBOHCI]
[reactos.git] / drivers / usb / usbohci / 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/usbohci/usb_queue.cpp
5 * PURPOSE: USB OHCI device driver.
6 * PROGRAMMERS:
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
9 */
10
11 #include "usbohci.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 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);
41
42 // constructor / destructor
43 CUSBQueue(IUnknown *OuterUnknown){}
44 virtual ~CUSBQueue(){}
45
46 protected:
47 LONG m_Ref; // reference count
48 KSPIN_LOCK m_Lock; // list lock
49 };
50
51 //=================================================================================================
52 // COM
53 //
54 NTSTATUS
55 STDMETHODCALLTYPE
56 CUSBQueue::QueryInterface(
57 IN REFIID refiid,
58 OUT PVOID* Output)
59 {
60 if (IsEqualGUIDAligned(refiid, IID_IUnknown))
61 {
62 *Output = PVOID(PUNKNOWN(this));
63 PUNKNOWN(*Output)->AddRef();
64 return STATUS_SUCCESS;
65 }
66
67 return STATUS_UNSUCCESSFUL;
68 }
69
70 NTSTATUS
71 CUSBQueue::Initialize(
72 IN PUSBHARDWAREDEVICE Hardware,
73 IN PDMA_ADAPTER AdapterObject,
74 IN PDMAMEMORYMANAGER MemManager,
75 IN OPTIONAL PKSPIN_LOCK Lock)
76 {
77 UNIMPLEMENTED
78 return STATUS_SUCCESS;
79 }
80
81 ULONG
82 CUSBQueue::GetPendingRequestCount()
83 {
84 //
85 // Loop through the pending list and iterrate one for each QueueHead that
86 // has a IRP to complete.
87 //
88
89 return 0;
90 }
91
92 NTSTATUS
93 CUSBQueue::AddUSBRequest(
94 IUSBRequest * Request)
95 {
96 NTSTATUS Status;
97 ULONG Type;
98 KIRQL OldLevel;
99
100 //
101 // sanity check
102 //
103 ASSERT(Request != NULL);
104
105 //
106 // get request type
107 //
108 Type = Request->GetTransferType();
109
110 //
111 // check if supported
112 //
113 switch(Type)
114 {
115 case USB_ENDPOINT_TYPE_ISOCHRONOUS:
116 case USB_ENDPOINT_TYPE_INTERRUPT:
117 /* NOT IMPLEMENTED IN QUEUE */
118 Status = STATUS_NOT_SUPPORTED;
119 break;
120 case USB_ENDPOINT_TYPE_BULK:
121 case USB_ENDPOINT_TYPE_CONTROL:
122 Status = STATUS_SUCCESS;
123 break;
124 default:
125 /* BUG */
126 PC_ASSERT(FALSE);
127 Status = STATUS_NOT_SUPPORTED;
128 }
129
130 //
131 // check for success
132 //
133 if (!NT_SUCCESS(Status))
134 {
135 //
136 // request not supported, please try later
137 //
138 return Status;
139 }
140
141 //
142 // add extra reference which is released when the request is completed
143 //
144 Request->AddRef();
145
146
147 return STATUS_SUCCESS;
148 }
149
150 NTSTATUS
151 CUSBQueue::CancelRequests()
152 {
153 UNIMPLEMENTED
154 return STATUS_NOT_IMPLEMENTED;
155 }
156
157 NTSTATUS
158 CUSBQueue::CreateUSBRequest(
159 IUSBRequest **OutRequest)
160 {
161 PUSBREQUEST UsbRequest;
162 NTSTATUS Status;
163
164 *OutRequest = NULL;
165 Status = InternalCreateUSBRequest(&UsbRequest);
166
167 if (NT_SUCCESS(Status))
168 {
169 *OutRequest = UsbRequest;
170 }
171
172 return Status;
173 }
174
175
176 NTSTATUS
177 CreateUSBQueue(
178 PUSBQUEUE *OutUsbQueue)
179 {
180 PUSBQUEUE This;
181
182 //
183 // allocate controller
184 //
185 This = new(NonPagedPool, TAG_USBOHCI) CUSBQueue(0);
186 if (!This)
187 {
188 //
189 // failed to allocate
190 //
191 return STATUS_INSUFFICIENT_RESOURCES;
192 }
193
194 //
195 // add reference count
196 //
197 This->AddRef();
198
199 //
200 // return result
201 //
202 *OutUsbQueue = (PUSBQUEUE)This;
203
204 //
205 // done
206 //
207 return STATUS_SUCCESS;
208 }