[USBEHCI]

- Revert 55515, 55502, 55491, 55490, 55489 as it breaks mass storage support in VBox + Vmware

svn path=/branches/usb-bringup-trunk/; revision=55516
This commit is contained in:
Johannes Anderwald 2012-02-09 19:11:13 +00:00
parent 08ec4cc76d
commit d54653187b
8 changed files with 451 additions and 871 deletions

View file

@ -32,11 +32,6 @@ VOID
NTAPI NTAPI
StatusChangeWorkItemRoutine(PVOID Context); StatusChangeWorkItemRoutine(PVOID Context);
VOID
NTAPI
QueueHeadCompletionRoutine(PVOID Context);
class CUSBHardwareDevice : public IUSBHardwareDevice class CUSBHardwareDevice : public IUSBHardwareDevice
{ {
public: public:
@ -99,7 +94,6 @@ public:
friend BOOLEAN NTAPI InterruptServiceRoutine(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext); 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 EhciDefferedRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
friend VOID NTAPI StatusChangeWorkItemRoutine(PVOID Context); friend VOID NTAPI StatusChangeWorkItemRoutine(PVOID Context);
friend VOID NTAPI QueueHeadCompletionRoutine(PVOID Context);
// constructor / destructor // constructor / destructor
CUSBHardwareDevice(IUnknown *OuterUnknown){} CUSBHardwareDevice(IUnknown *OuterUnknown){}
virtual ~CUSBHardwareDevice(){} virtual ~CUSBHardwareDevice(){}
@ -1312,37 +1306,6 @@ InterruptServiceRoutine(
return TRUE; 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 VOID NTAPI
EhciDefferedRoutine( EhciDefferedRoutine(
IN PKDPC Dpc, IN PKDPC Dpc,
@ -1354,7 +1317,6 @@ EhciDefferedRoutine(
ULONG CStatus, PortStatus, PortCount, i, ShouldRingDoorBell; ULONG CStatus, PortStatus, PortCount, i, ShouldRingDoorBell;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
EHCI_USBCMD_CONTENT UsbCmd; EHCI_USBCMD_CONTENT UsbCmd;
PQUEUE_HEAD_COMPLETION Context;
This = (CUSBHardwareDevice*) SystemArgument1; This = (CUSBHardwareDevice*) SystemArgument1;
CStatus = (ULONG) SystemArgument2; CStatus = (ULONG) SystemArgument2;
@ -1377,7 +1339,6 @@ EhciDefferedRoutine(
// controller reported error // controller reported error
// //
DPRINT1("CStatus %x\n", CStatus); DPRINT1("CStatus %x\n", CStatus);
ASSERT(FALSE);
} }
// //
@ -1424,22 +1385,14 @@ EhciDefferedRoutine(
PC_ASSERT(This->m_DoorBellRingInProgress == TRUE); PC_ASSERT(This->m_DoorBellRingInProgress == TRUE);
// //
// get command register // now notify IUSBQueue that it can free completed requests
// //
This->GetCommandRegister(&UsbCmd); This->m_UsbQueue->CompleteAsyncRequests();
ASSERT(UsbCmd.DoorBell == FALSE);
// //
// allocate work item context // door ring bell completed
// //
Context = (PQUEUE_HEAD_COMPLETION)ExAllocatePool(NonPagedPool, sizeof(QUEUE_HEAD_COMPLETION)); This->m_DoorBellRingInProgress = FALSE;
if (Context)
{
ExInitializeWorkItem(&Context->QueueHeadWorkItem, QueueHeadCompletionRoutine, Context);
Context->This = This;
ExQueueWorkItem(&Context->QueueHeadWorkItem, DelayedWorkQueue);
}
} }
This->GetDeviceDetails(NULL, NULL, &PortCount, NULL); This->GetDeviceDetails(NULL, NULL, &PortCount, NULL);

View file

@ -148,7 +148,7 @@ typedef struct _QUEUE_TRANSFER_DESCRIPTOR
//Software //Software
ULONG PhysicalAddr; ULONG PhysicalAddr;
LIST_ENTRY DescriptorEntry; LIST_ENTRY LinkedDescriptors;
ULONG TotalBytesToTransfer; ULONG TotalBytesToTransfer;
} QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR; } QUEUE_TRANSFER_DESCRIPTOR, *PQUEUE_TRANSFER_DESCRIPTOR;
@ -216,21 +216,9 @@ typedef struct _QUEUE_HEAD
//Software //Software
ULONG PhysicalAddr; ULONG PhysicalAddr;
LIST_ENTRY LinkedQueueHeads; LIST_ENTRY LinkedQueueHeads;
LIST_ENTRY TransferDescriptorListHead;
PVOID Request; PVOID Request;
} QUEUE_HEAD, *PQUEUE_HEAD; } 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); C_ASSERT(FIELD_OFFSET(QUEUE_HEAD, PhysicalAddr) == 0x30);
@ -304,4 +292,3 @@ typedef struct
ULONG PortChange; ULONG PortChange;
}EHCI_PORT_STATUS; }EHCI_PORT_STATUS;

View file

@ -70,9 +70,6 @@ public:
NTSTATUS HandleClassEndpoint(IN OUT PIRP Irp, PURB Urb); NTSTATUS HandleClassEndpoint(IN OUT PIRP Irp, PURB Urb);
NTSTATUS HandleBulkOrInterruptTransfer(IN OUT PIRP Irp, PURB Urb); NTSTATUS HandleBulkOrInterruptTransfer(IN OUT PIRP Irp, PURB Urb);
NTSTATUS HandleIsochronousTransfer(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); friend VOID StatusChangeEndpointCallBack(PVOID Context);
@ -1678,21 +1675,12 @@ CHubController::HandleClassEndpoint(
// //
// initialize setup packet // initialize setup packet
// //
CtrlSetup.bmRequestType.B = 0x22; //FIXME: Const. CtrlSetup.bmRequestType.B = 0xa2; //FIXME: Const.
CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request; CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request;
CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value; CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value;
CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index; CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index;
CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength; 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 // issue request
// //
@ -1710,185 +1698,6 @@ CHubController::HandleClassEndpoint(
return Status; 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 NTSTATUS
CHubController::HandleClassInterface( CHubController::HandleClassInterface(
@ -1938,20 +1747,12 @@ CHubController::HandleClassInterface(
// //
// initialize setup packet // initialize setup packet
// //
CtrlSetup.bmRequestType.B = 0x21; CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const.
CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request; CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request;
CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value; CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value;
CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index; CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index;
CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength; 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 // issue request
// //
@ -1960,13 +1761,8 @@ CHubController::HandleClassInterface(
// //
// assert on failure // assert on failure
// //
if (!NT_SUCCESS(Status)) PC_ASSERT(NT_SUCCESS(Status));
{
//
// display error
//
DPRINT1("URB_FUNCTION_CLASS_INTERFACE failed with Urb Status %x\n", Urb->UrbHeader.Status);
}
// //
// done // done
@ -2010,16 +1806,6 @@ CHubController::HandleDeviceControl(
switch (Urb->UrbHeader.Function) 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: case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE:
Status = HandleGetDescriptorFromInterface(Irp, Urb); Status = HandleGetDescriptorFromInterface(Irp, Urb);
break; break;

View file

@ -379,7 +379,6 @@ typedef IDMAMemoryManager *PDMAMEMORYMANAGER;
// //
struct _QUEUE_HEAD; struct _QUEUE_HEAD;
struct _USB_ENDPOINT;
DECLARE_INTERFACE_(IUSBRequest, IUnknown) DECLARE_INTERFACE_(IUSBRequest, IUnknown)
{ {
@ -396,7 +395,7 @@ DECLARE_INTERFACE_(IUSBRequest, IUnknown)
virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager, virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager,
IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket,
IN UCHAR DeviceAddress, IN UCHAR DeviceAddress,
IN OPTIONAL struct _USB_ENDPOINT *EndpointDescriptor, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor,
IN OUT ULONG TransferBufferLength, IN OUT ULONG TransferBufferLength,
IN OUT PMDL TransferBuffer) = 0; IN OUT PMDL TransferBuffer) = 0;
@ -589,15 +588,6 @@ DECLARE_INTERFACE_(IUSBQueue, IUnknown)
// This function gets called by IUSBHardware after it the Interrupt on Async Advance bit has been set // This function gets called by IUSBHardware after it the Interrupt on Async Advance bit has been set
virtual VOID CompleteAsyncRequests() = 0; 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; typedef IUSBQueue *PUSBQUEUE;
@ -851,15 +841,6 @@ DECLARE_INTERFACE_(IUSBDevice, IUnknown)
virtual NTSTATUS SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle, virtual NTSTATUS SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle,
IN OUT PUSBD_INTERFACE_INFORMATION Interface) = 0; 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; typedef IUSBDevice *PUSBDEVICE;

View file

@ -11,6 +11,24 @@
#define INITGUID #define INITGUID
#include "usbehci.h" #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 class CUSBDevice : public IUSBDevice
{ {
public: public:
@ -52,12 +70,10 @@ public:
virtual NTSTATUS SubmitSetupPacket(IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, OUT ULONG BufferLength, OUT PVOID Buffer); 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 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 SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle, IN OUT PUSBD_INTERFACE_INFORMATION Interface);
virtual NTSTATUS AbortPipe(IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor);
// local function // local function
virtual NTSTATUS CommitIrp(PIRP Irp); 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 CreateConfigurationDescriptor(ULONG ConfigurationIndex);
virtual NTSTATUS CreateDeviceDescriptor(); virtual NTSTATUS CreateDeviceDescriptor();
virtual VOID DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor); virtual VOID DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
@ -521,7 +537,7 @@ CUSBDevice::SubmitIrp(
NTSTATUS NTSTATUS
CUSBDevice::CommitSetupPacket( CUSBDevice::CommitSetupPacket(
IN PUSB_DEFAULT_PIPE_SETUP_PACKET Packet, IN PUSB_DEFAULT_PIPE_SETUP_PACKET Packet,
IN OPTIONAL PUSB_ENDPOINT EndpointDescriptor, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor,
IN ULONG BufferLength, IN ULONG BufferLength,
IN OUT PMDL Mdl) IN OUT PMDL Mdl)
{ {
@ -1257,23 +1273,6 @@ CUSBDevice::SelectInterface(
return Status; 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 NTSTATUS
CreateUSBDevice( CreateUSBDevice(

View file

@ -41,8 +41,6 @@ public:
virtual NTSTATUS CreateUSBRequest(IUSBRequest **OutRequest); virtual NTSTATUS CreateUSBRequest(IUSBRequest **OutRequest);
virtual VOID InterruptCallback(IN NTSTATUS Status, OUT PULONG ShouldRingDoorBell); virtual VOID InterruptCallback(IN NTSTATUS Status, OUT PULONG ShouldRingDoorBell);
virtual VOID CompleteAsyncRequests(); virtual VOID CompleteAsyncRequests();
virtual NTSTATUS AbortDevicePipe(UCHAR DeviceAddress, IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor);
// constructor / destructor // constructor / destructor
CUSBQueue(IUnknown *OuterUnknown){} CUSBQueue(IUnknown *OuterUnknown){}
@ -501,6 +499,11 @@ CUSBQueue::UnlinkQueueHead(
// remove software link // remove software link
// //
RemoveEntryList(&QueueHead->LinkedQueueHeads); RemoveEntryList(&QueueHead->LinkedQueueHeads);
//
// FIXME: clear failure
//
QueueHead->Token.Bits.Halted = FALSE;
} }
// //
@ -626,7 +629,6 @@ CUSBQueue::ProcessAsyncList(
// //
// walk async list // walk async list
// //
ASSERT(AsyncListQueueHead);
Entry = AsyncListQueueHead->LinkedQueueHeads.Flink; Entry = AsyncListQueueHead->LinkedQueueHeads.Flink;
while(Entry != &AsyncListQueueHead->LinkedQueueHeads) while(Entry != &AsyncListQueueHead->LinkedQueueHeads)
@ -635,7 +637,6 @@ CUSBQueue::ProcessAsyncList(
// get queue head structure // get queue head structure
// //
QueueHead = (PQUEUE_HEAD)CONTAINING_RECORD(Entry, QUEUE_HEAD, LinkedQueueHeads); QueueHead = (PQUEUE_HEAD)CONTAINING_RECORD(Entry, QUEUE_HEAD, LinkedQueueHeads);
ASSERT(QueueHead);
// //
// sanity check // sanity check
@ -657,7 +658,7 @@ CUSBQueue::ProcessAsyncList(
// //
IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead); 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 // check if queue head is complete
@ -928,16 +929,6 @@ CUSBQueue::CompleteAsyncRequests()
KeReleaseSpinLock(m_Lock, OldLevel); KeReleaseSpinLock(m_Lock, OldLevel);
} }
NTSTATUS
CUSBQueue::AbortDevicePipe(
IN UCHAR DeviceAddress,
IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS NTSTATUS
CreateUSBQueue( CreateUSBQueue(
PUSBQUEUE *OutUsbQueue) PUSBQUEUE *OutUsbQueue)
@ -971,4 +962,3 @@ CreateUSBQueue(
// //
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

File diff suppressed because it is too large Load diff

View file

@ -39,28 +39,6 @@
#define C_PORT_OVER_CURRENT 19 #define C_PORT_OVER_CURRENT 19
#define C_PORT_RESET 20 #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 typedef struct
{ {
BOOLEAN IsFDO; // is device a FDO or PDO BOOLEAN IsFDO; // is device a FDO or PDO