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/hcd_controller.cpp
5 * PURPOSE: USB EHCI device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
14 class CUSBHardwareDevice
: public IUSBHardwareDevice
17 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
19 STDMETHODIMP_(ULONG
) AddRef()
21 InterlockedIncrement(&m_Ref
);
24 STDMETHODIMP_(ULONG
) Release()
26 InterlockedDecrement(&m_Ref
);
36 NTSTATUS
Initialize(PDRIVER_OBJECT DriverObject
, PDEVICE_OBJECT FunctionalDeviceObject
, PDEVICE_OBJECT PhysicalDeviceObject
, PDEVICE_OBJECT LowerDeviceObject
);
37 NTSTATUS
PnpStart(PCM_RESOURCE_LIST RawResources
, PCM_RESOURCE_LIST TranslatedResources
);
38 NTSTATUS
PnpStop(void);
39 NTSTATUS
HandlePower(PIRP Irp
);
40 NTSTATUS
GetDeviceDetails(PULONG VendorId
, PULONG DeviceId
, PULONG NumberOfPorts
, PULONG Speed
);
41 NTSTATUS
GetDmaMemoryManager(OUT
struct IDMAMemoryManager
**OutMemoryManager
);
42 NTSTATUS
GetUSBQueue(OUT
struct IUSBQueue
**OutUsbQueue
);
43 NTSTATUS
ResetController();
44 NTSTATUS
ResetPort(ULONG PortIndex
);
45 KIRQL
AcquireDeviceLock(void);
46 VOID
ReleaseDeviceLock(KIRQL OldLevel
);
48 BOOLEAN
InterruptService();
51 friend BOOLEAN NTAPI
InterruptServiceRoutine(IN PKINTERRUPT Interrupt
, IN PVOID ServiceContext
);
53 // constructor / destructor
54 CUSBHardwareDevice(IUnknown
*OuterUnknown
){}
55 virtual ~CUSBHardwareDevice(){}
59 PDRIVER_OBJECT m_DriverObject
;
60 PDEVICE_OBJECT m_PhysicalDeviceObject
;
61 PDEVICE_OBJECT m_FunctionalDeviceObject
;
62 PDEVICE_OBJECT m_NextDeviceObject
;
64 PKINTERRUPT m_Interrupt
;
66 PDMA_ADAPTER m_Adapter
;
70 //=================================================================================================
75 CUSBHardwareDevice::QueryInterface(
79 if (IsEqualGUIDAligned(refiid
, IID_IUnknown
))
81 *Output
= PVOID(PUNKNOWN(this));
82 PUNKNOWN(*Output
)->AddRef();
83 return STATUS_SUCCESS
;
86 return STATUS_UNSUCCESSFUL
;
90 CUSBHardwareDevice::Initialize(
91 PDRIVER_OBJECT DriverObject
,
92 PDEVICE_OBJECT FunctionalDeviceObject
,
93 PDEVICE_OBJECT PhysicalDeviceObject
,
94 PDEVICE_OBJECT LowerDeviceObject
)
97 DPRINT1("CUSBHardwareDevice::Initialize\n");
100 // store device objects
102 m_DriverObject
= DriverObject
;
103 m_FunctionalDeviceObject
= FunctionalDeviceObject
;
104 m_PhysicalDeviceObject
= PhysicalDeviceObject
;
105 m_NextDeviceObject
= LowerDeviceObject
;
108 // initialize device lock
110 KeInitializeSpinLock(&m_Lock
);
112 return STATUS_SUCCESS
;
117 CUSBHardwareDevice::PnpStart(
118 PCM_RESOURCE_LIST RawResources
,
119 PCM_RESOURCE_LIST TranslatedResources
)
122 PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor
;
123 DEVICE_DESCRIPTION DeviceDescription
;
127 DPRINT1("CUSBHardwareDevice::PnpStart\n");
128 for(Index
= 0; Index
< TranslatedResources
->List
[0].PartialResourceList
.Count
; Index
++)
131 // get resource descriptor
133 ResourceDescriptor
= &TranslatedResources
->List
[0].PartialResourceList
.PartialDescriptors
[Index
];
135 switch(ResourceDescriptor
->Type
)
137 case CmResourceTypeInterrupt
:
139 Status
= IoConnectInterrupt(&m_Interrupt
,
140 InterruptServiceRoutine
,
143 ResourceDescriptor
->u
.Interrupt
.Vector
,
144 (KIRQL
)ResourceDescriptor
->u
.Interrupt
.Level
,
145 (KIRQL
)ResourceDescriptor
->u
.Interrupt
.Level
,
146 (KINTERRUPT_MODE
)(ResourceDescriptor
->Flags
& CM_RESOURCE_INTERRUPT_LATCHED
),
147 (ResourceDescriptor
->ShareDisposition
!= CmResourceShareDeviceExclusive
),
148 ResourceDescriptor
->u
.Interrupt
.Affinity
,
151 if (!NT_SUCCESS(Status
))
154 // failed to register interrupt
156 DPRINT1("IoConnect Interrupt failed with %x\n", Status
);
161 case CmResourceTypeMemory
:
166 ResourceBase
= MmMapIoSpace(ResourceDescriptor
->u
.Memory
.Start
, ResourceDescriptor
->u
.Memory
.Length
, MmNonCached
);
170 // failed to map registers
172 DPRINT1("MmMapIoSpace failed\n");
173 return STATUS_INSUFFICIENT_RESOURCES
;
177 //FIXME: query capabilities and update m_Base
186 // zero device description
188 RtlZeroMemory(&DeviceDescription
, sizeof(DEVICE_DESCRIPTION
));
191 // initialize device description
193 DeviceDescription
.Version
= DEVICE_DESCRIPTION_VERSION
;
194 DeviceDescription
.Master
= TRUE
;
195 DeviceDescription
.ScatterGather
= TRUE
;
196 DeviceDescription
.Dma32BitAddresses
= TRUE
;
197 DeviceDescription
.DmaWidth
= Width32Bits
;
198 DeviceDescription
.InterfaceType
= PCIBus
;
199 DeviceDescription
.MaximumLength
= MAXULONG
;
204 m_Adapter
= IoGetDmaAdapter(m_PhysicalDeviceObject
, &DeviceDescription
, &m_MapRegisters
);
208 // failed to get dma adapter
210 DPRINT1("Failed to acquire dma adapter\n");
211 return STATUS_INSUFFICIENT_RESOURCES
;
214 return STATUS_SUCCESS
;
218 CUSBHardwareDevice::PnpStop(void)
221 return STATUS_NOT_IMPLEMENTED
;
225 CUSBHardwareDevice::HandlePower(
229 return STATUS_NOT_IMPLEMENTED
;
233 CUSBHardwareDevice::GetDeviceDetails(
234 OUT OPTIONAL PULONG VendorId
,
235 OUT OPTIONAL PULONG DeviceId
,
236 OUT OPTIONAL PULONG NumberOfPorts
,
237 OUT OPTIONAL PULONG Speed
)
240 return STATUS_NOT_IMPLEMENTED
;
245 CUSBHardwareDevice::GetDmaMemoryManager(
246 OUT
struct IDMAMemoryManager
**OutMemoryManager
)
249 return STATUS_NOT_IMPLEMENTED
;
254 CUSBHardwareDevice::GetUSBQueue(
255 OUT
struct IUSBQueue
**OutUsbQueue
)
258 return STATUS_NOT_IMPLEMENTED
;
263 CUSBHardwareDevice::ResetController(void)
266 return STATUS_NOT_IMPLEMENTED
;
270 CUSBHardwareDevice::ResetPort(
274 return STATUS_NOT_IMPLEMENTED
;
278 CUSBHardwareDevice::AcquireDeviceLock(void)
285 KeAcquireSpinLock(&m_Lock
, &OldLevel
);
295 CUSBHardwareDevice::ReleaseDeviceLock(
298 KeReleaseSpinLock(&m_Lock
, OldLevel
);
303 InterruptServiceRoutine(
304 IN PKINTERRUPT Interrupt
,
305 IN PVOID ServiceContext
)
313 PUSBHARDWAREDEVICE
*OutHardware
)
315 PUSBHARDWAREDEVICE This
;
317 This
= new(NonPagedPool
, 0) CUSBHardwareDevice(0);
319 return STATUS_INSUFFICIENT_RESOURCES
;
324 *OutHardware
= (PUSBHARDWAREDEVICE
)This
;
326 return STATUS_SUCCESS
;