Author: janderwald
Date: Thu Feb 9 19:11:13 2012
New Revision: 55516
URL:
http://svn.reactos.org/svn/reactos?rev=55516&view=rev
Log:
[USBEHCI]
- Revert 55515, 55502, 55491, 55490, 55489 as it breaks mass storage support in VBox +
Vmware
Modified:
branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp
branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h
branches/usb-bringup-trunk/drivers/usb/usbehci_new/hub_controller.cpp
branches/usb-bringup-trunk/drivers/usb/usbehci_new/interfaces.h
branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp
branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp
branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp
branches/usb-bringup-trunk/drivers/usb/usbehci_new/usbehci.h
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.cpp [iso-8859-1] Thu Feb
9 19:11:13 2012
@@ -32,11 +32,6 @@
NTAPI
StatusChangeWorkItemRoutine(PVOID Context);
-VOID
-NTAPI
-QueueHeadCompletionRoutine(PVOID Context);
-
-
class CUSBHardwareDevice : public IUSBHardwareDevice
{
public:
@@ -99,7 +94,6 @@
friend BOOLEAN NTAPI InterruptServiceRoutine(IN PKINTERRUPT Interrupt, IN PVOID
ServiceContext);
friend VOID NTAPI EhciDefferedRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN
PVOID SystemArgument1, IN PVOID SystemArgument2);
friend VOID NTAPI StatusChangeWorkItemRoutine(PVOID Context);
- friend VOID NTAPI QueueHeadCompletionRoutine(PVOID Context);
// constructor / destructor
CUSBHardwareDevice(IUnknown *OuterUnknown){}
virtual ~CUSBHardwareDevice(){}
@@ -1312,37 +1306,6 @@
return TRUE;
}
-typedef struct
-{
- WORK_QUEUE_ITEM QueueHeadWorkItem;
- CUSBHardwareDevice * This;
-
-}QUEUE_HEAD_COMPLETION, *PQUEUE_HEAD_COMPLETION;
-
-
-VOID
-NTAPI
-QueueHeadCompletionRoutine(
- IN PVOID Ctx)
-{
- //
- // cast to hardware object
- //
- PQUEUE_HEAD_COMPLETION Context = (PQUEUE_HEAD_COMPLETION)Ctx;
-
- //
- // now notify IUSBQueue that it can free completed requests
- //
- Context->This->m_UsbQueue->CompleteAsyncRequests();
-
- //
- // door ring bell completed
- //
- Context->This->m_DoorBellRingInProgress = FALSE;
-
- ExFreePool(Context);
-}
-
VOID NTAPI
EhciDefferedRoutine(
IN PKDPC Dpc,
@@ -1354,7 +1317,6 @@
ULONG CStatus, PortStatus, PortCount, i, ShouldRingDoorBell;
NTSTATUS Status = STATUS_SUCCESS;
EHCI_USBCMD_CONTENT UsbCmd;
- PQUEUE_HEAD_COMPLETION Context;
This = (CUSBHardwareDevice*) SystemArgument1;
CStatus = (ULONG) SystemArgument2;
@@ -1377,7 +1339,6 @@
// controller reported error
//
DPRINT1("CStatus %x\n", CStatus);
- ASSERT(FALSE);
}
//
@@ -1424,22 +1385,14 @@
PC_ASSERT(This->m_DoorBellRingInProgress == TRUE);
//
- // get command register
- //
- This->GetCommandRegister(&UsbCmd);
- ASSERT(UsbCmd.DoorBell == FALSE);
-
- //
- // allocate work item context
- //
- Context = (PQUEUE_HEAD_COMPLETION)ExAllocatePool(NonPagedPool,
sizeof(QUEUE_HEAD_COMPLETION));
- if (Context)
- {
- ExInitializeWorkItem(&Context->QueueHeadWorkItem,
QueueHeadCompletionRoutine, Context);
- Context->This = This;
- ExQueueWorkItem(&Context->QueueHeadWorkItem, DelayedWorkQueue);
- }
-
+ // now notify IUSBQueue that it can free completed requests
+ //
+ This->m_UsbQueue->CompleteAsyncRequests();
+
+ //
+ // door ring bell completed
+ //
+ This->m_DoorBellRingInProgress = FALSE;
}
This->GetDeviceDetails(NULL, NULL, &PortCount, NULL);
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/hardware.h [iso-8859-1] Thu Feb 9
19:11:13 2012
@@ -148,7 +148,7 @@
//Software
ULONG PhysicalAddr;
- LIST_ENTRY DescriptorEntry;
+ LIST_ENTRY LinkedDescriptors;
ULONG TotalBytesToTransfer;
} QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR;
@@ -216,21 +216,9 @@
//Software
ULONG PhysicalAddr;
LIST_ENTRY LinkedQueueHeads;
- LIST_ENTRY TransferDescriptorListHead;
PVOID Request;
} QUEUE_HEAD, *PQUEUE_HEAD;
-C_ASSERT(sizeof(END_POINT_CHARACTERISTICS) == 4);
-C_ASSERT(sizeof(END_POINT_CAPABILITIES) == 4);
-
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, HorizontalLinkPointer) == 0x00);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, EndPointCharacteristics) == 0x04);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, EndPointCapabilities) == 0x08);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, CurrentLinkPointer) == 0xC);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, NextPointer) == 0x10);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, AlternateNextPointer) == 0x14);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, Token) == 0x18);
-C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, BufferPointer) == 0x1C);
C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, PhysicalAddr) == 0x30);
@@ -304,4 +292,3 @@
ULONG PortChange;
}EHCI_PORT_STATUS;
-
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/hub_controller.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/hub_controller.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/hub_controller.cpp [iso-8859-1] Thu
Feb 9 19:11:13 2012
@@ -70,9 +70,6 @@
NTSTATUS HandleClassEndpoint(IN OUT PIRP Irp, PURB Urb);
NTSTATUS HandleBulkOrInterruptTransfer(IN OUT PIRP Irp, PURB Urb);
NTSTATUS HandleIsochronousTransfer(IN OUT PIRP Irp, PURB Urb);
- NTSTATUS HandleClearStall(IN OUT PIRP Irp, PURB Urb);
- NTSTATUS HandleSyncResetAndClearStall(IN OUT PIRP Irp, PURB Urb);
- NTSTATUS HandleAbortPipe(IN OUT PIRP Irp, PURB Urb);
friend VOID StatusChangeEndpointCallBack(PVOID Context);
@@ -1678,21 +1675,12 @@
//
// initialize setup packet
//
- CtrlSetup.bmRequestType.B = 0x22; //FIXME: Const.
+ CtrlSetup.bmRequestType.B = 0xa2; //FIXME: Const.
CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request;
CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value;
CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index;
CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength;
- if (Urb->UrbControlVendorClassRequest.TransferFlags &
USBD_TRANSFER_DIRECTION_IN)
- {
- //
- // data direction is device to host
- //
- CtrlSetup.bmRequestType.B |= 0x80;
- }
-
-
//
// issue request
//
@@ -1709,185 +1697,6 @@
//
return Status;
}
-
-NTSTATUS
-CHubController::HandleSyncResetAndClearStall(
- IN OUT PIRP Irp,
- IN OUT PURB Urb)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- PUSB_ENDPOINT EndpointDescriptor;
- ULONG Type;
-
- //
- // sanity check
- //
- PC_ASSERT(Urb->UrbHeader.UsbdDeviceHandle);
- PC_ASSERT(Urb->UrbHeader.Length == sizeof(struct _URB_PIPE_REQUEST));
- PC_ASSERT(Urb->UrbPipeRequest.PipeHandle);
-
- //
- // check if this is a valid usb device handle
- //
- if (!ValidateUsbDevice(PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle)))
- {
- DPRINT1("HandleAbortPipe invalid device handle %p\n",
Urb->UrbHeader.UsbdDeviceHandle);
-
- //
- // invalid device handle
- //
- return STATUS_DEVICE_NOT_CONNECTED;
- }
-
- //
- // get endpoint descriptor
- //
- EndpointDescriptor = (PUSB_ENDPOINT)Urb->UrbPipeRequest.PipeHandle;
-
- //
- // get type
- //
- Type = (EndpointDescriptor->EndPointDescriptor.bmAttributes &
USB_ENDPOINT_TYPE_MASK);
- if (Type != USB_ENDPOINT_TYPE_ISOCHRONOUS)
- {
- //
- // clear stall
- //
- Status = HandleClearStall(Irp, Urb);
- }
- DPRINT1("URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL Status %x\n",
Status);
-
- //
- // reset data toggle
- //
- ASSERT(NT_SUCCESS(Status));
- EndpointDescriptor->DataToggle = 0x0;
-
- //
- // done
- //
- return Status;
-}
-
-NTSTATUS
-CHubController::HandleAbortPipe(
- IN OUT PIRP Irp,
- IN OUT PURB Urb)
-{
- NTSTATUS Status;
- PUSBDEVICE UsbDevice;
- PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
-
- //
- // sanity check
- //
- PC_ASSERT(Urb->UrbHeader.UsbdDeviceHandle);
- PC_ASSERT(Urb->UrbHeader.Length == sizeof(struct _URB_PIPE_REQUEST));
- PC_ASSERT(Urb->UrbPipeRequest.PipeHandle);
-
- //
- // check if this is a valid usb device handle
- //
- if (!ValidateUsbDevice(PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle)))
- {
- DPRINT1("HandleAbortPipe invalid device handle %p\n",
Urb->UrbHeader.UsbdDeviceHandle);
-
- //
- // invalid device handle
- //
- return STATUS_DEVICE_NOT_CONNECTED;
- }
-
- //
- // get endpoint descriptor
- //
- EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbPipeRequest.PipeHandle;
-
- //
- // get device
- //
- UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle);
-
-
- //
- // issue request
- //
- Status = UsbDevice->AbortPipe(EndpointDescriptor);
- DPRINT1("URB_FUNCTION_ABORT_PIPE Status %x\n", Status);
-
- //
- // done
- //
- return Status;
-}
-
-
-//-----------------------------------------------------------------------------------------
-NTSTATUS
-CHubController::HandleClearStall(
- IN OUT PIRP Irp,
- IN OUT PURB Urb)
-{
- USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
- NTSTATUS Status;
- PUSBDEVICE UsbDevice;
- PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
-
-
- //
- // sanity check
- //
- PC_ASSERT(Urb->UrbHeader.UsbdDeviceHandle);
- PC_ASSERT(Urb->UrbHeader.Length == sizeof(struct _URB_PIPE_REQUEST));
- PC_ASSERT(Urb->UrbPipeRequest.PipeHandle);
-
- //
- // check if this is a valid usb device handle
- //
- if (!ValidateUsbDevice(PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle)))
- {
- DPRINT1("HandleClearStall invalid device handle %p\n",
Urb->UrbHeader.UsbdDeviceHandle);
-
- //
- // invalid device handle
- //
- return STATUS_DEVICE_NOT_CONNECTED;
- }
-
- //
- // get endpoint descriptor
- //
- EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbPipeRequest.PipeHandle;
-
- //
- // get device
- //
- UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle);
- DPRINT1("URB_FUNCTION_SYNC_CLEAR_STALL\n");
-
- //
- // initialize setup packet
- //
- CtrlSetup.bmRequestType.B = 0x02;
- CtrlSetup.bRequest = USB_REQUEST_CLEAR_FEATURE;
- CtrlSetup.wValue.W = USB_FEATURE_ENDPOINT_STALL;
- CtrlSetup.wIndex.W = EndpointDescriptor->bEndpointAddress;
- CtrlSetup.wLength = 0;
- CtrlSetup.wValue.W = 0;
-
- //
- // issue request
- //
- Status = UsbDevice->SubmitSetupPacket(&CtrlSetup, 0, 0);
-
- DPRINT1("URB_FUNCTION_CLEAR_STALL Status %x\n", Status);
-
- //
- // done
- //
- return Status;
-}
-
//-----------------------------------------------------------------------------------------
NTSTATUS
@@ -1938,20 +1747,12 @@
//
// initialize setup packet
//
- CtrlSetup.bmRequestType.B = 0x21;
+ CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const.
CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request;
CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value;
CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index;
CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength;
- if (Urb->UrbControlVendorClassRequest.TransferFlags &
USBD_TRANSFER_DIRECTION_IN)
- {
- //
- // data direction is device to host
- //
- CtrlSetup.bmRequestType.B |= 0x80;
- }
-
//
// issue request
//
@@ -1960,13 +1761,8 @@
//
// assert on failure
//
- if (!NT_SUCCESS(Status))
- {
- //
- // display error
- //
- DPRINT1("URB_FUNCTION_CLASS_INTERFACE failed with Urb Status %x\n",
Urb->UrbHeader.Status);
- }
+ PC_ASSERT(NT_SUCCESS(Status));
+
//
// done
@@ -2010,16 +1806,6 @@
switch (Urb->UrbHeader.Function)
{
- case URB_FUNCTION_SYNC_RESET_PIPE:
- case URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL:
- Status = HandleSyncResetAndClearStall(Irp, Urb);
- break;
- case URB_FUNCTION_ABORT_PIPE:
- Status = HandleAbortPipe(Irp, Urb);
- break;
- case URB_FUNCTION_SYNC_CLEAR_STALL:
- Status = HandleClearStall(Irp, Urb);
- break;
case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE:
Status = HandleGetDescriptorFromInterface(Irp, Urb);
break;
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/interfaces.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/interfaces.h [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/interfaces.h [iso-8859-1] Thu Feb
9 19:11:13 2012
@@ -379,7 +379,6 @@
//
struct _QUEUE_HEAD;
-struct _USB_ENDPOINT;
DECLARE_INTERFACE_(IUSBRequest, IUnknown)
{
@@ -396,7 +395,7 @@
virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager,
IN PUSB_DEFAULT_PIPE_SETUP_PACKET
SetupPacket,
IN UCHAR DeviceAddress,
- IN OPTIONAL struct _USB_ENDPOINT
*EndpointDescriptor,
+ IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR
EndpointDescriptor,
IN OUT ULONG TransferBufferLength,
IN OUT PMDL TransferBuffer) = 0;
@@ -589,15 +588,6 @@
// This function gets called by IUSBHardware after it the Interrupt on Async Advance bit
has been set
virtual VOID CompleteAsyncRequests() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// AbortDevicePipe
-//
-// Description: aborts all pending requsts of an device
-
- virtual NTSTATUS AbortDevicePipe(UCHAR DeviceAddress, IN PUSB_ENDPOINT_DESCRIPTOR
EndpointDescriptor) = 0;
-
};
typedef IUSBQueue *PUSBQUEUE;
@@ -851,15 +841,6 @@
virtual NTSTATUS SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle,
IN OUT PUSBD_INTERFACE_INFORMATION Interface) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// AbortPipe
-//
-// Description: aborts all pending requsts
-
- virtual NTSTATUS AbortPipe(IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor) = 0;
-
};
typedef IUSBDevice *PUSBDEVICE;
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1] Thu Feb
9 19:11:13 2012
@@ -10,6 +10,24 @@
#define INITGUID
#include "usbehci.h"
+
+typedef struct _USB_ENDPOINT
+{
+ USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
+} USB_ENDPOINT, *PUSB_ENDPOINT;
+
+typedef struct _USB_INTERFACE
+{
+ USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
+ USB_ENDPOINT *EndPoints;
+} USB_INTERFACE, *PUSB_INTERFACE;
+
+typedef struct _USB_CONFIGURATION
+{
+ USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
+ USB_INTERFACE *Interfaces;
+} USB_CONFIGURATION, *PUSB_CONFIGURATION;
+
class CUSBDevice : public IUSBDevice
{
@@ -52,12 +70,10 @@
virtual NTSTATUS SubmitSetupPacket(IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, OUT
ULONG BufferLength, OUT PVOID Buffer);
virtual NTSTATUS SelectConfiguration(IN PUSB_CONFIGURATION_DESCRIPTOR
ConfigurationDescriptor, IN PUSBD_INTERFACE_INFORMATION Interface, OUT
USBD_CONFIGURATION_HANDLE *ConfigurationHandle);
virtual NTSTATUS SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle, IN
OUT PUSBD_INTERFACE_INFORMATION Interface);
- virtual NTSTATUS AbortPipe(IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor);
-
// local function
virtual NTSTATUS CommitIrp(PIRP Irp);
- virtual NTSTATUS CommitSetupPacket(PUSB_DEFAULT_PIPE_SETUP_PACKET Packet, IN OPTIONAL
PUSB_ENDPOINT EndpointDescriptor, IN ULONG BufferLength, IN OUT PMDL Mdl);
+ virtual NTSTATUS CommitSetupPacket(PUSB_DEFAULT_PIPE_SETUP_PACKET Packet, IN OPTIONAL
PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, IN ULONG BufferLength, IN OUT PMDL Mdl);
virtual NTSTATUS CreateConfigurationDescriptor(ULONG ConfigurationIndex);
virtual NTSTATUS CreateDeviceDescriptor();
virtual VOID DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
@@ -521,7 +537,7 @@
NTSTATUS
CUSBDevice::CommitSetupPacket(
IN PUSB_DEFAULT_PIPE_SETUP_PACKET Packet,
- IN OPTIONAL PUSB_ENDPOINT EndpointDescriptor,
+ IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor,
IN ULONG BufferLength,
IN OUT PMDL Mdl)
{
@@ -1257,23 +1273,6 @@
return Status;
}
-NTSTATUS
-CUSBDevice::AbortPipe(
- IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor)
-{
- //
- // let it handle usb queue
- //
- ASSERT(m_Queue);
- ASSERT(m_DeviceAddress);
-
- //
- // done
- //
- return m_Queue->AbortDevicePipe(m_DeviceAddress, EndpointDescriptor);
-}
-
-
//----------------------------------------------------------------------------------------
NTSTATUS
CreateUSBDevice(
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_queue.cpp [iso-8859-1] Thu Feb
9 19:11:13 2012
@@ -41,8 +41,6 @@
virtual NTSTATUS CreateUSBRequest(IUSBRequest **OutRequest);
virtual VOID InterruptCallback(IN NTSTATUS Status, OUT PULONG ShouldRingDoorBell);
virtual VOID CompleteAsyncRequests();
- virtual NTSTATUS AbortDevicePipe(UCHAR DeviceAddress, IN PUSB_ENDPOINT_DESCRIPTOR
EndpointDescriptor);
-
// constructor / destructor
CUSBQueue(IUnknown *OuterUnknown){}
@@ -501,6 +499,11 @@
// remove software link
//
RemoveEntryList(&QueueHead->LinkedQueueHeads);
+
+ //
+ // FIXME: clear failure
+ //
+ QueueHead->Token.Bits.Halted = FALSE;
}
//
@@ -626,7 +629,6 @@
//
// walk async list
//
- ASSERT(AsyncListQueueHead);
Entry = AsyncListQueueHead->LinkedQueueHeads.Flink;
while(Entry != &AsyncListQueueHead->LinkedQueueHeads)
@@ -635,7 +637,6 @@
// get queue head structure
//
QueueHead = (PQUEUE_HEAD)CONTAINING_RECORD(Entry, QUEUE_HEAD, LinkedQueueHeads);
- ASSERT(QueueHead);
//
// sanity check
@@ -657,7 +658,7 @@
//
IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead);
- DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead,
IsQueueHeadComplete);
+ DPRINT1("Request %p QueueHead %p Complete %d\n", Request, QueueHead,
IsQueueHeadComplete);
//
// check if queue head is complete
@@ -929,16 +930,6 @@
}
NTSTATUS
-CUSBQueue::AbortDevicePipe(
- IN UCHAR DeviceAddress,
- IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor)
-{
- UNIMPLEMENTED
- return STATUS_NOT_IMPLEMENTED;
-}
-
-
-NTSTATUS
CreateUSBQueue(
PUSBQUEUE *OutUsbQueue)
{
@@ -971,4 +962,3 @@
//
return STATUS_SUCCESS;
}
-
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp [iso-8859-1]
(original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usb_request.cpp [iso-8859-1] Thu
Feb 9 19:11:13 2012
@@ -36,7 +36,7 @@
}
// IUSBRequest interface functions
- virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager, IN
PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL
PUSB_ENDPOINT EndpointDescriptor, IN OUT ULONG TransferBufferLength, IN OUT PMDL
TransferBuffer);
+ virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager, IN
PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL
PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, IN OUT ULONG TransferBufferLength, IN OUT
PMDL TransferBuffer);
virtual NTSTATUS InitializeWithIrp(IN PDMAMEMORYMANAGER DmaManager, IN OUT PIRP
Irp);
virtual VOID CompletionCallback(IN NTSTATUS NtStatusCode, IN ULONG UrbStatusCode, IN
struct _QUEUE_HEAD *QueueHead);
virtual VOID CancelCallback(IN NTSTATUS NtStatusCode, IN struct _QUEUE_HEAD
*QueueHead);
@@ -62,10 +62,6 @@
NTSTATUS BuildSetupPacket();
NTSTATUS BuildSetupPacketFromURB();
ULONG InternalCalculateTransferLength();
- NTSTATUS BuildTransferDescriptorChain(IN PQUEUE_HEAD QueueHead, IN PVOID
TransferBuffer, IN ULONG TransferBufferLength, IN UCHAR PidCode, IN UCHAR
InitialDataToggle, OUT PQUEUE_TRANSFER_DESCRIPTOR * OutFirstDescriptor, OUT
PQUEUE_TRANSFER_DESCRIPTOR * OutLastDescriptor, OUT PUCHAR OutDataToggle, OUT PULONG
OutTransferBufferOffset);
- VOID InitDescriptor(IN PQUEUE_TRANSFER_DESCRIPTOR CurrentDescriptor, IN PVOID
TransferBuffer, IN ULONG TransferBufferLength, IN UCHAR PidCode, IN UCHAR DataToggle, OUT
PULONG OutDescriptorLength);
- VOID DumpQueueHead(IN PQUEUE_HEAD QueueHead);
-
// constructor / destructor
CUSBRequest(IUnknown *OuterUnknown){}
@@ -122,12 +118,17 @@
//
// store end point address
//
- PUSB_ENDPOINT m_EndpointDescriptor;
+ PUSB_ENDPOINT_DESCRIPTOR m_EndpointDescriptor;
//
// DMA queue head
//
PQUEUE_HEAD m_QueueHead;
+
+ //
+ // DMA transfer descriptors linked to the queue head
+ //
+ PQUEUE_TRANSFER_DESCRIPTOR m_TransferDescriptors[4];
//
// allocated setup packet from the DMA pool
@@ -140,8 +141,6 @@
//
NTSTATUS m_NtStatusCode;
ULONG m_UrbStatusCode;
-
- PVOID m_Base;
};
@@ -161,7 +160,7 @@
IN PDMAMEMORYMANAGER DmaManager,
IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket,
IN UCHAR DeviceAddress,
- IN OPTIONAL PUSB_ENDPOINT EndpointDescriptor,
+ IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor,
IN OUT ULONG TransferBufferLength,
IN OUT PMDL TransferBuffer)
{
@@ -322,7 +321,7 @@
//
// get endpoint descriptor
//
- m_EndpointDescriptor =
(PUSB_ENDPOINT)Urb->UrbBulkOrInterruptTransfer.PipeHandle;
+ m_EndpointDescriptor =
(PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle;
}
break;
@@ -588,7 +587,7 @@
//
// end point is defined in the low byte of bmAttributes
//
- TransferType = (m_EndpointDescriptor->EndPointDescriptor.bmAttributes &
USB_ENDPOINT_TYPE_MASK);
+ TransferType = (m_EndpointDescriptor->bmAttributes &
USB_ENDPOINT_TYPE_MASK);
}
else
{
@@ -596,7 +595,6 @@
// initialized with setup packet, must be a control transfer
//
TransferType = USB_ENDPOINT_TYPE_CONTROL;
- ASSERT(m_EndpointDescriptor == FALSE);
}
//
@@ -608,243 +606,13 @@
UCHAR
CUSBRequest::InternalGetPidDirection()
{
- if (m_EndpointDescriptor)
- {
- //
- // end point direction is highest bit in bEndpointAddress
- //
- return (m_EndpointDescriptor->EndPointDescriptor.bEndpointAddress &
USB_ENDPOINT_DIRECTION_MASK) >> 7;
- }
- else
- {
- //
- // request arrives on the control pipe, extract direction from setup packet
- //
- ASSERT(m_DescriptorPacket);
- return (m_DescriptorPacket->bmRequestType.B >> 7);
- }
-}
-
-VOID
-CUSBRequest::InitDescriptor(
- IN PQUEUE_TRANSFER_DESCRIPTOR CurrentDescriptor,
- IN PVOID TransferBuffer,
- IN ULONG TransferBufferLength,
- IN UCHAR PidCode,
- IN UCHAR DataToggle,
- OUT PULONG OutDescriptorLength)
-{
- ULONG Index, Length = 0, PageOffset, BufferLength;
-
- //
- // init transfer descriptor
- //
- CurrentDescriptor->Token.Bits.PIDCode = PidCode;
- CurrentDescriptor->Token.Bits.TotalBytesToTransfer = 0;
- CurrentDescriptor->Token.Bits.DataToggle = DataToggle;
-
- //
- // sanity check
- //
- ASSERT(TransferBufferLength);
-
- //
- // store buffers
- //
- Index = 0;
- do
- {
- //
- // use physical address
- //
- CurrentDescriptor->BufferPointer[Index] =
MmGetPhysicalAddress(TransferBuffer).LowPart;
-
- //
- // Get the offset from page size
- //
- PageOffset = BYTE_OFFSET(CurrentDescriptor->BufferPointer[Index]);
- if (PageOffset != 0)
- {
- //
- // move to next page
- //
- TransferBuffer = (PVOID)ROUND_TO_PAGES(TransferBuffer);
- }
- else
- {
- //
- // move to next page
- //
- TransferBuffer = (PVOID)((ULONG_PTR)TransferBuffer + PAGE_SIZE);
- }
-
- //
- // calculate buffer length
- //
- BufferLength = min(TransferBufferLength, PAGE_SIZE - PageOffset);
-
- //
- // increment transfer bytes
- //
- CurrentDescriptor->Token.Bits.TotalBytesToTransfer += BufferLength;
- CurrentDescriptor->TotalBytesToTransfer += BufferLength;
- Length += BufferLength;
- DPRINT("Index %lu TransferBufferLength %lu PageOffset %x BufferLength %lu
Buffer Phy %p TransferBuffer %p\n", Index, TransferBufferLength, PageOffset,
BufferLength, CurrentDescriptor->BufferPointer[Index], TransferBuffer);
-
- //
- // decrement available byte count
- //
- TransferBufferLength -= BufferLength;
- if (TransferBufferLength == 0)
- {
- //
- // end reached
- //
- break;
- }
-
- //
- // sanity check
- //
- if (Index > 1)
- {
- //
- // no equal buffers
- //
- ASSERT(CurrentDescriptor->BufferPointer[Index] !=
CurrentDescriptor->BufferPointer[Index-1]);
- }
-
- //
- // next descriptor index
- //
- Index++;
- }while(Index < 5);
-
- //
- // store result
- //
- *OutDescriptorLength = Length;
-}
-
-
-NTSTATUS
-CUSBRequest::BuildTransferDescriptorChain(
- IN PQUEUE_HEAD QueueHead,
- IN PVOID TransferBuffer,
- IN ULONG TransferBufferLength,
- IN UCHAR PidCode,
- IN UCHAR InitialDataToggle,
- OUT PQUEUE_TRANSFER_DESCRIPTOR * OutFirstDescriptor,
- OUT PQUEUE_TRANSFER_DESCRIPTOR * OutLastDescriptor,
- OUT PUCHAR OutDataToggle,
- OUT PULONG OutTransferBufferOffset)
-{
- PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor = NULL, CurrentDescriptor, LastDescriptor
= NULL;
- NTSTATUS Status;
- ULONG DescriptorLength, TransferBufferOffset = 0;
-
- do
- {
- //
- // allocate transfer descriptor
- //
- Status = CreateDescriptor(&CurrentDescriptor);
- if (!NT_SUCCESS(Status))
- {
- //
- // failed to allocate transfer descriptor
- //
- ASSERT(FALSE);
- return Status;
- }
-
- //
- // now init the descriptor
- //
- InitDescriptor(CurrentDescriptor,
- (PVOID)((ULONG_PTR)TransferBuffer + TransferBufferOffset),
- TransferBufferLength - TransferBufferOffset,
- PidCode,
- InitialDataToggle,
- &DescriptorLength);
-
- //
- // insert into queue head
- //
- InsertTailList(&QueueHead->TransferDescriptorListHead,
&CurrentDescriptor->DescriptorEntry);
-
- //
- // adjust offset
- //
- TransferBufferOffset += DescriptorLength;
-
- if (LastDescriptor)
- {
- //
- // link to current descriptor
- //
- LastDescriptor->AlternateNextPointer =
CurrentDescriptor->PhysicalAddr;
- LastDescriptor->NextPointer = CurrentDescriptor->PhysicalAddr;
- LastDescriptor = CurrentDescriptor;
- }
- else
- {
- //
- // first descriptor in chain
- //
- LastDescriptor = FirstDescriptor = CurrentDescriptor;
- }
-
- if(TransferBufferLength == TransferBufferOffset)
- {
- //
- // end reached
- //
- break;
- }
- }while(TRUE);
-
- if (OutFirstDescriptor)
- {
- //
- // store first descriptor
- //
- *OutFirstDescriptor = FirstDescriptor;
- }
-
- if (OutLastDescriptor)
- {
- //
- // store last descriptor
- //
- *OutLastDescriptor = CurrentDescriptor;
- }
-
- if (OutDataToggle)
- {
- //
- // flip data toggle
- //
- InitialDataToggle = !InitialDataToggle;
-
- //
- // store result data toggle
- //
- *OutDataToggle = InitialDataToggle;
- }
-
- if (OutTransferBufferOffset)
- {
- //
- // store offset
- //
- *OutTransferBufferOffset = TransferBufferOffset;
- }
-
- //
- // done
- //
- return STATUS_SUCCESS;
+ ASSERT(m_Irp);
+ ASSERT(m_EndpointDescriptor);
+
+ //
+ // end point is defined in the low byte of bEndpointAddress
+ //
+ return (m_EndpointDescriptor->bEndpointAddress & USB_ENDPOINT_DIRECTION_MASK)
>> 7;
}
//----------------------------------------------------------------------------------------
@@ -853,9 +621,8 @@
PQUEUE_HEAD * OutHead)
{
NTSTATUS Status;
- ULONG DescriptorChainLength;
+ ULONG NumTransferDescriptors, Index;
PQUEUE_HEAD QueueHead;
- PQUEUE_TRANSFER_DESCRIPTOR SetupDescriptor, StatusDescriptor, FirstDescriptor,
LastDescriptor;
//
// first allocate the queue head
@@ -883,34 +650,30 @@
//
// failed to allocate setup packet
//
- ASSERT(FALSE);
return STATUS_INSUFFICIENT_RESOURCES;
}
//
- // create setup descriptor
- //
- Status = CreateDescriptor(&SetupDescriptor);
- if (!NT_SUCCESS(Status))
- {
- //
- // failed to allocate transfer descriptor
- //
- ASSERT(FALSE);
- return Status;
- }
-
- //
- // create status descriptor
- //
- Status = CreateDescriptor(&StatusDescriptor);
- if (!NT_SUCCESS(Status))
- {
- //
- // failed to allocate transfer descriptor
- //
- ASSERT(FALSE);
- return Status;
+ // calculate num of transfer descriptors
+ //
+ NumTransferDescriptors = m_TransferBufferMDL != 0 ? 3 : 2;
+
+ //
+ // allocate transfer descriptors
+ //
+ for(Index = 0; Index < NumTransferDescriptors; Index++)
+ {
+ //
+ // allocate transfer descriptor
+ //
+ Status = CreateDescriptor(&m_TransferDescriptors[Index]);
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // failed to allocate transfer descriptor
+ //
+ return Status;
+ }
}
//
@@ -923,86 +686,102 @@
//
// set endpoint address and max packet length
//
- QueueHead->EndPointCharacteristics.EndPointNumber =
m_EndpointDescriptor->EndPointDescriptor.bEndpointAddress & 0x0F;
- QueueHead->EndPointCharacteristics.MaximumPacketLength =
m_EndpointDescriptor->EndPointDescriptor.wMaxPacketSize;
- }
-
- //
- // init setup descriptor
- //
- SetupDescriptor->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN;
- SetupDescriptor->Token.Bits.TotalBytesToTransfer =
sizeof(USB_DEFAULT_PIPE_SETUP_PACKET);
- SetupDescriptor->Token.Bits.DataToggle = FALSE;
- SetupDescriptor->BufferPointer[0] =
(ULONG)PtrToUlong(m_DescriptorSetupPacket.LowPart);
- InsertTailList(&QueueHead->TransferDescriptorListHead,
&SetupDescriptor->DescriptorEntry);
-
-
- //
- // init status descriptor
- //
- StatusDescriptor->Token.Bits.TotalBytesToTransfer = 0;
- StatusDescriptor->Token.Bits.DataToggle = TRUE;
- StatusDescriptor->Token.Bits.InterruptOnComplete = TRUE;
-
- //
- // is there data
- //
- if (m_TransferBufferLength)
- {
- Status = BuildTransferDescriptorChain(QueueHead,
-
MmGetMdlVirtualAddress(m_TransferBufferMDL),
- m_TransferBufferLength,
- InternalGetPidDirection(),
- TRUE,
- &FirstDescriptor,
- &LastDescriptor,
- NULL,
- &DescriptorChainLength);
-
- //
- // FIXME handle errors
- //
- ASSERT(Status == STATUS_SUCCESS);
- ASSERT(DescriptorChainLength == m_TransferBufferLength);
-
- //
- // now link the descriptors
- //
- SetupDescriptor->NextPointer = FirstDescriptor->PhysicalAddr;
- SetupDescriptor->AlternateNextPointer = FirstDescriptor->PhysicalAddr;
- LastDescriptor->NextPointer = StatusDescriptor->PhysicalAddr;
- LastDescriptor->AlternateNextPointer = StatusDescriptor->PhysicalAddr;
-
-
- //
- // pid code is flipped for ops with data stage
- //
- StatusDescriptor->Token.Bits.PIDCode = !InternalGetPidDirection();
+ QueueHead->EndPointCharacteristics.EndPointNumber =
m_EndpointDescriptor->bEndpointAddress & 0x0F;
+ QueueHead->EndPointCharacteristics.MaximumPacketLength =
m_EndpointDescriptor->wMaxPacketSize;
+ }
+
+ //
+ // setup descriptors
+ //
+ m_TransferDescriptors[0]->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN;
+ m_TransferDescriptors[0]->Token.Bits.TotalBytesToTransfer =
sizeof(USB_DEFAULT_PIPE_SETUP_PACKET);
+ m_TransferDescriptors[0]->Token.Bits.DataToggle = FALSE;
+ m_TransferDescriptors[0]->BufferPointer[0] =
(ULONG)PtrToUlong(m_DescriptorSetupPacket.LowPart);
+ m_TransferDescriptors[0]->NextPointer =
m_TransferDescriptors[1]->PhysicalAddr;
+ m_TransferDescriptors[0]->AlternateNextPointer =
m_TransferDescriptors[1]->PhysicalAddr;
+
+ if (m_TransferBufferMDL)
+ {
+ //
+ // setup in descriptor
+ //
+ m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_IN_TOKEN;
+ m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer =
m_TransferBufferLength;
+ m_TransferDescriptors[1]->NextPointer =
m_TransferDescriptors[2]->PhysicalAddr;
+ m_TransferDescriptors[1]->Token.Bits.DataToggle = TRUE;
+ m_TransferDescriptors[1]->AlternateNextPointer =
m_TransferDescriptors[2]->PhysicalAddr;
+
+ //
+ // FIXME: check if the request spawns over a page -> fill other members
+ //
+ PC_ASSERT(m_TransferBufferLength <= PAGE_SIZE);
+ m_TransferDescriptors[1]->BufferPointer[0] =
MmGetPhysicalAddress(MmGetMdlVirtualAddress(m_TransferBufferMDL)).LowPart;
+
+ //
+ // setup out descriptor
+ //
+ m_TransferDescriptors[2]->Token.Bits.PIDCode = PID_CODE_OUT_TOKEN;
+ m_TransferDescriptors[2]->Token.Bits.TotalBytesToTransfer = 0;
+ m_TransferDescriptors[2]->Token.Bits.DataToggle = TRUE;
+
+ //
+ // special case, setup alternative next descriptor in case of error
+ // HAIKU links to dead descriptor
+ //
+
+ //
+ // interrupt on completion
+ //
+ m_TransferDescriptors[2]->Token.Bits.InterruptOnComplete = TRUE;
}
else
{
//
- // direct link
- //
- SetupDescriptor->NextPointer = StatusDescriptor->PhysicalAddr;
- SetupDescriptor->AlternateNextPointer = StatusDescriptor->PhysicalAddr;
-
- //
- // retrieve result of operation
- //
- StatusDescriptor->Token.Bits.PIDCode = PID_CODE_IN_TOKEN;
- }
-
- //
- // insert status descriptor
- //
- InsertTailList(&QueueHead->TransferDescriptorListHead,
&StatusDescriptor->DescriptorEntry);
-
+ // no buffer, setup in descriptor
+ //
+ m_TransferDescriptors[1]->Token.Bits.PIDCode = PID_CODE_IN_TOKEN;
+ m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer = 0;
+ m_TransferDescriptors[1]->Token.Bits.DataToggle = TRUE;
+
+ //
+ // interrupt on completion
+ //
+ m_TransferDescriptors[1]->Token.Bits.InterruptOnComplete = TRUE;
+ }
//
// link transfer descriptors to queue head
//
- QueueHead->NextPointer = SetupDescriptor->PhysicalAddr;
+ QueueHead->NextPointer = m_TransferDescriptors[0]->PhysicalAddr;
+
+ DPRINT("QueueHead %p Addr %x\n", QueueHead, QueueHead->PhysicalAddr);
+ DPRINT("NumDescriptors %lu\n", NumTransferDescriptors);
+ DPRINT("QueueHead AlternateNextPointer %x\n",
QueueHead->AlternateNextPointer);
+ DPRINT("QueueHead NextPointer %x\n", QueueHead->NextPointer);
+ DPRINT("m_DescriptorSetupPacket HiPart %x LoPart %x\n",
m_DescriptorSetupPacket.HighPart, m_DescriptorSetupPacket.LowPart);
+
+
+ DPRINT("TransferDescriptor 0 Addr %x\n",
m_TransferDescriptors[0]->PhysicalAddr);
+ DPRINT("TransferDescriptor 0 Next %x\n",
m_TransferDescriptors[0]->NextPointer);
+ DPRINT("TransferDescriptor 0 AlternativeNext %x\n",
m_TransferDescriptors[0]->AlternateNextPointer);
+ DPRINT("TransferDescriptor 0 Buffer Pointer %x\n",
m_TransferDescriptors[0]->BufferPointer[0]);
+ DPRINT("TransferDescriptor 0 TotalBytesToTransfer 0x%x\n",
m_TransferDescriptors[0]->Token.Bits.TotalBytesToTransfer);
+
+ DPRINT("TransferDescriptor 1 Addr %x\n",
m_TransferDescriptors[1]->PhysicalAddr);
+ DPRINT("TransferDescriptor 1 Next %x\n",
m_TransferDescriptors[1]->NextPointer);
+ DPRINT("TransferDescriptor 1 AlternativeNext %x\n",
m_TransferDescriptors[1]->AlternateNextPointer);
+ DPRINT("TransferDescriptor 1 Buffer Pointer %x\n",
m_TransferDescriptors[1]->BufferPointer[0]);
+ DPRINT("TransferDescriptor 1 TotalBytesToTransfer 0x%x\n",
m_TransferDescriptors[1]->Token.Bits.TotalBytesToTransfer);
+
+ if (NumTransferDescriptors == 3)
+ {
+ DPRINT("TransferDescriptor 2 Addr %x\n",
m_TransferDescriptors[2]->PhysicalAddr);
+ DPRINT("TransferDescriptor 2 Next %x\n",
m_TransferDescriptors[2]->NextPointer);
+ DPRINT("TransferDescriptor 2 AlternativeNext %x\n",
m_TransferDescriptors[2]->AlternateNextPointer);
+ DPRINT("TransferDescriptor 2 Buffer Pointer %x\n",
m_TransferDescriptors[2]->BufferPointer[0]);
+ DPRINT("TransferDescriptor 2 TotalBytesToTransfer 0x%x\n",
m_TransferDescriptors[2]->Token.Bits.TotalBytesToTransfer);
+ }
+
//
// store result
@@ -1010,80 +789,10 @@
*OutHead = QueueHead;
//
- // displays the current request
- //
- //DumpQueueHead(QueueHead);
-
- DPRINT1("BuildControlTransferQueueHead done\n");
- //
// done
//
return STATUS_SUCCESS;
}
-
-VOID
-CUSBRequest::DumpQueueHead(
- IN PQUEUE_HEAD QueueHead)
-{
- PLIST_ENTRY Entry;
- PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
- ULONG Index = 0;
-
- DPRINT1("QueueHead %p Addr %x\n", QueueHead, QueueHead->PhysicalAddr);
- DPRINT1("QueueHead AlternateNextPointer %x\n",
QueueHead->AlternateNextPointer);
- DPRINT1("QueueHead NextPointer %x\n", QueueHead->NextPointer);
-
- DPRINT1("QueueHead HubAddr %x\n",
QueueHead->EndPointCharacteristics.ControlEndPointFlag);
- DPRINT1("QueueHead DeviceAddress %x\n",
QueueHead->EndPointCharacteristics.DeviceAddress);
- DPRINT1("QueueHead EndPointNumber %x\n",
QueueHead->EndPointCharacteristics.EndPointNumber);
- DPRINT1("QueueHead EndPointSpeed %x\n",
QueueHead->EndPointCharacteristics.EndPointSpeed);
- DPRINT1("QueueHead HeadOfReclamation %x\n",
QueueHead->EndPointCharacteristics.HeadOfReclamation);
- DPRINT1("QueueHead InactiveOnNextTransaction %x\n",
QueueHead->EndPointCharacteristics.InactiveOnNextTransaction);
- DPRINT1("QueueHead MaximumPacketLength %x\n",
QueueHead->EndPointCharacteristics.MaximumPacketLength);
- DPRINT1("QueueHead NakCountReload %x\n",
QueueHead->EndPointCharacteristics.NakCountReload);
- DPRINT1("QueueHead QEDTDataToggleControl %x\n",
QueueHead->EndPointCharacteristics.QEDTDataToggleControl);
- DPRINT1("QueueHead HubAddr %x\n",
QueueHead->EndPointCapabilities.HubAddr);
- DPRINT1("QueueHead InterruptScheduleMask %x\n",
QueueHead->EndPointCapabilities.InterruptScheduleMask);
- DPRINT1("QueueHead NumberOfTransactionPerFrame %x\n",
QueueHead->EndPointCapabilities.NumberOfTransactionPerFrame);
- DPRINT1("QueueHead PortNumber %x\n",
QueueHead->EndPointCapabilities.PortNumber);
- DPRINT1("QueueHead SplitCompletionMask %x\n",
QueueHead->EndPointCapabilities.SplitCompletionMask);
-
- Entry = QueueHead->TransferDescriptorListHead.Flink;
- while(Entry != &QueueHead->TransferDescriptorListHead)
- {
- //
- // get transfer descriptor
- //
- Descriptor = (PQUEUE_TRANSFER_DESCRIPTOR)CONTAINING_RECORD(Entry,
QUEUE_TRANSFER_DESCRIPTOR, DescriptorEntry);
-
- DPRINT1("TransferDescriptor %lu Addr %x\n", Index,
Descriptor->PhysicalAddr);
- DPRINT1("TransferDescriptor %lu Next %x\n", Index,
Descriptor->NextPointer);
- DPRINT1("TransferDescriptor %lu AlternateNextPointer %x\n", Index,
Descriptor->AlternateNextPointer);
- DPRINT1("TransferDescriptor %lu Active %lu\n", Index,
Descriptor->Token.Bits.Active);
- DPRINT1("TransferDescriptor %lu BabbleDetected %lu\n", Index,
Descriptor->Token.Bits.BabbleDetected);
- DPRINT1("TransferDescriptor %lu CurrentPage %lu\n", Index,
Descriptor->Token.Bits.CurrentPage);
- DPRINT1("TransferDescriptor %lu DataBufferError %lu\n", Index,
Descriptor->Token.Bits.DataBufferError);
- DPRINT1("TransferDescriptor %lu DataToggle %lu\n", Index,
Descriptor->Token.Bits.DataToggle);
- DPRINT1("TransferDescriptor %lu ErrorCounter %lu\n", Index,
Descriptor->Token.Bits.ErrorCounter);
- DPRINT1("TransferDescriptor %lu Halted %lu\n", Index,
Descriptor->Token.Bits.Halted);
- DPRINT1("TransferDescriptor %lu InterruptOnComplete %x\n", Index,
Descriptor->Token.Bits.InterruptOnComplete);
- DPRINT1("TransferDescriptor %lu MissedMicroFrame %lu\n", Index,
Descriptor->Token.Bits.MissedMicroFrame);
- DPRINT1("TransferDescriptor %lu PIDCode %lu\n", Index,
Descriptor->Token.Bits.PIDCode);
- DPRINT1("TransferDescriptor %lu PingState %lu\n", Index,
Descriptor->Token.Bits.PingState);
- DPRINT1("TransferDescriptor %lu SplitTransactionState %lu\n", Index,
Descriptor->Token.Bits.SplitTransactionState);
- DPRINT1("TransferDescriptor %lu TotalBytesToTransfer %lu\n", Index,
Descriptor->Token.Bits.TotalBytesToTransfer);
- DPRINT1("TransferDescriptor %lu TransactionError %lu\n", Index,
Descriptor->Token.Bits.TransactionError);
-
- DPRINT1("TransferDescriptor %lu Buffer Pointer 0 %x\n", Index,
Descriptor->BufferPointer[0]);
- DPRINT1("TransferDescriptor %lu Buffer Pointer 1 %x\n", Index,
Descriptor->BufferPointer[1]);
- DPRINT1("TransferDescriptor %lu Buffer Pointer 2 %x\n", Index,
Descriptor->BufferPointer[2]);
- DPRINT1("TransferDescriptor %lu Buffer Pointer 3 %x\n", Index,
Descriptor->BufferPointer[3]);
- DPRINT1("TransferDescriptor %lu Buffer Pointer 4 %x\n", Index,
Descriptor->BufferPointer[4]);
- Entry = Entry->Flink;
- Index++;
- }
-}
-
//----------------------------------------------------------------------------------------
NTSTATUS
@@ -1092,9 +801,11 @@
{
NTSTATUS Status;
PQUEUE_HEAD QueueHead;
+ ULONG TransferDescriptorCount, Index;
+ ULONG BytesAvailable, BufferIndex;
PVOID Base;
- ULONG ChainDescriptorLength;
- PQUEUE_TRANSFER_DESCRIPTOR FirstDescriptor, LastDescriptor;
+ ULONG PageOffset, CurrentTransferBufferLength;
+ UCHAR DataToggle;
//
// Allocate the queue head
@@ -1115,81 +826,279 @@
PC_ASSERT(QueueHead);
PC_ASSERT(m_TransferBufferLength);
- if (!m_Base)
- {
- //
- // get virtual base of mdl
- //
- m_Base = MmGetSystemAddressForMdlSafe(m_TransferBufferMDL, NormalPagePriority);
- }
+ //
+ // Max default of 3 descriptors
+ //
+ TransferDescriptorCount = 3;
+
+ //
+ // get virtual base of mdl
+ //
+ Base = MmGetSystemAddressForMdlSafe(m_TransferBufferMDL, NormalPagePriority);
//
// Increase the size of last transfer, 0 in case this is the first
//
- Base = (PVOID)((ULONG_PTR)m_Base + m_TransferBufferLengthCompleted);
+ Base = (PVOID)((ULONG_PTR)Base + m_TransferBufferLengthCompleted);
PC_ASSERT(m_EndpointDescriptor);
PC_ASSERT(Base);
//
- // sanity check
- //
- ASSERT(m_EndpointDescriptor);
-
- //
- // build bulk transfer descriptor chain
- //
- Status = BuildTransferDescriptorChain(QueueHead,
- Base,
- m_TransferBufferLength -
m_TransferBufferLengthCompleted,
- InternalGetPidDirection(),
- m_EndpointDescriptor->DataToggle,
- &FirstDescriptor,
- &LastDescriptor,
- &m_EndpointDescriptor->DataToggle,
- &ChainDescriptorLength);
-
- //
- // FIXME: handle errors
- //
- ASSERT(ChainDescriptorLength == m_TransferBufferLength);
-
- //
- // move to next offset
- //
- m_TransferBufferLengthCompleted += ChainDescriptorLength;
-
- ASSERT(Status == STATUS_SUCCESS);
-
- //
- // init queue head
+ // Get the offset from page size
+ //
+ PageOffset = BYTE_OFFSET(Base);
+
+ //
+ // PageOffset should only be > 0 if this is the first transfer for this requests
+ //
+ if ((PageOffset != 0) && (m_TransferBufferLengthCompleted != 0))
+ {
+ ASSERT(FALSE);
+ }
+
+ //
+ // Calculate the size of this transfer
+ //
+ if ((PageOffset != 0) && ((m_TransferBufferLength -
m_TransferBufferLengthCompleted) >= (PAGE_SIZE * 4) + PageOffset))
+ {
+ CurrentTransferBufferLength = (PAGE_SIZE * 4) + PageOffset;
+ }
+ else if ((m_TransferBufferLength - m_TransferBufferLengthCompleted) >= PAGE_SIZE *
5)
+ {
+ CurrentTransferBufferLength = PAGE_SIZE * 5;
+ }
+ else
+ CurrentTransferBufferLength = (m_TransferBufferLength -
m_TransferBufferLengthCompleted);
+
+ //
+ // Add current transfer length to transfer length completed
+ //
+ m_TransferBufferLengthCompleted += CurrentTransferBufferLength;
+ BytesAvailable = CurrentTransferBufferLength;
+
+ DPRINT1("BuildBulkTransferQueueHead\n");
+ DPRINT("CurrentTransferBufferLength %x, m_TransferBufferLengthCompleted
%x\n", CurrentTransferBufferLength, m_TransferBufferLengthCompleted);
+
+ DPRINT("EndPointAddress %x\n", m_EndpointDescriptor->bEndpointAddress);
+ DPRINT("EndPointDirection %x\n",
USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->bEndpointAddress));
+
+ DPRINT("Request %p Base Address %p TransferBytesLength %lu MDL %p\n", this,
Base, BytesAvailable, m_TransferBufferMDL);
+ DPRINT("InternalGetPidDirection() %d EndPointAddress %x\n",
InternalGetPidDirection(), m_EndpointDescriptor->bEndpointAddress & 0x0F);
+ DPRINT("Irp %p QueueHead %p\n", m_Irp, QueueHead);
+
+ //PC_ASSERT(InternalGetPidDirection() ==
USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->bEndpointAddress));
+
+ //
+ // DataToggle
+ //
+ DataToggle = FALSE;
+
+ //
+ // Allocated transfer descriptors
+ //
+ for (Index = 0; Index < TransferDescriptorCount; Index++)
+ {
+ Status = CreateDescriptor(&m_TransferDescriptors[Index]);
+ if (!NT_SUCCESS(Status))
+ {
+ //
+ // Failed to allocate transfer descriptors
+ //
+
+ //
+ // Free QueueHead
+ //
+ FreeQueueHead(QueueHead);
+
+ //
+ // Free Descriptors
+ // FIXME: Implement FreeDescriptors
+ //
+ return Status;
+ }
+
+ //
+ // sanity check
+ //
+ PC_ASSERT(BytesAvailable);
+
+ //
+ // now setup transfer buffers
+ //
+ for(BufferIndex = 0; BufferIndex < 5; BufferIndex++)
+ {
+ //
+ // If this is the first buffer of the first descriptor and there is a
PageOffset
+ //
+ if ((BufferIndex == 0) && (PageOffset != 0) && (Index == 0))
+ {
+ //
+ // use physical address
+ //
+ m_TransferDescriptors[Index]->BufferPointer[0] =
MmGetPhysicalAddress(Base).LowPart;
+
+ //
+ // move to next page
+ //
+ Base = (PVOID)ROUND_TO_PAGES(Base);
+
+ //
+ // increment transfer bytes
+ //
+ if (CurrentTransferBufferLength > PAGE_SIZE - PageOffset)
+ m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer =
PAGE_SIZE - PageOffset;
+ else
+ m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer =
CurrentTransferBufferLength;
+
+ //
+ // decrement available byte count
+ //
+ BytesAvailable -=
m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer;
+
+ DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p
BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index,
m_TransferDescriptors[Index]->BufferPointer[BufferIndex],
+ BufferIndex,
m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable);
+ }
+ else
+ {
+ //
+ // the following pages always start on byte zero of each page
+ //
+ PC_ASSERT(((ULONG_PTR)Base & (PAGE_SIZE-1)) == 0);
+
+ if (BytesAvailable >= PAGE_SIZE)
+ {
+ //
+ // store address
+ //
+ m_TransferDescriptors[Index]->BufferPointer[BufferIndex] =
MmGetPhysicalAddress(Base).LowPart;
+
+ //
+ // move to next page
+ //
+ Base = (PVOID)((ULONG_PTR)Base + PAGE_SIZE);
+
+ //
+ // increment transfer descriptor bytes
+ //
+ m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer +=
PAGE_SIZE;
+
+ //
+ // decrement available byte count
+ //
+ BytesAvailable -= PAGE_SIZE;
+
+ DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p
BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index,
m_TransferDescriptors[Index]->BufferPointer[BufferIndex],
+ BufferIndex,
m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable);
+ }
+ else
+ {
+ PC_ASSERT(BytesAvailable);
+
+ if (BytesAvailable)
+ {
+ //
+ // store address
+ //
+ m_TransferDescriptors[Index]->BufferPointer[BufferIndex] =
MmGetPhysicalAddress(Base).LowPart;
+
+ //
+ // increment transfer descriptor bytes
+ //
+ m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer
+= BytesAvailable;
+
+ //
+ // decrement available byte count
+ //
+ BytesAvailable -= BytesAvailable;
+
+ //
+ // done as this is the last partial or full page
+ //
+ }
+ DPRINT1("TransferDescriptor %p Index %lu BufferPointer %p
BufferIndex %lu TotalBytes %lu Remaining %lu\n", m_TransferDescriptors[Index], Index,
m_TransferDescriptors[Index]->BufferPointer[BufferIndex],
+ BufferIndex,
m_TransferDescriptors[Index]->Token.Bits.TotalBytesToTransfer, BytesAvailable);
+
+ break;
+ }
+ }
+
+ //
+ // Check if all bytes have been consumed
+ //
+ if (BytesAvailable == 0)
+ break;
+ }
+
+ //
+ // Go ahead and link descriptors
+ //
+ if (Index > 0)
+ {
+ m_TransferDescriptors[Index - 1]->NextPointer =
m_TransferDescriptors[Index]->PhysicalAddr;
+ }
+
+
+ //
+ // status descriptor
+ //
+ m_TransferDescriptors[Index]->Token.Bits.InterruptOnComplete = TRUE;
+
+ //
+ // FIXME: need status descriptor?
+ //
+
+ //
+ // setup direction
+ //
+ m_TransferDescriptors[Index]->Token.Bits.PIDCode = InternalGetPidDirection();
+
+ //
+ // set data toggle
+ //
+ m_TransferDescriptors[Index]->Token.Bits.DataToggle = DataToggle;
+ DataToggle = !DataToggle;
+
+ //
+ // Check if all bytes have been consumed
+ //
+ if (BytesAvailable == 0)
+ break;
+ }
+
+ //
+ // all bytes should have been consumed
+ //
+ PC_ASSERT(BytesAvailable == 0);
+
+ //
+ // Initialize the QueueHead
//
QueueHead->EndPointCharacteristics.DeviceAddress = GetDeviceAddress();
- QueueHead->EndPointCharacteristics.EndPointNumber =
m_EndpointDescriptor->EndPointDescriptor.bEndpointAddress & 0x0F;
- QueueHead->EndPointCharacteristics.MaximumPacketLength =
m_EndpointDescriptor->EndPointDescriptor.wMaxPacketSize;
- QueueHead->NextPointer = FirstDescriptor->PhysicalAddr;
- QueueHead->CurrentLinkPointer = FirstDescriptor->PhysicalAddr;
- QueueHead->AlternateNextPointer = TERMINATE_POINTER;
-
- ASSERT(QueueHead->EndPointCharacteristics.DeviceAddress);
- ASSERT(QueueHead->EndPointCharacteristics.EndPointNumber);
- ASSERT(QueueHead->EndPointCharacteristics.MaximumPacketLength);
- ASSERT(QueueHead->NextPointer);
-
- //
- // interrupt on last descriptor
- //
- LastDescriptor->Token.Bits.InterruptOnComplete = TRUE;
+
+ if (m_EndpointDescriptor)
+ {
+ //
+ // Set endpoint address and max packet length
+ //
+ QueueHead->EndPointCharacteristics.EndPointNumber =
m_EndpointDescriptor->bEndpointAddress & 0x0F;
+ QueueHead->EndPointCharacteristics.MaximumPacketLength =
m_EndpointDescriptor->wMaxPacketSize;
+ }
+
+ //
+ // store number of transactions
+ //
+ QueueHead->EndPointCapabilities.NumberOfTransactionPerFrame = min(Index, 1);
+
+ //
+ // link descriptor with queue head
+ //
+ QueueHead->NextPointer = m_TransferDescriptors[0]->PhysicalAddr;
//
// store result
//
*OutHead = QueueHead;
-
- //
- // dump status
- //
- //DumpQueueHead(QueueHead);
//
// done
@@ -1267,7 +1176,6 @@
QueueHead->HorizontalLinkPointer = TERMINATE_POINTER;
QueueHead->AlternateNextPointer = TERMINATE_POINTER;
QueueHead->NextPointer = TERMINATE_POINTER;
- InitializeListHead(&QueueHead->TransferDescriptorListHead);
//
// 1 for non high speed, 0 for high speed device
@@ -1628,42 +1536,61 @@
CUSBRequest::FreeQueueHead(
IN struct _QUEUE_HEAD * QueueHead)
{
- PLIST_ENTRY Entry;
- PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
-
- //
- // sanity checks
- //
- ASSERT(m_DmaManager);
- ASSERT(QueueHead);
- ASSERT(!IsListEmpty(&QueueHead->TransferDescriptorListHead));
-
- do
- {
- //
- // get transfer descriptors
- //
- Entry = RemoveHeadList(&QueueHead->TransferDescriptorListHead);
- ASSERT(Entry);
-
- //
- // obtain descriptor from entry
- //
- Descriptor = (PQUEUE_TRANSFER_DESCRIPTOR)CONTAINING_RECORD(Entry,
QUEUE_TRANSFER_DESCRIPTOR, DescriptorEntry);
- ASSERT(Descriptor);
-
- //
- // add transfer count
- //
- m_TotalBytesTransferred += (Descriptor->TotalBytesToTransfer -
Descriptor->Token.Bits.TotalBytesToTransfer);
- DPRINT("TotalBytes Transferred in Descriptor %p Phys Addr %x
TotalBytesSoftware %lu Length %lu\n", Descriptor, Descriptor->PhysicalAddr,
Descriptor->TotalBytesToTransfer, Descriptor->TotalBytesToTransfer -
Descriptor->Token.Bits.TotalBytesToTransfer);
-
- //
- // release transfer descriptors
- //
- m_DmaManager->Release(Descriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR));
-
- }while(!IsListEmpty(&QueueHead->TransferDescriptorListHead));
+ LONG DescriptorCount;
+
+ //
+ // FIXME: support chained queue heads
+ //
+ //PC_ASSERT(QueueHead == m_QueueHead);
+
+ //
+ // release queue head
+ //
+ m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD));
+
+ //
+ // nullify pointer
+ //
+ m_QueueHead = 0;
+
+ //
+ // release transfer descriptors
+ //
+ for (DescriptorCount = 0; DescriptorCount < 3; DescriptorCount++)
+ {
+ if (m_TransferDescriptors[DescriptorCount])
+ {
+ //
+ // Calculate Total Bytes Transferred
+ // FIXME: Is this the correct method of determine bytes transferred?
+ //
+ if (USB_ENDPOINT_TYPE_BULK == GetTransferType())
+ {
+ //
+ // sanity check
+ //
+ ASSERT(m_EndpointDescriptor);
+
+ if
(USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->bEndpointAddress))
+ {
+ DPRINT("m_TotalBytesTransferred %x, %x - %x\n",
+ m_TotalBytesTransferred,
+ m_TransferDescriptors[DescriptorCount]->TotalBytesToTransfer,
+
m_TransferDescriptors[DescriptorCount]->Token.Bits.TotalBytesToTransfer);
+
+ m_TotalBytesTransferred +=
+ m_TransferDescriptors[DescriptorCount]->TotalBytesToTransfer
-
+
m_TransferDescriptors[DescriptorCount]->Token.Bits.TotalBytesToTransfer;
+ }
+ }
+
+ //
+ // release transfer descriptors
+ //
+ m_DmaManager->Release(m_TransferDescriptors[DescriptorCount],
sizeof(QUEUE_TRANSFER_DESCRIPTOR));
+ m_TransferDescriptors[DescriptorCount] = 0;
+ }
+ }
if (m_DescriptorPacket)
{
@@ -1671,18 +1598,8 @@
// release packet descriptor
//
m_DmaManager->Release(m_DescriptorPacket,
sizeof(USB_DEFAULT_PIPE_SETUP_PACKET));
- }
-
- //
- // release queue head
- //
- m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD));
-
- //
- // nullify pointers
- //
- m_QueueHead = 0;
- m_DescriptorPacket = 0;
+ m_DescriptorPacket = 0;
+ }
}
//-----------------------------------------------------------------------------------------
@@ -1690,8 +1607,7 @@
CUSBRequest::IsQueueHeadComplete(
struct _QUEUE_HEAD * QueueHead)
{
- PLIST_ENTRY Entry;
- PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
+ ULONG Index;
//
// first check - is the queue head currently active
@@ -1701,50 +1617,39 @@
//
// queue head is active (currently processed)
//
- return FALSE;
- }
-
- if (QueueHead->Token.Bits.Halted)
- {
- //
- // error occured
- //
- DPRINT1("Found halted queue head %p\n", QueueHead);
- DumpQueueHead(QueueHead);
- ASSERT(FALSE);
- return TRUE;
- }
-
- //
- // loop list and see if there are any active descriptors
- //
- Entry = QueueHead->TransferDescriptorListHead.Flink;
- while(Entry != &QueueHead->TransferDescriptorListHead)
- {
- //
- // obtain descriptor from entry
- //
- Descriptor = (PQUEUE_TRANSFER_DESCRIPTOR)CONTAINING_RECORD(Entry,
QUEUE_TRANSFER_DESCRIPTOR, DescriptorEntry);
- ASSERT(Descriptor);
- if (Descriptor->Token.Bits.Active)
+ ASSERT(QueueHead->Token.Bits.Halted == FALSE);
+ //return FALSE;
+ }
+
+ //
+ // FIXME: support chained queue heads
+ //
+ for(Index = 0; Index < 3; Index++)
+ {
+ //
+ // check transfer descriptors for completion
+ //
+ if (m_TransferDescriptors[Index])
{
//
- // descriptor is still active
- //
- return FALSE;
+ // check for serious error
+ //
+ DPRINT("Descriptor Addr %x\n",
m_TransferDescriptors[Index]->PhysicalAddr);
+ DPRINT("Descriptor BabbleDetected %x\n",
m_TransferDescriptors[Index]->Token.Bits.BabbleDetected);
+ DPRINT("Descriptor DataBufferError %x\n",
m_TransferDescriptors[Index]->Token.Bits.DataBufferError);
+ DPRINT("Descriptor DataToggle %x\n",
m_TransferDescriptors[Index]->Token.Bits.DataToggle);
+ DPRINT("Descriptor ErrorCounter %x\n",
m_TransferDescriptors[Index]->Token.Bits.ErrorCounter);
+ DPRINT("Descriptor TransactionError %x\n",
m_TransferDescriptors[Index]->Token.Bits.TransactionError);
+
+
+ //
+ // the transfer descriptor should be in the same state as the queue head
+ //
+ //PC_ASSERT(m_TransferDescriptors[Index]->Token.Bits.Active == 0);
}
-
- //
- // move to next entry
- //
- Entry = Entry->Flink;
- }
-
- DPRINT("QueueHead %p Addr %x is complete\n", QueueHead,
QueueHead->PhysicalAddr);
-
- //
- // no active descriptors found, queue head is finished
- //
+ }
+ //ASSERT(FALSE);
+
return TRUE;
}
@@ -1777,7 +1682,8 @@
// sanity check
//
ASSERT(m_EndpointDescriptor);
- if
(USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->EndPointDescriptor.bEndpointAddress))
+
+ if (USB_ENDPOINT_DIRECTION_IN(m_EndpointDescriptor->bEndpointAddress))
{
//
// bulk in request
Modified: branches/usb-bringup-trunk/drivers/usb/usbehci_new/usbehci.h
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/u…
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbehci_new/usbehci.h [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbehci_new/usbehci.h [iso-8859-1] Thu Feb 9
19:11:13 2012
@@ -38,28 +38,6 @@
#define C_PORT_SUSPEND 18
#define C_PORT_OVER_CURRENT 19
#define C_PORT_RESET 20
-
-typedef struct _USB_ENDPOINT
-{
- USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
- UCHAR HubAddress;
- UCHAR HubPort;
- UCHAR DataToggle;
-} USB_ENDPOINT, *PUSB_ENDPOINT;
-
-typedef struct _USB_INTERFACE
-{
- USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
- USB_ENDPOINT *EndPoints;
-} USB_INTERFACE, *PUSB_INTERFACE;
-
-typedef struct _USB_CONFIGURATION
-{
- USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
- USB_INTERFACE *Interfaces;
-} USB_CONFIGURATION, *PUSB_CONFIGURATION;
-
-
typedef struct
{