mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[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:
parent
08ec4cc76d
commit
d54653187b
8 changed files with 451 additions and 871 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue