Author: mjmartin
Date: Sat Jan 9 20:28:29 2010
New Revision: 45017
URL:
http://svn.reactos.org/svn/reactos?rev=45017&view=rev
Log:
[usb/usbehci]
- Added numerous structures required for Asynchronous Lists used to communicate with
controller. Needs much more work.
- Implement initial retrieving Device and String Descriptors from USB devices.
- Fixed improper handling of Queued IRPs that was causing crashes.
- For now, always queue the Irp if the request is a Urb of type Get Descriptor.
- Reorganized code to trim down source files.
Added:
trunk/reactos/drivers/usb/usbehci/irp.c (with props)
trunk/reactos/drivers/usb/usbehci/urbreq.c (with props)
Modified:
trunk/reactos/drivers/usb/usbehci/common.c
trunk/reactos/drivers/usb/usbehci/fdo.c
trunk/reactos/drivers/usb/usbehci/misc.c
trunk/reactos/drivers/usb/usbehci/pdo.c
trunk/reactos/drivers/usb/usbehci/usbehci.c
trunk/reactos/drivers/usb/usbehci/usbehci.h
trunk/reactos/drivers/usb/usbehci/usbehci.rbuild
Modified: trunk/reactos/drivers/usb/usbehci/common.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/common…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/common.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/common.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,3 +1,11 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/common.c
+ * PURPOSE: Common operations in FDO/PDO.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
#define INITGUID
#include "usbehci.h"
Modified: trunk/reactos/drivers/usb/usbehci/fdo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/fdo.c?…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,3 +1,11 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/fdo.c
+ * PURPOSE: USB EHCI device driver.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
/* INCLUDES *******************************************************************/
#include "usbehci.h"
@@ -73,7 +81,7 @@
tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i)));
DPRINT("port tmp %x\n", tmp);
-
+ GetDeviceDescriptor(FdoDeviceExtension, 0);
FdoDeviceExtension->ChildDeviceCount++;
CompletePendingRequest(FdoDeviceExtension);
@@ -145,7 +153,7 @@
if (CStatus & EHCI_STS_HALT)
{
- DPRINT("EHCI: Host Controller unexpected halt.\n");
+ DPRINT1("EHCI: Host Controller unexpected halt.\n");
/* FIXME: Reset the controller */
}
Added: trunk/reactos/drivers/usb/usbehci/irp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/irp.c?…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/irp.c (added)
+++ trunk/reactos/drivers/usb/usbehci/irp.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,0 +1,144 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/irp.c
+ * PURPOSE: IRP Handling.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
+
+#include "usbehci.h"
+
+VOID
+RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+ PPDO_DEVICE_EXTENSION PdoDeviceExtension;
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+
+ PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)
PdoDeviceExtension->ControllerFdo->DeviceExtension;
+
+ KIRQL OldIrql = Irp->CancelIrql;
+ IoReleaseCancelSpinLock(DISPATCH_LEVEL);
+
+ KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->IrpQueueLock);
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+ KeReleaseSpinLock(&FdoDeviceExtension->IrpQueueLock, OldIrql);
+
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+VOID
+QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
+{
+ KIRQL OldIrql;
+
+ KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &OldIrql);
+
+ if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL))
+ {
+ KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql);
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+ else
+ {
+ InsertTailList(&DeviceExtension->IrpQueue,
&Irp->Tail.Overlay.ListEntry);
+ KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql);
+ }
+}
+
+VOID
+CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
+{
+ PLIST_ENTRY NextIrp = NULL;
+ PIO_STACK_LOCATION Stack;
+ KIRQL oldIrql;
+ PIRP Irp = NULL;
+ URB *Urb;
+
+ KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
+
+ while(!IsListEmpty(&DeviceExtension->IrpQueue))
+ {
+ NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue);
+ Irp = CONTAINING_RECORD(NextIrp, IRP, Tail.Overlay.ListEntry);
+
+ if (!Irp)
+ break;
+
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(Stack);
+
+ Urb = (PURB) Stack->Parameters.Others.Argument1;
+ ASSERT(Urb);
+
+ /* FIXME: Fill in information for Argument1/URB */
+
+ DPRINT("TransferBuffer %x\n",
Urb->UrbControlDescriptorRequest.TransferBuffer);
+ DPRINT("TransferBufferLength %x\n",
Urb->UrbControlDescriptorRequest.TransferBufferLength);
+ DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
+ DPRINT("DescriptorType %x\n",
Urb->UrbControlDescriptorRequest.DescriptorType);
+ DPRINT("LanguageId %x\n",
Urb->UrbControlDescriptorRequest.LanguageId);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
+}
+
+NTSTATUS
+NTAPI
+ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext)
+{
+ IoFreeIrp(Irp);
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+VOID
+DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
+{
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PIO_STACK_LOCATION IrpStack = NULL;
+ PDEVICE_OBJECT PortDeviceObject = NULL;
+ PIRP Irp = NULL;
+
+ FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)Context;
+
+ PortDeviceObject = IoGetAttachedDeviceReference(FdoDeviceExtension->Pdo);
+
+ if (!PortDeviceObject)
+ {
+ DPRINT1("Unable to notify Pdos parent of device arrival.\n");
+ return;
+ }
+
+ Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE);
+
+ if (!Irp)
+ {
+ DPRINT1("Unable to allocate IRP\n");
+ }
+
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion,
+ NULL,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ IrpStack = IoGetNextIrpStackLocation(Irp);
+ IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation;
+ IrpStack->MajorFunction = IRP_MJ_PNP;
+ IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
+
+ IoCallDriver(PortDeviceObject, Irp);
+}
+
Propchange: trunk/reactos/drivers/usb/usbehci/irp.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/drivers/usb/usbehci/misc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/misc.c…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/misc.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/misc.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,121 +1,13 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/misc.c
+ * PURPOSE: Misceallenous operations.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
#include "usbehci.h"
-
-VOID
-QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
-{
- KIRQL oldIrql;
-
- KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
- InsertTailList(&DeviceExtension->IrpQueue,
&Irp->Tail.Overlay.ListEntry);
- KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
-}
-
-VOID
-CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension)
-{
- PLIST_ENTRY NextIrp = NULL;
- PIO_STACK_LOCATION Stack;
- KIRQL oldIrql;
- PIRP Irp = NULL;
- URB *Urb;
-
- KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
-
- /* No Irps in Queue? */
- if (IsListEmpty(&DeviceExtension->IrpQueue))
- {
- KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
- return;
- }
-
- NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue);
- while(TRUE)
- {
- Irp = CONTAINING_RECORD(NextIrp, IRP, Tail.Overlay.ListEntry);
-
- if (!Irp)
- break;
-
- /* FIXME: Handle cancels */
- /*if (!IoSetCancelRoutine(Irp, NULL))
- {
-
- }*/
-
-
- Stack = IoGetCurrentIrpStackLocation(Irp);
-
- Urb = (PURB) Stack->Parameters.Others.Argument1;
-
- ASSERT(Urb);
-
- /* FIXME: Fill in information for Argument1/URB */
-
- DPRINT("TransferBuffer %x\n",
Urb->UrbControlDescriptorRequest.TransferBuffer);
- DPRINT("TransferBufferLength %x\n",
Urb->UrbControlDescriptorRequest.TransferBufferLength);
- DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
- DPRINT("DescriptorType %x\n",
Urb->UrbControlDescriptorRequest.DescriptorType);
- DPRINT("LanguageId %x\n",
Urb->UrbControlDescriptorRequest.LanguageId);
-
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
-
- KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql);
- }
-
- KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
-}
-
-NTSTATUS
-NTAPI
-ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext)
-{
- IoFreeIrp(Irp);
- return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-VOID
-DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
-{
- PFDO_DEVICE_EXTENSION FdoDeviceExtension;
- PIO_STACK_LOCATION IrpStack = NULL;
- PDEVICE_OBJECT PortDeviceObject = NULL;
- PIRP Irp = NULL;
-
- FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)Context;
-
- PortDeviceObject = IoGetAttachedDeviceReference(FdoDeviceExtension->Pdo);
-
- if (!PortDeviceObject)
- {
- DPRINT1("Unable to notify Pdos parent of device arrival.\n");
- return;
- }
-
- Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE);
-
- if (!Irp)
- {
- DPRINT1("Unable to allocate IRP\n");
- }
-
- IoSetCompletionRoutine(Irp,
- (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion,
- NULL,
- TRUE,
- TRUE,
- TRUE);
-
- IrpStack = IoGetNextIrpStackLocation(Irp);
- IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation;
- IrpStack->MajorFunction = IRP_MJ_PNP;
- IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
-
- IoCallDriver(PortDeviceObject, Irp);
-}
/*
Get SymblicName from Parameters in Registry Key
Modified: trunk/reactos/drivers/usb/usbehci/pdo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/pdo.c?…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/pdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/pdo.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,3 +1,11 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/pdo.c
+ * PURPOSE: USB EHCI device driver.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
/* INCLUDES *******************************************************************/
#define INITGUID
@@ -55,24 +63,14 @@
Urb = (PURB) Stack->Parameters.Others.Argument1;
Urb->UrbHeader.Status = 0;
- /* Check for ChildDevices */
- if (!FdoDeviceExtension->ChildDeviceCount)
- {
- /* No device has been plugged in yet. So just queue
- the irp and complete it when a device is connected */
- if (FdoDeviceExtension->DeviceState)
- QueueRequest(FdoDeviceExtension, Irp);
-
- Information = 0;
-
- IoMarkIrpPending(Irp);
- Status = STATUS_PENDING;
- }
- else
- {
- DPRINT1("Reporting of device connects not implemented
yet.\n");
- Status = STATUS_SUCCESS;
- }
+ DPRINT1("Irp->CancelRoutine
%x\n",Irp->CancelRoutine);
+ QueueRequest(FdoDeviceExtension, Irp);
+
+ Information = 0;
+
+ IoMarkIrpPending(Irp);
+ Status = STATUS_PENDING;
+
break;
}
/* FIXME: Handle all other Functions */
@@ -158,7 +156,7 @@
}
default:
{
- DPRINT("Unhandled IoControlCode %x\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
+ DPRINT1("Unhandled IoControlCode %x\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
break;
}
}
Added: trunk/reactos/drivers/usb/usbehci/urbreq.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/urbreq…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/urbreq.c (added)
+++ trunk/reactos/drivers/usb/usbehci/urbreq.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,0 +1,299 @@
+/*
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/urbreq.c
+ * PURPOSE: URB Related Functions.
+ * PROGRAMMERS:
+ * Michael Martin
+ */
+
+#include "usbehci.h"
+
+/* QueueHead must point to the base address in common buffer */
+PVOID
+IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead,
+ PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD1,
+ PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD2,
+ PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD3,
+ PEHCI_SETUP_FORMAT *CtrlSetup,
+ PVOID *CtrlData,
+ ULONG Size)
+{
+ QueueHead->HorizontalLinkPointer = (ULONG)QueueHead | QH_TYPE_QH;
+
+ /* Set NakCountReload to max value possible */
+ QueueHead->EndPointCapabilities1.NakCountReload = 0xF;
+
+ /* 1 for non high speed, 0 for high speed device */
+ QueueHead->EndPointCapabilities1.ControlEndPointFlag = 0;
+
+ QueueHead->EndPointCapabilities1.HeadOfReclamation = TRUE;
+ QueueHead->EndPointCapabilities1.MaximumPacketLength = 64;
+
+ /* Get the Initial Data Toggle from the QEDT */
+ QueueHead->EndPointCapabilities1.QEDTDataToggleControl = TRUE;
+
+ /* HIGH SPEED DEVICE */
+ QueueHead->EndPointCapabilities1.EndPointSpeed = QH_ENDPOINT_HIGHSPEED;
+ QueueHead->EndPointCapabilities1.EndPointNumber = 0;
+
+ /* Only used for Periodic Schedule and Not High Speed devices.
+ Setting it to one result in undefined behavior for Async */
+ QueueHead->EndPointCapabilities1.InactiveOnNextTransaction = 0;
+
+ QueueHead->EndPointCapabilities1.DeviceAddress = 0;
+ QueueHead->EndPointCapabilities2.HubAddr = 0;
+ QueueHead->EndPointCapabilities2.NumberOfTransactionPerFrame = 0x01;
+
+ /* 0 For Async, 1 for periodoc schedule */
+ QueueHead->EndPointCapabilities2.InterruptScheduleMask = 0;
+
+ QueueHead->EndPointCapabilities2.PortNumber = 0;
+ QueueHead->EndPointCapabilities2.SplitCompletionMask = 0;
+ QueueHead->CurrentLinkPointer = 0;
+ QueueHead->QETDPointer = TERMINATE_POINTER;
+ QueueHead->AlternateNextPointer = TERMINATE_POINTER;
+ QueueHead->Token.Bits.InterruptOnComplete = TRUE;
+ QueueHead->BufferPointer[0] = 0;
+ QueueHead->BufferPointer[1] = 0;
+ QueueHead->BufferPointer[2] = 0;
+ QueueHead->BufferPointer[3] = 0;
+ QueueHead->BufferPointer[4] = 0;
+ /* Queue Head Initialized */
+
+ /* Queue Transfer Descriptors must be 32 byte aligned and reside in continous
physical memory */
+ *CtrlTD1 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(QueueHead) + sizeof(QUEUE_HEAD) +
0x1F) & ~0x1F);
+ *CtrlTD2 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(*CtrlTD1) +
sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0x1F) & ~0x1F);
+ *CtrlTD3 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(*CtrlTD2) +
sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0x1F) & ~0x1F);
+
+ /* Must be Page aligned */
+ *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) +
sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF);
+ *CtrlData = (PSTANDARD_DEVICE_DESC) (( (ULONG)(*CtrlSetup) +
sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF);
+
+ (*CtrlTD1)->NextPointer = TERMINATE_POINTER;
+ (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER;
+ (*CtrlTD1)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID)
(*CtrlSetup)).LowPart;
+ (*CtrlTD1)->Token.Bits.DataToggle = FALSE;
+ (*CtrlTD1)->Token.Bits.InterruptOnComplete = FALSE;
+ (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(EHCI_SETUP_FORMAT);
+ (*CtrlTD1)->Token.Bits.ErrorCounter = 0x03;
+ (*CtrlTD1)->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN;
+ (*CtrlTD1)->Token.Bits.Active = TRUE;
+
+ (*CtrlTD2)->NextPointer = TERMINATE_POINTER;
+ (*CtrlTD2)->AlternateNextPointer = TERMINATE_POINTER;
+ (*CtrlTD2)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID)
(*CtrlData)).LowPart;
+ (*CtrlTD2)->Token.Bits.DataToggle = TRUE;
+ (*CtrlTD2)->Token.Bits.InterruptOnComplete = TRUE;
+ (*CtrlTD2)->Token.Bits.TotalBytesToTransfer = Size;
+ (*CtrlTD2)->Token.Bits.ErrorCounter = 0x03;
+ (*CtrlTD2)->Token.Bits.PIDCode = PID_CODE_IN_TOKEN;
+ (*CtrlTD2)->Token.Bits.Active = TRUE;
+
+ (*CtrlTD1)->NextPointer = (ULONG)MmGetPhysicalAddress((PVOID)(*CtrlTD2)).LowPart;
+
+ (*CtrlTD3)->NextPointer = TERMINATE_POINTER;
+ (*CtrlTD3)->AlternateNextPointer = TERMINATE_POINTER;
+ (*CtrlTD3)->BufferPointer[0] = 0;
+ (*CtrlTD3)->Token.Bits.Active = TRUE;
+ (*CtrlTD3)->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN;
+ (*CtrlTD3)->Token.Bits.InterruptOnComplete = TRUE;
+ (*CtrlTD3)->Token.Bits.DataToggle = TRUE;
+ (*CtrlTD3)->Token.Bits.ErrorCounter = 0x03;
+ (*CtrlTD2)->NextPointer = (ULONG)
MmGetPhysicalAddress((PVOID)(*CtrlTD3)).LowPart;
+ return NULL;
+}
+
+BOOLEAN
+GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
+{
+ PEHCI_SETUP_FORMAT CtrlSetup = NULL;
+ PSTANDARD_DEVICE_DESC CtrlData = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
+ PQUEUE_HEAD QueueHead;
+ PEHCI_USBCMD_CONTENT UsbCmd;
+ PEHCI_USBSTS_CONTEXT UsbSts;
+ LONG Base;
+ LONG tmp;
+
+ Base = (ULONG) DeviceExtension->ResourceMemory;
+
+ /* Set up the QUEUE HEAD in memory */
+ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
+
+ IntializeHeadQueueForStandardRequest(QueueHead,
+ &CtrlTD1,
+ &CtrlTD2,
+ &CtrlTD3,
+ &CtrlSetup,
+ (PVOID)&CtrlData,
+ sizeof(STANDARD_DEVICE_DESC));
+
+ /* FIXME: Use defines and handle other than Device Desciptors */
+ CtrlSetup->bmRequestType = 0x80;
+ CtrlSetup->bRequest = 0x06;
+ CtrlSetup->wValue = 0x0100;
+ CtrlSetup->wIndex = 0;
+ CtrlSetup->wLength = sizeof(STANDARD_DEVICE_DESC);
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+ UsbCmd->Run = FALSE;
+ WRITE_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD), tmp);
+
+ /* Wait for the controller to halt */
+ for (;;)
+ {
+ KeStallExecutionProcessor(10);
+ tmp = READ_REGISTER_ULONG((PULONG)(Base + EHCI_USBSTS));
+ UsbSts = (PEHCI_USBSTS_CONTEXT)&tmp;
+ DPRINT("Waiting for Halt, USBSTS: %x\n", READ_REGISTER_ULONG
((PULONG)(Base + EHCI_USBSTS)));
+ if (UsbSts->HCHalted)
+ {
+ break;
+ }
+ }
+
+ /* Set to TRUE on interrupt for async completion */
+ DeviceExtension->AsyncComplete = FALSE;
+ QueueHead->QETDPointer = (ULONG) MmGetPhysicalAddress((PVOID)(CtrlTD1)).LowPart;
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+ UsbCmd->AsyncEnable = TRUE;
+
+ WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+
+ /* Interrupt on Async completion */
+ UsbCmd->DoorBell = TRUE;
+ UsbCmd->Run = TRUE;
+ WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
+
+ for (;;)
+ {
+ KeStallExecutionProcessor(10);
+ DPRINT("Waiting for completion!\n");
+ if (DeviceExtension->AsyncComplete == TRUE)
+ break;
+ }
+
+ DPRINT1("bLength %d\n", CtrlData->bLength);
+ DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType);
+ DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB);
+ DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass);
+ DPRINT1("CtrlData->bDeviceSubClass %x\n",
CtrlData->bDeviceSubClass);
+ DPRINT1("CtrlData->bDeviceProtocal %x\n",
CtrlData->bDeviceProtocal);
+ DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize);
+ DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor);
+ DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct);
+ DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice);
+ DPRINT1("CtrlData->iManufacturer %x\n", CtrlData->iManufacturer);
+ DPRINT1("CtrlData->iProduct %x\n", CtrlData->iProduct);
+ DPRINT1("CtrlData->iSerialNumber %x\n", CtrlData->iSerialNumber);
+ DPRINT1("CtrlData->bNumConfigurations %x\n",
CtrlData->bNumConfigurations);
+
+ /* Temporary: Remove */
+ if (CtrlData->bLength > 0)
+ {
+ /* We got valid data, try for strings */
+ UCHAR Manufacturer = CtrlData->iManufacturer;
+ UCHAR Product = CtrlData->iManufacturer;
+ UCHAR SerialNumber = CtrlData->iSerialNumber;
+
+ GetDeviceStringDescriptor(DeviceExtension, Manufacturer);
+ GetDeviceStringDescriptor(DeviceExtension, Product);
+ GetDeviceStringDescriptor(DeviceExtension, SerialNumber);
+ }
+
+ return TRUE;
+}
+
+BOOLEAN
+GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index)
+{
+ PEHCI_SETUP_FORMAT CtrlSetup = NULL;
+ PSTRING_DESCRIPTOR CtrlData = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL;
+ PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL;
+ PQUEUE_HEAD QueueHead;
+ PEHCI_USBCMD_CONTENT UsbCmd;
+ PEHCI_USBSTS_CONTEXT UsbSts;
+ LONG Base;
+ LONG tmp;
+
+ Base = (ULONG) DeviceExtension->ResourceMemory;
+DPRINT1("Index: %d\n", Index);
+ /* Set up the QUEUE HEAD in memory */
+ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr);
+
+ IntializeHeadQueueForStandardRequest(QueueHead,
+ &CtrlTD1,
+ &CtrlTD2,
+ &CtrlTD3,
+ &CtrlSetup,
+ (PVOID)&CtrlData,
+ sizeof(STRING_DESCRIPTOR) + 256);
+
+ /* FIXME: Use defines and handle other than Device Desciptors */
+ CtrlSetup->bmRequestType = 0x80;
+ CtrlSetup->bRequest = 0x06;
+ CtrlSetup->wValue = 0x0300 | Index;
+ CtrlSetup->wIndex = 0;
+ /* 256 pulled from thin air */
+ CtrlSetup->wLength = sizeof(STRING_DESCRIPTOR) + 256;
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+ UsbCmd->Run = FALSE;
+ WRITE_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD), tmp);
+
+ /* Wait for the controller to halt */
+ for (;;)
+ {
+ KeStallExecutionProcessor(10);
+ tmp = READ_REGISTER_ULONG((PULONG)(Base + EHCI_USBSTS));
+ UsbSts = (PEHCI_USBSTS_CONTEXT)&tmp;
+ DPRINT("Waiting for Halt, USBSTS: %x\n", READ_REGISTER_ULONG
((PULONG)(Base + EHCI_USBSTS)));
+ if (UsbSts->HCHalted)
+ {
+ break;
+ }
+ }
+
+ /* Set to TRUE on interrupt for async completion */
+ DeviceExtension->AsyncComplete = FALSE;
+ QueueHead->QETDPointer = (ULONG) MmGetPhysicalAddress((PVOID)(CtrlTD1)).LowPart;
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+ UsbCmd->AsyncEnable = TRUE;
+
+ WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
+
+ tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD));
+ UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
+
+ /* Interrupt on Async completion */
+ UsbCmd->DoorBell = TRUE;
+ UsbCmd->Run = TRUE;
+ WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp);
+
+ for (;;)
+ {
+ KeStallExecutionProcessor(10);
+ DPRINT("Waiting for completion!\n");
+ if (DeviceExtension->AsyncComplete == TRUE)
+ break;
+ }
+
+ DPRINT1("String %S\n", &CtrlData->bString);
+
+ return TRUE;
+}
+
Propchange: trunk/reactos/drivers/usb/usbehci/urbreq.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/drivers/usb/usbehci/usbehci.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/usbehc…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/usbehci.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/usbehci.c [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -1,21 +1,10 @@
/*
- * ReactOS USB ehci driver
- * Copyright (C) 2009 Michael Martin
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
+ * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: drivers/usb/usbehci/usbehci.c
+ * PURPOSE: USB EHCI device driver.
+ * PROGRAMMERS:
+ * Michael Martin
*/
/* DEFINES *******************************************************************/
Modified: trunk/reactos/drivers/usb/usbehci/usbehci.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/usbehc…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/usbehci.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/usbehci.h [iso-8859-1] Sat Jan 9 20:28:29 2010
@@ -53,119 +53,153 @@
#define EHCI_STS_ASS 0x8000
#define EHCI_ERROR_INT ( EHCI_STS_FATAL | EHCI_STS_ERR )
-typedef struct _EHCI_HCS_CONTENT
-{
- ULONG PortCount : 4;
- ULONG PortPowerControl: 1;
- ULONG Reserved : 2;
- ULONG PortRouteRules : 1;
- ULONG PortPerCHC : 4;
- ULONG CHCCount : 4;
- ULONG PortIndicator : 1;
- ULONG Reserved2 : 3;
- ULONG DbgPortNum : 4;
- ULONG Reserved3 : 8;
-
-} EHCI_HCS_CONTENT, *PEHCI_HCS_CONTENT;
-
-typedef struct _EHCI_HCC_CONTENT
-{
- ULONG CurAddrBits : 1;
- ULONG VarFrameList : 1;
- ULONG ParkMode : 1;
- ULONG Reserved : 1;
- ULONG IsoSchedThreshold : 4;
- ULONG EECPCapable : 8;
- ULONG Reserved2 : 16;
-
-} EHCI_HCC_CONTENT, *PEHCI_HCC_CONTENT;
-
-typedef struct _EHCI_CAPS {
- UCHAR Length;
- UCHAR Reserved;
- USHORT HCIVersion;
+
+/* Last bit in QUEUE ELEMENT TRANSFER DESCRIPTOR Next Pointer */
+/* Used for Queue Element Transfer Descriptor Pointers
+ and Queue Head Horizontal Link Pointers */
+#define TERMINATE_POINTER 0x01
+
+/* QUEUE ELEMENT TRANSFER DESCRIPTOR, Token defines and structs */
+
+/* PIDCodes for QETD_TOKEN
+OR with QUEUE_TRANSFER_DESCRIPTOR Token.PIDCode*/
+#define PID_CODE_OUT_TOKEN 0x00
+#define PID_CODE_IN_TOKEN 0x01
+#define PID_CODE_SETUP_TOKEN 0x02
+
+/* Split Transaction States
+OR with QUEUE_TRANSFER_DESCRIPTOR Token.SplitTransactionState */
+#define DO_START_SPLIT 0x00
+#define DO_COMPLETE_SPLIT 0x01
+
+/* Ping States, OR with QUEUE_TRANSFER_DESCRIPTOR Token. */
+#define PING_STATE_DO_OUT 0x00
+#define PING_STATE_DO_PING 0x01
+
+/* QUEUE ELEMENT TRANSFER DESCRIPTOR TOKEN */
+typedef struct _QETD_TOKEN_BITS
+{
+ ULONG PingState:1;
+ ULONG SplitTransactionState:1;
+ ULONG MissedMicroFrame:1;
+ ULONG TransactionError:1;
+ ULONG BabbelDetected:1;
+ ULONG DataBufferError:1;
+ ULONG Halted:1;
+ ULONG Active:1;
+ ULONG PIDCode:2;
+ ULONG ErrorCounter:2;
+ ULONG CurrentPage:3;
+ ULONG InterruptOnComplete:1;
+ ULONG TotalBytesToTransfer:15;
+ ULONG DataToggle:1;
+} QETD_TOKEN_BITS, *PQETD_TOKEN_BITS;
+
+
+/* QUEUE ELEMENT TRANSFER DESCRIPTOR */
+typedef struct _QUEUE_TRANSFER_DESCRIPTOR
+{
+ ULONG NextPointer;
+ ULONG AlternateNextPointer;
union
{
- EHCI_HCS_CONTENT HCSParams;
- ULONG HCSParamsLong;
- };
- ULONG HCCParams;
- UCHAR PortRoute [8];
-} EHCI_CAPS, *PEHCI_CAPS;
-
-
-typedef struct _COMMON_DEVICE_EXTENSION
-{
- BOOLEAN IsFdo;
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DeviceObject;
-} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
-
-typedef struct _FDO_DEVICE_EXTENSION
-{
- COMMON_DEVICE_EXTENSION Common;
- PDRIVER_OBJECT DriverObject;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_OBJECT LowerDevice;
- PDEVICE_OBJECT Pdo;
- ULONG DeviceState;
-
- /* USB Specs says a max of 127 devices */
- ULONG ChildDeviceCount;
-
- PDMA_ADAPTER pDmaAdapter;
-
- ULONG Vector;
- KIRQL Irql;
-
- KINTERRUPT_MODE Mode;
- BOOLEAN IrqShared;
- PKINTERRUPT EhciInterrupt;
- KDPC DpcObject;
- KAFFINITY Affinity;
-
- LIST_ENTRY IrpQueue;
- KSPIN_LOCK IrpQueueLock;
- PIRP CurrentIrp;
-
- ULONG MapRegisters;
-
- ULONG BusNumber;
- ULONG BusAddress;
- ULONG PCIAddress;
- USHORT VendorId;
- USHORT DeviceId;
-
- BUS_INTERFACE_STANDARD BusInterface;
-
- EHCI_CAPS ECHICaps;
-
+ QETD_TOKEN_BITS Bits;
+ ULONG DWord;
+ } Token;
+ ULONG BufferPointer[5];
+} QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR;
+
+/* EndPointSpeeds of END_POINT_CAPABILITIES */
+#define QH_ENDPOINT_FULLSPEED 0x00
+#define QH_ENDPOINT_LOWSPEED 0x01
+#define QH_ENDPOINT_HIGHSPEED 0x02
+
+typedef struct _END_POINT_CAPABILITIES1
+{
+ ULONG DeviceAddress:7;
+ ULONG InactiveOnNextTransaction:1;
+ ULONG EndPointNumber:4;
+ ULONG EndPointSpeed:2;
+ ULONG QEDTDataToggleControl:1;
+ ULONG HeadOfReclamation:1;
+ ULONG MaximumPacketLength:11;
+ ULONG ControlEndPointFlag:1;
+ ULONG NakCountReload:4;
+} END_POINT_CAPABILITIES1, *PEND_POINT_CAPABILITIES1;
+
+typedef struct _END_POINT_CAPABILITIES2
+{
+ ULONG InterruptScheduleMask:8;
+ ULONG SplitCompletionMask:8;
+ ULONG HubAddr:6;
+ ULONG PortNumber:6;
+ /* Multi */
+ ULONG NumberOfTransactionPerFrame:2;
+} END_POINT_CAPABILITIES2, *PEND_POINT_CAPABILITIES2;
+
+
+/* QUEUE HEAD defines and structs */
+
+/* QUEUE HEAD Select Types, OR with QUEUE_HEAD HorizontalLinkPointer */
+#define QH_TYPE_IDT 0x00
+#define QH_TYPE_QH 0x02
+#define QH_TYPE_SITD 0x04
+#define QH_TYPE_FSTN 0x06
+
+/* QUEUE HEAD */
+typedef struct _QUEUE_HEAD
+{
+ ULONG HorizontalLinkPointer;
+ END_POINT_CAPABILITIES1 EndPointCapabilities1;
+ END_POINT_CAPABILITIES2 EndPointCapabilities2;
+ /* TERMINATE_POINTER not valid for this member */
+ ULONG CurrentLinkPointer;
+ /* TERMINATE_POINTER valid */
+ ULONG QETDPointer;
+ /* TERMINATE_POINTER valid, bits 1:4 is NAK_COUNTER */
+ ULONG AlternateNextPointer;
+ /* Only DataToggle, InterruptOnComplete, ErrorCounter, PingState valid */
union
{
- PULONG ResourcePort;
- PULONG ResourceMemory;
- };
-
- PULONG PeriodicFramList;
- PULONG AsyncListQueueHeadPtr;
- PHYSICAL_ADDRESS PeriodicFramListPhysAddr;
- PHYSICAL_ADDRESS AsyncListQueueHeadPtrPhysAddr;
-
- BOOLEAN AsyncComplete;
-
- PULONG ResourceBase;
- ULONG Size;
-
-} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
-
-typedef struct _PDO_DEVICE_EXTENSION
-{
- COMMON_DEVICE_EXTENSION Common;
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_OBJECT ControllerFdo;
-
-} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
-
+ QETD_TOKEN_BITS Bits;
+ ULONG DWord;
+ } Token;
+ ULONG BufferPointer[5];
+} QUEUE_HEAD, *PQUEUE_HEAD;
+
+typedef struct _EHCI_SETUP_FORMAT
+{
+ UCHAR bmRequestType;
+ UCHAR bRequest;
+ USHORT wValue;
+ USHORT wIndex;
+ USHORT wLength;
+} EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT;
+
+typedef struct _STANDARD_DEVICE_DESC
+{
+ UCHAR bLength;
+ UCHAR bDescriptorType;
+ USHORT bcdUSB;
+ UCHAR bDeviceClass;
+ UCHAR bDeviceSubClass;
+ UCHAR bDeviceProtocal;
+ UCHAR bMaxPacketSize;
+ USHORT idVendor;
+ USHORT idProduct;
+ USHORT bcdDevice;
+ UCHAR iManufacturer;
+ UCHAR iProduct;
+ UCHAR iSerialNumber;
+ UCHAR bNumConfigurations;
+} STANDARD_DEVICE_DESC, *PSTANDARD_DEVICE_DESC;
+
+typedef struct _STRING_DESCRIPTOR
+{
+ UCHAR bLength; /* Size of this descriptor in bytes */
+ UCHAR bDescriptorType; /* STRING Descriptor Type */
+ UCHAR bString[0]; /* UNICODE encoded string */
+} STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR;
/* USBCMD register 32 bits */
typedef struct _EHCI_USBCMD_CONTENT
@@ -218,6 +252,120 @@
ULONG PortOwner:1;
} EHCI_USBPORTSC_CONTENT, *PEHCI_USBPORTSC_CONTENT;
+typedef struct _EHCI_HCS_CONTENT
+{
+ ULONG PortCount : 4;
+ ULONG PortPowerControl: 1;
+ ULONG Reserved : 2;
+ ULONG PortRouteRules : 1;
+ ULONG PortPerCHC : 4;
+ ULONG CHCCount : 4;
+ ULONG PortIndicator : 1;
+ ULONG Reserved2 : 3;
+ ULONG DbgPortNum : 4;
+ ULONG Reserved3 : 8;
+
+} EHCI_HCS_CONTENT, *PEHCI_HCS_CONTENT;
+
+typedef struct _EHCI_HCC_CONTENT
+{
+ ULONG CurAddrBits : 1;
+ ULONG VarFrameList : 1;
+ ULONG ParkMode : 1;
+ ULONG Reserved : 1;
+ ULONG IsoSchedThreshold : 4;
+ ULONG EECPCapable : 8;
+ ULONG Reserved2 : 16;
+
+} EHCI_HCC_CONTENT, *PEHCI_HCC_CONTENT;
+
+typedef struct _EHCI_CAPS {
+ UCHAR Length;
+ UCHAR Reserved;
+ USHORT HCIVersion;
+ union
+ {
+ EHCI_HCS_CONTENT HCSParams;
+ ULONG HCSParamsLong;
+ };
+ ULONG HCCParams;
+ UCHAR PortRoute [8];
+} EHCI_CAPS, *PEHCI_CAPS;
+
+
+typedef struct _COMMON_DEVICE_EXTENSION
+{
+ BOOLEAN IsFdo;
+ PDRIVER_OBJECT DriverObject;
+ PDEVICE_OBJECT DeviceObject;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
+
+typedef struct _FDO_DEVICE_EXTENSION
+{
+ COMMON_DEVICE_EXTENSION Common;
+ PDRIVER_OBJECT DriverObject;
+ PDEVICE_OBJECT DeviceObject;
+ PDEVICE_OBJECT LowerDevice;
+ PDEVICE_OBJECT Pdo;
+ ULONG DeviceState;
+
+ /* USB Specs says a max of 127 devices */
+ ULONG ChildDeviceCount;
+
+ PDMA_ADAPTER pDmaAdapter;
+
+ ULONG Vector;
+ KIRQL Irql;
+
+ KINTERRUPT_MODE Mode;
+ BOOLEAN IrqShared;
+ PKINTERRUPT EhciInterrupt;
+ KDPC DpcObject;
+ KAFFINITY Affinity;
+
+ LIST_ENTRY IrpQueue;
+ KSPIN_LOCK IrpQueueLock;
+ PIRP CurrentIrp;
+
+ ULONG MapRegisters;
+
+ ULONG BusNumber;
+ ULONG BusAddress;
+ ULONG PCIAddress;
+ USHORT VendorId;
+ USHORT DeviceId;
+
+ BUS_INTERFACE_STANDARD BusInterface;
+
+ EHCI_CAPS ECHICaps;
+
+ union
+ {
+ PULONG ResourcePort;
+ PULONG ResourceMemory;
+ };
+
+ PULONG PeriodicFramList;
+ PULONG AsyncListQueueHeadPtr;
+ PHYSICAL_ADDRESS PeriodicFramListPhysAddr;
+ PHYSICAL_ADDRESS AsyncListQueueHeadPtrPhysAddr;
+
+ BOOLEAN AsyncComplete;
+
+ PULONG ResourceBase;
+ ULONG Size;
+
+} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
+
+typedef struct _PDO_DEVICE_EXTENSION
+{
+ COMMON_DEVICE_EXTENSION Common;
+ PDEVICE_OBJECT DeviceObject;
+ PDEVICE_OBJECT ControllerFdo;
+
+} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
+
+
NTSTATUS NTAPI
GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
@@ -252,13 +400,10 @@
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
BOOLEAN
-GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, USHORT Port);
+GetDeviceDescriptor (PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
BOOLEAN
-GetDeviceDescriptor2(PFDO_DEVICE_EXTENSION DeviceExtension, USHORT Port);
-
-BOOLEAN
-GetStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, ULONG DecriptorStringNumber);
+GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
VOID
CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension);
@@ -275,4 +420,7 @@
VOID
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context);
+VOID
+RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
+
#endif
Modified: trunk/reactos/drivers/usb/usbehci/usbehci.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/usbehc…
==============================================================================
--- trunk/reactos/drivers/usb/usbehci/usbehci.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbehci/usbehci.rbuild [iso-8859-1] Sat Jan 9 20:28:29
2010
@@ -8,4 +8,6 @@
<file>pdo.c</file>
<file>common.c</file>
<file>misc.c</file>
+ <file>irp.c</file>
+ <file>urbreq.c</file>
</module>