mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 02:26:03 +00:00
Merge PR #283 "[USBPORT] Transaction Translator (TT) support bringup"
This commit is contained in:
commit
765280bf5f
12 changed files with 2941 additions and 66 deletions
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#define NDEBUG_USBPORT_MINIPORT
|
#define NDEBUG_USBPORT_MINIPORT
|
||||||
#define NDEBUG_USBPORT_URB
|
#define NDEBUG_USBPORT_URB
|
||||||
|
//#define NDEBUG_USBPORT_USB2
|
||||||
#include "usbdebug.h"
|
#include "usbdebug.h"
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -275,3 +276,39 @@ USBPORT_DumpingIDs(IN PVOID Buffer)
|
||||||
DPRINT("\n");
|
DPRINT("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USBPORT_DumpingEndpointProperties(IN PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties)
|
||||||
|
{
|
||||||
|
DPRINT_USB2("DeviceAddress - %X\n", EndpointProperties->DeviceAddress);
|
||||||
|
DPRINT_USB2("EndpointAddress - %X\n", EndpointProperties->EndpointAddress);
|
||||||
|
DPRINT_USB2("TotalMaxPacketSize - %X\n", EndpointProperties->TotalMaxPacketSize);
|
||||||
|
DPRINT_USB2("Period - %X\n", EndpointProperties->Period);
|
||||||
|
DPRINT_USB2("DeviceSpeed - %X\n", EndpointProperties->DeviceSpeed);
|
||||||
|
DPRINT_USB2("UsbBandwidth - %X\n", EndpointProperties->UsbBandwidth);
|
||||||
|
DPRINT_USB2("ScheduleOffset - %X\n", EndpointProperties->ScheduleOffset);
|
||||||
|
DPRINT_USB2("TransferType - %X\n", EndpointProperties->TransferType);
|
||||||
|
DPRINT_USB2("MaxTransferSize - %X\n", EndpointProperties->MaxTransferSize);
|
||||||
|
DPRINT_USB2("HubAddr - %X\n", EndpointProperties->HubAddr);
|
||||||
|
DPRINT_USB2("PortNumber - %X\n", EndpointProperties->PortNumber);
|
||||||
|
DPRINT_USB2("InterruptScheduleMask - %X\n", EndpointProperties->InterruptScheduleMask);
|
||||||
|
DPRINT_USB2("SplitCompletionMask - %X\n", EndpointProperties->SplitCompletionMask);
|
||||||
|
DPRINT_USB2("MaxPacketSize - %X\n", EndpointProperties->MaxPacketSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USBPORT_DumpingTtEndpoint(IN PUSB2_TT_ENDPOINT TtEndpoint)
|
||||||
|
{
|
||||||
|
DPRINT_USB2("MaxPacketSize - %X\n", TtEndpoint->MaxPacketSize);
|
||||||
|
DPRINT_USB2("Period - %X\n", TtEndpoint->Period);
|
||||||
|
DPRINT_USB2("TtEndpointParams- %X\n", TtEndpoint->TtEndpointParams.AsULONG);
|
||||||
|
DPRINT_USB2("CalcBusTime - %X\n", TtEndpoint->CalcBusTime);
|
||||||
|
DPRINT_USB2("StartTime - %X\n", TtEndpoint->StartTime);
|
||||||
|
DPRINT_USB2("ActualPeriod - %X\n", TtEndpoint->ActualPeriod);
|
||||||
|
DPRINT_USB2("StartFrame - %X\n", TtEndpoint->StartFrame);
|
||||||
|
DPRINT_USB2("StartMicroframe - %X\n", TtEndpoint->StartMicroframe);
|
||||||
|
DPRINT_USB2("Nums - %X\n", TtEndpoint->Nums.AsULONG);
|
||||||
|
DPRINT_USB2("nextTtEndpoint - %X\n", TtEndpoint->NextTtEndpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -885,6 +885,76 @@ USBPORT_AbortTransfers(IN PDEVICE_OBJECT FdoDevice,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PUSB2_TT_EXTENSION
|
||||||
|
NTAPI
|
||||||
|
USBPORT_GetTt(IN PDEVICE_OBJECT FdoDevice,
|
||||||
|
IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
|
||||||
|
OUT PUSHORT OutPort,
|
||||||
|
OUT PUSBPORT_DEVICE_HANDLE * OutHubDeviceHandle)
|
||||||
|
{
|
||||||
|
PUSBPORT_DEVICE_HANDLE DeviceHandle = HubDeviceHandle;
|
||||||
|
ULONG TtCount;
|
||||||
|
PLIST_ENTRY Entry;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension = NULL;
|
||||||
|
|
||||||
|
DPRINT("USBPORT_GetTt: HubDeviceHandle - %p\n", HubDeviceHandle);
|
||||||
|
|
||||||
|
*OutHubDeviceHandle = NULL;
|
||||||
|
|
||||||
|
while (DeviceHandle->DeviceSpeed != UsbHighSpeed)
|
||||||
|
{
|
||||||
|
DPRINT("USBPORT_GetTt: DeviceHandle - %p, DeviceHandle->PortNumber - %X\n",
|
||||||
|
DeviceHandle,
|
||||||
|
DeviceHandle->PortNumber);
|
||||||
|
|
||||||
|
*OutPort = DeviceHandle->PortNumber;
|
||||||
|
|
||||||
|
DeviceHandle = DeviceHandle->HubDeviceHandle;
|
||||||
|
|
||||||
|
if (!DeviceHandle)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TtCount = DeviceHandle->TtCount;
|
||||||
|
|
||||||
|
if (!TtCount)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (IsListEmpty(&DeviceHandle->TtList))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
Entry = DeviceHandle->TtList.Flink;
|
||||||
|
|
||||||
|
if (TtCount > 1)
|
||||||
|
{
|
||||||
|
while (Entry != &DeviceHandle->TtList)
|
||||||
|
{
|
||||||
|
ASSERT(Entry != NULL);
|
||||||
|
|
||||||
|
TtExtension = CONTAINING_RECORD(Entry,
|
||||||
|
USB2_TT_EXTENSION,
|
||||||
|
Link);
|
||||||
|
|
||||||
|
if (TtExtension->TtNumber == *OutPort)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Entry = Entry->Flink;
|
||||||
|
|
||||||
|
TtExtension = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TtExtension = CONTAINING_RECORD(Entry,
|
||||||
|
USB2_TT_EXTENSION,
|
||||||
|
Link);
|
||||||
|
}
|
||||||
|
|
||||||
|
*OutHubDeviceHandle = DeviceHandle;
|
||||||
|
|
||||||
|
return TtExtension;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
|
@ -893,6 +963,9 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
IN USHORT PortStatus,
|
IN USHORT PortStatus,
|
||||||
IN USHORT Port)
|
IN USHORT Port)
|
||||||
{
|
{
|
||||||
|
PUSBPORT_DEVICE_HANDLE TtDeviceHandle = NULL;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension = NULL;
|
||||||
|
USHORT port;
|
||||||
PUSBPORT_DEVICE_HANDLE DeviceHandle;
|
PUSBPORT_DEVICE_HANDLE DeviceHandle;
|
||||||
PUSBPORT_PIPE_HANDLE PipeHandle;
|
PUSBPORT_PIPE_HANDLE PipeHandle;
|
||||||
BOOL IsOpenedPipe;
|
BOOL IsOpenedPipe;
|
||||||
|
@ -902,7 +975,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
SIZE_T DescriptorMinSize;
|
SIZE_T DescriptorMinSize;
|
||||||
UCHAR MaxPacketSize;
|
UCHAR MaxPacketSize;
|
||||||
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
PUSBPORT_REGISTRATION_PACKET Packet;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("USBPORT_CreateDevice: PortStatus - %p, Port - %x\n",
|
DPRINT("USBPORT_CreateDevice: PortStatus - %p, Port - %x\n",
|
||||||
|
@ -910,6 +983,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
Port);
|
Port);
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
Packet = &FdoExtension->MiniPortInterface->Packet;
|
||||||
|
|
||||||
KeWaitForSingleObject(&FdoExtension->DeviceSemaphore,
|
KeWaitForSingleObject(&FdoExtension->DeviceSemaphore,
|
||||||
Executive,
|
Executive,
|
||||||
|
@ -928,11 +1002,21 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
return STATUS_DEVICE_NOT_CONNECTED;
|
return STATUS_DEVICE_NOT_CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FdoExtension->MiniPortInterface->Packet.MiniPortFlags & USB_MINIPORT_FLAGS_USB2 &&
|
port = Port;
|
||||||
|
|
||||||
|
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2 &&
|
||||||
!(PortStatus & USB_PORT_STATUS_HIGH_SPEED))
|
!(PortStatus & USB_PORT_STATUS_HIGH_SPEED))
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_CreateDevice: USB1 device connected to USB2 port. FIXME: Transaction Translator.\n");
|
DPRINT1("USBPORT_CreateDevice: USB1 device connected to USB2 port\n");
|
||||||
DbgBreakPoint();
|
|
||||||
|
TtExtension = USBPORT_GetTt(FdoDevice,
|
||||||
|
HubDeviceHandle,
|
||||||
|
&port,
|
||||||
|
&TtDeviceHandle);
|
||||||
|
|
||||||
|
DPRINT("USBPORT_CreateDevice: TtDeviceHandle - %p, port - %x\n",
|
||||||
|
TtDeviceHandle,
|
||||||
|
port);
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
|
KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
|
||||||
|
@ -954,6 +1038,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
|
|
||||||
*pUsbdDeviceHandle = NULL;
|
*pUsbdDeviceHandle = NULL;
|
||||||
|
|
||||||
|
DeviceHandle->TtExtension = TtExtension;
|
||||||
DeviceHandle->PortNumber = Port;
|
DeviceHandle->PortNumber = Port;
|
||||||
DeviceHandle->HubDeviceHandle = HubDeviceHandle;
|
DeviceHandle->HubDeviceHandle = HubDeviceHandle;
|
||||||
|
|
||||||
|
@ -993,6 +1078,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeListHead(&DeviceHandle->PipeHandleList);
|
InitializeListHead(&DeviceHandle->PipeHandleList);
|
||||||
|
InitializeListHead(&DeviceHandle->TtList);
|
||||||
|
|
||||||
Status = USBPORT_OpenPipe(FdoDevice,
|
Status = USBPORT_OpenPipe(FdoDevice,
|
||||||
DeviceHandle,
|
DeviceHandle,
|
||||||
|
@ -1089,7 +1175,36 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
|
||||||
|
|
||||||
ErrorExit:
|
ErrorExit:
|
||||||
|
|
||||||
// FIXME: if Transaction Translator
|
if (TtExtension && TtDeviceHandle)
|
||||||
|
{
|
||||||
|
SetupPacket.bmRequestType.Recipient = BMREQUEST_TO_OTHER;
|
||||||
|
SetupPacket.bmRequestType.Reserved = 0;
|
||||||
|
SetupPacket.bmRequestType.Type = BMREQUEST_CLASS;
|
||||||
|
SetupPacket.bmRequestType.Dir = BMREQUEST_HOST_TO_DEVICE;
|
||||||
|
|
||||||
|
/* Table 11-15. Hub Class Requests */
|
||||||
|
if (TtDeviceHandle == HubDeviceHandle)
|
||||||
|
{
|
||||||
|
SetupPacket.bRequest = USB_REQUEST_RESET_TT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetupPacket.bRequest = USB_REQUEST_CLEAR_TT_BUFFER;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupPacket.wValue.LowByte = 0;
|
||||||
|
SetupPacket.wValue.HiByte = 0;
|
||||||
|
SetupPacket.wIndex.W = port;
|
||||||
|
SetupPacket.wLength = 0;
|
||||||
|
|
||||||
|
USBPORT_SendSetupPacket(TtDeviceHandle,
|
||||||
|
FdoDevice,
|
||||||
|
&SetupPacket,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
Status = STATUS_DEVICE_DATA_ERROR;
|
Status = STATUS_DEVICE_DATA_ERROR;
|
||||||
|
|
||||||
|
@ -1262,6 +1377,12 @@ USBPORT_InitializeDevice(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
|
||||||
(MaxPacketSize == 16) ||
|
(MaxPacketSize == 16) ||
|
||||||
(MaxPacketSize == 32) ||
|
(MaxPacketSize == 32) ||
|
||||||
(MaxPacketSize == 64));
|
(MaxPacketSize == 64));
|
||||||
|
|
||||||
|
if (DeviceHandle->DeviceSpeed == UsbHighSpeed &&
|
||||||
|
DeviceHandle->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_HUB)
|
||||||
|
{
|
||||||
|
DeviceHandle->Flags |= DEVICE_HANDLE_FLAG_USB2HUB;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1443,6 +1564,9 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension;
|
||||||
|
ULONG ix;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
DPRINT("USBPORT_RemoveDevice: DeviceHandle - %p, Flags - %x\n",
|
DPRINT("USBPORT_RemoveDevice: DeviceHandle - %p, Flags - %x\n",
|
||||||
DeviceHandle,
|
DeviceHandle,
|
||||||
|
@ -1502,6 +1626,41 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
USBPORT_FreeUsbAddress(FdoDevice, DeviceHandle->DeviceAddress);
|
USBPORT_FreeUsbAddress(FdoDevice, DeviceHandle->DeviceAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsListEmpty(&DeviceHandle->TtList))
|
||||||
|
{
|
||||||
|
DPRINT1("USBPORT_RemoveDevice: DeviceHandle->TtList not empty\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!IsListEmpty(&DeviceHandle->TtList))
|
||||||
|
{
|
||||||
|
TtExtension = CONTAINING_RECORD(DeviceHandle->TtList.Flink,
|
||||||
|
USB2_TT_EXTENSION,
|
||||||
|
Link);
|
||||||
|
|
||||||
|
RemoveHeadList(&DeviceHandle->TtList);
|
||||||
|
|
||||||
|
DPRINT("USBPORT_RemoveDevice: TtExtension - %p\n", TtExtension);
|
||||||
|
|
||||||
|
KeAcquireSpinLock(&FdoExtension->TtSpinLock, &OldIrql);
|
||||||
|
|
||||||
|
TtExtension->Flags |= USB2_TT_EXTENSION_FLAG_DELETED;
|
||||||
|
|
||||||
|
if (IsListEmpty(&TtExtension->EndpointList))
|
||||||
|
{
|
||||||
|
USBPORT_UpdateAllocatedBwTt(TtExtension);
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] += TtExtension->MaxBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("USBPORT_RemoveDevice: ExFreePoolWithTag TtExtension - %p\n", TtExtension);
|
||||||
|
ExFreePoolWithTag(TtExtension, USB_PORT_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
KeReleaseSpinLock(&FdoExtension->TtSpinLock, OldIrql);
|
||||||
|
}
|
||||||
|
|
||||||
KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
|
KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
|
||||||
LOW_REALTIME_PRIORITY,
|
LOW_REALTIME_PRIORITY,
|
||||||
1,
|
1,
|
||||||
|
@ -1646,10 +1805,14 @@ USBPORT_RestoreDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NewDeviceHandle->Flags & DEVICE_HANDLE_FLAG_INITIALIZED)
|
if (NewDeviceHandle->Flags & DEVICE_HANDLE_FLAG_USB2HUB)
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_RestoreDevice: FIXME Transaction Translator\n");
|
DPRINT1("USBPORT_RestoreDevice: FIXME Transaction Translator\n");
|
||||||
NewDeviceHandle->TtCount = OldDeviceHandle->TtCount;
|
NewDeviceHandle->TtCount = OldDeviceHandle->TtCount;
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
DbgBreakPoint();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!IsListEmpty(&OldDeviceHandle->PipeHandleList))
|
while (!IsListEmpty(&OldDeviceHandle->PipeHandleList))
|
||||||
|
@ -1770,7 +1933,55 @@ USBPORT_InitializeTT(IN PDEVICE_OBJECT FdoDevice,
|
||||||
IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
|
IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
|
||||||
IN ULONG TtNumber)
|
IN ULONG TtNumber)
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_InitializeTT: UNIMPLEMENTED. FIXME. \n");
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension;
|
||||||
|
ULONG ix;
|
||||||
|
|
||||||
|
DPRINT("USBPORT_InitializeTT: HubDeviceHandle - %p, TtNumber - %X\n",
|
||||||
|
HubDeviceHandle,
|
||||||
|
TtNumber);
|
||||||
|
|
||||||
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
TtExtension = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
|
sizeof(USB2_TT_EXTENSION),
|
||||||
|
USB_PORT_TAG);
|
||||||
|
|
||||||
|
if (!TtExtension)
|
||||||
|
{
|
||||||
|
DPRINT1("USBPORT_InitializeTT: ExAllocatePoolWithTag return NULL\n");
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("USBPORT_InitializeTT: TtExtension - %p\n", TtExtension);
|
||||||
|
|
||||||
|
RtlZeroMemory(TtExtension, sizeof(USB2_TT_EXTENSION));
|
||||||
|
|
||||||
|
TtExtension->DeviceAddress = HubDeviceHandle->DeviceAddress;
|
||||||
|
TtExtension->TtNumber = TtNumber;
|
||||||
|
TtExtension->RootHubPdo = FdoExtension->RootHubPdo;
|
||||||
|
TtExtension->BusBandwidth = TOTAL_USB11_BUS_BANDWIDTH;
|
||||||
|
|
||||||
|
InitializeListHead(&TtExtension->EndpointList);
|
||||||
|
|
||||||
|
/* 90% maximum allowed for periodic endpoints */
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
TtExtension->Bandwidth[ix] = TtExtension->BusBandwidth -
|
||||||
|
TtExtension->BusBandwidth / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
USBPORT_UpdateAllocatedBwTt(TtExtension);
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] -= TtExtension->MaxBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB2_InitTT(FdoExtension->Usb2Extension, &TtExtension->Tt);
|
||||||
|
|
||||||
|
InsertTailList(&HubDeviceHandle->TtList, &TtExtension->Link);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1783,7 +1994,7 @@ USBPORT_Initialize20Hub(IN PDEVICE_OBJECT FdoDevice,
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG ix;
|
ULONG ix;
|
||||||
|
|
||||||
DPRINT("USBPORT_Initialize20Hub \n");
|
DPRINT("USBPORT_Initialize20Hub: TtCount - %X\n", TtCount);
|
||||||
|
|
||||||
if (!HubDeviceHandle)
|
if (!HubDeviceHandle)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,7 @@ USBPORT_CalculateUsbBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
||||||
{
|
{
|
||||||
PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties;
|
PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties;
|
||||||
ULONG Bandwidth;
|
ULONG Bandwidth;
|
||||||
ULONG Additional;
|
ULONG Overhead;
|
||||||
|
|
||||||
DPRINT("USBPORT_CalculateUsbBandwidth ... \n");
|
DPRINT("USBPORT_CalculateUsbBandwidth ... \n");
|
||||||
|
|
||||||
|
@ -29,25 +29,25 @@ USBPORT_CalculateUsbBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
||||||
switch (EndpointProperties->TransferType)
|
switch (EndpointProperties->TransferType)
|
||||||
{
|
{
|
||||||
case USBPORT_TRANSFER_TYPE_ISOCHRONOUS:
|
case USBPORT_TRANSFER_TYPE_ISOCHRONOUS:
|
||||||
Additional = 9;
|
Overhead = USB2_FS_ISOCHRONOUS_OVERHEAD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USBPORT_TRANSFER_TYPE_INTERRUPT:
|
case USBPORT_TRANSFER_TYPE_INTERRUPT:
|
||||||
Additional = 13;
|
Overhead = USB2_FS_INTERRUPT_OVERHEAD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: //USBPORT_TRANSFER_TYPE_CONTROL or USBPORT_TRANSFER_TYPE_BULK
|
default: //USBPORT_TRANSFER_TYPE_CONTROL or USBPORT_TRANSFER_TYPE_BULK
|
||||||
Additional = 0;
|
Overhead = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Additional == 0)
|
if (Overhead == 0)
|
||||||
{
|
{
|
||||||
Bandwidth = 0;
|
Bandwidth = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Bandwidth = (EndpointProperties->TotalMaxPacketSize + Additional) * 8 * 7 / 6;
|
Bandwidth = (EndpointProperties->TotalMaxPacketSize + Overhead) * USB2_BIT_STUFFING_OVERHEAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EndpointProperties->DeviceSpeed == UsbLowSpeed)
|
if (EndpointProperties->DeviceSpeed == UsbLowSpeed)
|
||||||
|
@ -68,9 +68,19 @@ USBPORT_AllocateBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
||||||
ULONG TransferType;
|
ULONG TransferType;
|
||||||
ULONG TotalBusBandwidth;
|
ULONG TotalBusBandwidth;
|
||||||
ULONG EndpointBandwidth;
|
ULONG EndpointBandwidth;
|
||||||
|
ULONG MinBandwidth;
|
||||||
|
PULONG Bandwidth;
|
||||||
|
ULONG MaxBandwidth = 0;
|
||||||
|
ULONG ix;
|
||||||
|
ULONG Offset;
|
||||||
|
LONG ScheduleOffset = -1;
|
||||||
ULONG Period;
|
ULONG Period;
|
||||||
|
ULONG Factor;
|
||||||
|
UCHAR Bit;
|
||||||
|
|
||||||
DPRINT("USBPORT_AllocateBandwidth: ... \n");
|
DPRINT("USBPORT_AllocateBandwidth: FdoDevice - %p, Endpoint - %p\n",
|
||||||
|
FdoDevice,
|
||||||
|
Endpoint);
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
EndpointProperties = &Endpoint->EndpointProperties;
|
EndpointProperties = &Endpoint->EndpointProperties;
|
||||||
|
@ -86,17 +96,74 @@ USBPORT_AllocateBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
||||||
|
|
||||||
TotalBusBandwidth = FdoExtension->TotalBusBandwidth;
|
TotalBusBandwidth = FdoExtension->TotalBusBandwidth;
|
||||||
EndpointBandwidth = EndpointProperties->UsbBandwidth;
|
EndpointBandwidth = EndpointProperties->UsbBandwidth;
|
||||||
|
|
||||||
Period = EndpointProperties->Period;
|
Period = EndpointProperties->Period;
|
||||||
|
ASSERT(Period != 0);
|
||||||
|
Factor = USB2_FRAMES / Period;
|
||||||
|
|
||||||
DPRINT1("USBPORT_AllocateBandwidth: FIXME. \n");
|
for (Offset = 0; Offset < Period; Offset++)
|
||||||
DPRINT1("USBPORT_AllocateBandwidth: Endpoint - %p, Type - %x, TotalBandwidth - %x, EpBandwidth - %x, Period - %x\n",
|
{
|
||||||
Endpoint,
|
MinBandwidth = TotalBusBandwidth;
|
||||||
TransferType,
|
Bandwidth = &FdoExtension->Bandwidth[Offset * Factor];
|
||||||
TotalBusBandwidth,
|
|
||||||
EndpointBandwidth,
|
|
||||||
Period);
|
|
||||||
|
|
||||||
return TRUE;
|
for (ix = 1; *Bandwidth >= EndpointBandwidth; ix++)
|
||||||
|
{
|
||||||
|
MinBandwidth = min(MinBandwidth, *Bandwidth);
|
||||||
|
|
||||||
|
Bandwidth++;
|
||||||
|
|
||||||
|
if (Factor <= ix)
|
||||||
|
{
|
||||||
|
if (MinBandwidth > MaxBandwidth)
|
||||||
|
{
|
||||||
|
MaxBandwidth = MinBandwidth;
|
||||||
|
ScheduleOffset = Offset;
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: ScheduleOffset - %X\n",
|
||||||
|
ScheduleOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: ScheduleOffset - %X\n", ScheduleOffset);
|
||||||
|
|
||||||
|
if (ScheduleOffset != -1)
|
||||||
|
{
|
||||||
|
EndpointProperties->ScheduleOffset = ScheduleOffset;
|
||||||
|
|
||||||
|
Bandwidth = &FdoExtension->Bandwidth[ScheduleOffset * Factor];
|
||||||
|
|
||||||
|
for (Factor = USB2_FRAMES / Period; Factor; Factor--)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ScheduleOffset * Factor] -= EndpointBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TransferType == USBPORT_TRANSFER_TYPE_INTERRUPT)
|
||||||
|
{
|
||||||
|
for (Bit = 0x80; Bit != 0; Bit >>= 1)
|
||||||
|
{
|
||||||
|
if ((Period & Bit) != 0)
|
||||||
|
{
|
||||||
|
Period = Bit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: FIXME AllocatedInterrupt_XXms\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: FIXME AllocatedIso\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: FIXME USBPORT_UpdateAllocatedBw\n");
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: ScheduleOffset - %X\n", ScheduleOffset);
|
||||||
|
return ScheduleOffset != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -104,7 +171,63 @@ NTAPI
|
||||||
USBPORT_FreeBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
USBPORT_FreeBandwidth(IN PDEVICE_OBJECT FdoDevice,
|
||||||
IN PUSBPORT_ENDPOINT Endpoint)
|
IN PUSBPORT_ENDPOINT Endpoint)
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_FreeBandwidth: UNIMPLEMENTED. FIXME. \n");
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties;
|
||||||
|
ULONG TransferType;
|
||||||
|
ULONG Offset;
|
||||||
|
ULONG EndpointBandwidth;
|
||||||
|
ULONG Period;
|
||||||
|
ULONG Factor;
|
||||||
|
UCHAR Bit;
|
||||||
|
|
||||||
|
DPRINT("USBPORT_FreeBandwidth: FdoDevice - %p, Endpoint - %p\n",
|
||||||
|
FdoDevice,
|
||||||
|
Endpoint);
|
||||||
|
|
||||||
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
EndpointProperties = &Endpoint->EndpointProperties;
|
||||||
|
TransferType = EndpointProperties->TransferType;
|
||||||
|
|
||||||
|
if (TransferType == USBPORT_TRANSFER_TYPE_BULK ||
|
||||||
|
TransferType == USBPORT_TRANSFER_TYPE_CONTROL ||
|
||||||
|
(Endpoint->Flags & ENDPOINT_FLAG_ROOTHUB_EP0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Offset = Endpoint->EndpointProperties.ScheduleOffset;
|
||||||
|
EndpointBandwidth = Endpoint->EndpointProperties.UsbBandwidth;
|
||||||
|
|
||||||
|
Period = Endpoint->EndpointProperties.Period;
|
||||||
|
ASSERT(Period != 0);
|
||||||
|
|
||||||
|
for (Factor = USB2_FRAMES / Period; Factor; Factor--)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[Offset * Factor] += EndpointBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TransferType == USBPORT_TRANSFER_TYPE_INTERRUPT)
|
||||||
|
{
|
||||||
|
for (Bit = 0x80; Bit != 0; Bit >>= 1)
|
||||||
|
{
|
||||||
|
if ((Period & Bit) != 0)
|
||||||
|
{
|
||||||
|
Period = Bit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(Period != 0);
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: FIXME AllocatedInterrupt_XXms\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT("USBPORT_AllocateBandwidth: FIXME AllocatedIso\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("USBPORT_FreeBandwidth: FIXME USBPORT_UpdateAllocatedBw\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
UCHAR
|
UCHAR
|
||||||
|
@ -379,7 +502,7 @@ USBPORT_DeleteEndpoint(IN PDEVICE_OBJECT FdoDevice,
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
DPRINT("USBPORT_DeleteEndpoint: Endpoint - %p\n", Endpoint);
|
DPRINT1("USBPORT_DeleteEndpoint: Endpoint - %p\n", Endpoint);
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
@ -471,10 +594,13 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
|
||||||
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
PUSBPORT_RHDEVICE_EXTENSION PdoExtension;
|
PUSBPORT_RHDEVICE_EXTENSION PdoExtension;
|
||||||
PUSBPORT_ENDPOINT Endpoint;
|
PUSBPORT_ENDPOINT Endpoint;
|
||||||
|
PUSBPORT_REGISTRATION_PACKET Packet;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension;
|
||||||
|
ULONG ix;
|
||||||
BOOLEAN IsReady;
|
BOOLEAN IsReady;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
|
||||||
DPRINT("USBPORT_ClosePipe \n");
|
DPRINT1("USBPORT_ClosePipe \n");
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
@ -492,7 +618,6 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
Endpoint = PipeHandle->Endpoint;
|
Endpoint = PipeHandle->Endpoint;
|
||||||
DPRINT("USBPORT_ClosePipe: Endpoint - %p\n", Endpoint);
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&FdoExtension->EndpointListSpinLock, &OldIrql);
|
KeAcquireSpinLock(&FdoExtension->EndpointListSpinLock, &OldIrql);
|
||||||
|
|
||||||
|
@ -543,16 +668,46 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
Endpoint->DeviceHandle = NULL;
|
Endpoint->DeviceHandle = NULL;
|
||||||
|
Packet = &FdoExtension->MiniPortInterface->Packet;
|
||||||
|
|
||||||
if (FdoExtension->MiniPortInterface->Packet.MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
||||||
{
|
{
|
||||||
DPRINT("USBPORT_ClosePipe: FIXME USBPORT_FreeBandwidthUSB20\n");
|
USBPORT_FreeBandwidthUSB2(FdoDevice, Endpoint);
|
||||||
//USBPORT_FreeBandwidthUSB20();
|
|
||||||
|
KeAcquireSpinLock(&FdoExtension->TtSpinLock, &OldIrql);
|
||||||
|
|
||||||
|
TtExtension = Endpoint->TtExtension;
|
||||||
|
DPRINT1("USBPORT_ClosePipe: TtExtension - %p\n", TtExtension);
|
||||||
|
|
||||||
|
if (TtExtension)
|
||||||
|
{
|
||||||
|
RemoveEntryList(&Endpoint->TtLink);
|
||||||
|
|
||||||
|
Endpoint->TtLink.Flink = NULL;
|
||||||
|
Endpoint->TtLink.Blink = NULL;
|
||||||
|
|
||||||
|
if (TtExtension->Flags & USB2_TT_EXTENSION_FLAG_DELETED)
|
||||||
|
{
|
||||||
|
if (IsListEmpty(&TtExtension->EndpointList))
|
||||||
|
{
|
||||||
|
USBPORT_UpdateAllocatedBwTt(TtExtension);
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] += TtExtension->MaxBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("USBPORT_ClosePipe: ExFreePoolWithTag TtExtension - %p\n", TtExtension);
|
||||||
|
ExFreePoolWithTag(TtExtension, USB_PORT_TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KeReleaseSpinLock(&FdoExtension->TtSpinLock, OldIrql);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DPRINT("USBPORT_ClosePipe: FIXME USBPORT_FreeBandwidthUSB11\n");
|
USBPORT_FreeBandwidth(FdoDevice, Endpoint);
|
||||||
//USBPORT_FreeBandwidthUSB11();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KeAcquireSpinLock(&Endpoint->EndpointSpinLock, &Endpoint->EndpointOldIrql);
|
KeAcquireSpinLock(&Endpoint->EndpointSpinLock, &Endpoint->EndpointOldIrql);
|
||||||
|
@ -630,7 +785,7 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
USHORT AdditionalTransaction;
|
USHORT AdditionalTransaction;
|
||||||
BOOLEAN IsAllocatedBandwidth;
|
BOOLEAN IsAllocatedBandwidth;
|
||||||
|
|
||||||
DPRINT("USBPORT_OpenPipe: DeviceHandle - %p, FdoDevice - %p, PipeHandle - %p\n",
|
DPRINT1("USBPORT_OpenPipe: DeviceHandle - %p, FdoDevice - %p, PipeHandle - %p\n",
|
||||||
DeviceHandle,
|
DeviceHandle,
|
||||||
FdoDevice,
|
FdoDevice,
|
||||||
PipeHandle);
|
PipeHandle);
|
||||||
|
@ -642,13 +797,13 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
|
|
||||||
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_OpenPipe: FIXME USB2 EndpointSize\n");
|
EndpointSize += sizeof(USB2_TT_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PipeHandle->EndpointDescriptor.wMaxPacketSize == 0)
|
if (PipeHandle->EndpointDescriptor.wMaxPacketSize == 0)
|
||||||
{
|
{
|
||||||
USBPORT_AddPipeHandle(DeviceHandle, PipeHandle);
|
USBPORT_AddPipeHandle(DeviceHandle, PipeHandle);
|
||||||
|
|
||||||
PipeHandle->Flags = (PipeHandle->Flags & ~PIPE_HANDLE_FLAG_CLOSED) |
|
PipeHandle->Flags = (PipeHandle->Flags & ~PIPE_HANDLE_FLAG_CLOSED) |
|
||||||
PIPE_HANDLE_FLAG_NULL_PACKET_SIZE;
|
PIPE_HANDLE_FLAG_NULL_PACKET_SIZE;
|
||||||
|
|
||||||
|
@ -672,6 +827,26 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
Endpoint->DeviceHandle = DeviceHandle;
|
Endpoint->DeviceHandle = DeviceHandle;
|
||||||
Endpoint->LockCounter = -1;
|
Endpoint->LockCounter = -1;
|
||||||
|
|
||||||
|
Endpoint->TtExtension = DeviceHandle->TtExtension;
|
||||||
|
|
||||||
|
if (DeviceHandle->TtExtension)
|
||||||
|
{
|
||||||
|
ExInterlockedInsertTailList(&DeviceHandle->TtExtension->EndpointList,
|
||||||
|
&Endpoint->TtLink,
|
||||||
|
&FdoExtension->TtSpinLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
||||||
|
{
|
||||||
|
Endpoint->TtEndpoint = (PUSB2_TT_ENDPOINT)((ULONG_PTR)Endpoint +
|
||||||
|
sizeof(USBPORT_ENDPOINT) +
|
||||||
|
Packet->MiniPortEndpointSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Endpoint->TtEndpoint = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
KeInitializeSpinLock(&Endpoint->EndpointSpinLock);
|
KeInitializeSpinLock(&Endpoint->EndpointSpinLock);
|
||||||
KeInitializeSpinLock(&Endpoint->StateChangeSpinLock);
|
KeInitializeSpinLock(&Endpoint->StateChangeSpinLock);
|
||||||
|
|
||||||
|
@ -695,6 +870,17 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
EndpointProperties->TotalMaxPacketSize = MaxPacketSize *
|
EndpointProperties->TotalMaxPacketSize = MaxPacketSize *
|
||||||
(AdditionalTransaction + 1);
|
(AdditionalTransaction + 1);
|
||||||
|
|
||||||
|
if (Endpoint->TtExtension)
|
||||||
|
{
|
||||||
|
EndpointProperties->HubAddr = Endpoint->TtExtension->DeviceAddress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EndpointProperties->HubAddr = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EndpointProperties->PortNumber = DeviceHandle->PortNumber;
|
||||||
|
|
||||||
switch (EndpointDescriptor->bmAttributes & USB_ENDPOINT_TYPE_MASK)
|
switch (EndpointDescriptor->bmAttributes & USB_ENDPOINT_TYPE_MASK)
|
||||||
{
|
{
|
||||||
case USB_ENDPOINT_TYPE_CONTROL:
|
case USB_ENDPOINT_TYPE_CONTROL:
|
||||||
|
@ -739,14 +925,14 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
Interval = EndpointDescriptor->bInterval;
|
Interval = EndpointDescriptor->bInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
EndpointProperties->Period = 32;
|
EndpointProperties->Period = ENDPOINT_INTERRUPT_32ms;
|
||||||
|
|
||||||
if (Interval && (Interval < 32))
|
if (Interval && (Interval < USB2_FRAMES))
|
||||||
{
|
{
|
||||||
if ((EndpointProperties->DeviceSpeed != UsbLowSpeed) ||
|
if ((EndpointProperties->DeviceSpeed != UsbLowSpeed) ||
|
||||||
(Interval >= 8))
|
(Interval >= ENDPOINT_INTERRUPT_8ms))
|
||||||
{
|
{
|
||||||
if (!(Interval & 0x20))
|
if (!(Interval & ENDPOINT_INTERRUPT_32ms))
|
||||||
{
|
{
|
||||||
Period = EndpointProperties->Period;
|
Period = EndpointProperties->Period;
|
||||||
|
|
||||||
|
@ -761,7 +947,7 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EndpointProperties->Period = 8;
|
EndpointProperties->Period = ENDPOINT_INTERRUPT_8ms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -770,15 +956,20 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
{
|
{
|
||||||
if (EndpointProperties->DeviceSpeed == UsbHighSpeed)
|
if (EndpointProperties->DeviceSpeed == UsbHighSpeed)
|
||||||
{
|
{
|
||||||
EndpointProperties->Period =
|
EndpointProperties->Period =
|
||||||
USBPORT_NormalizeHsInterval(EndpointDescriptor->bInterval);
|
USBPORT_NormalizeHsInterval(EndpointDescriptor->bInterval);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
EndpointProperties->Period = 1;
|
EndpointProperties->Period = ENDPOINT_INTERRUPT_1ms;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((DeviceHandle->Flags & DEVICE_HANDLE_FLAG_ROOTHUB) != 0)
|
||||||
|
{
|
||||||
|
Endpoint->Flags |= ENDPOINT_FLAG_ROOTHUB_EP0;
|
||||||
|
}
|
||||||
|
|
||||||
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
||||||
{
|
{
|
||||||
IsAllocatedBandwidth = USBPORT_AllocateBandwidthUSB2(FdoDevice, Endpoint);
|
IsAllocatedBandwidth = USBPORT_AllocateBandwidthUSB2(FdoDevice, Endpoint);
|
||||||
|
@ -955,6 +1146,13 @@ ExitWithError:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Endpoint->TtExtension)
|
||||||
|
{
|
||||||
|
KeAcquireSpinLock(&FdoExtension->TtSpinLock, &OldIrql);
|
||||||
|
RemoveEntryList(&Endpoint->TtLink);
|
||||||
|
KeReleaseSpinLock(&FdoExtension->TtSpinLock, OldIrql);
|
||||||
|
}
|
||||||
|
|
||||||
ExFreePoolWithTag(Endpoint, USB_PORT_TAG);
|
ExFreePoolWithTag(Endpoint, USB_PORT_TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,7 +1172,7 @@ USBPORT_ReopenPipe(IN PDEVICE_OBJECT FdoDevice,
|
||||||
KIRQL MiniportOldIrql;
|
KIRQL MiniportOldIrql;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("USBPORT_ReopenPipe ... \n");
|
DPRINT1("USBPORT_ReopenPipe ... \n");
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
Packet = &FdoExtension->MiniPortInterface->Packet;
|
Packet = &FdoExtension->MiniPortInterface->Packet;
|
||||||
|
@ -1081,7 +1279,7 @@ USBPORT_FlushClosedEndpointList(IN PDEVICE_OBJECT FdoDevice)
|
||||||
PLIST_ENTRY ClosedList;
|
PLIST_ENTRY ClosedList;
|
||||||
PUSBPORT_ENDPOINT Endpoint;
|
PUSBPORT_ENDPOINT Endpoint;
|
||||||
|
|
||||||
DPRINT("USBPORT_FlushClosedEndpointList: ... \n");
|
DPRINT_CORE("USBPORT_FlushClosedEndpointList: ... \n");
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "usbport.h"
|
#include "usbport.h"
|
||||||
|
|
||||||
//#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -326,10 +326,10 @@ USBPORT_PdoInternalDeviceControl(IN PDEVICE_OBJECT PdoDevice,
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
IoCtl = IoStack->Parameters.DeviceIoControl.IoControlCode;
|
IoCtl = IoStack->Parameters.DeviceIoControl.IoControlCode;
|
||||||
|
|
||||||
DPRINT("USBPORT_PdoInternalDeviceControl: PdoDevice - %p, Irp - %p, IoCtl - %x\n",
|
//DPRINT("USBPORT_PdoInternalDeviceControl: PdoDevice - %p, Irp - %p, IoCtl - %x\n",
|
||||||
PdoDevice,
|
// PdoDevice,
|
||||||
Irp,
|
// Irp,
|
||||||
IoCtl);
|
// IoCtl);
|
||||||
|
|
||||||
if (IoCtl == IOCTL_INTERNAL_USB_SUBMIT_URB)
|
if (IoCtl == IOCTL_INTERNAL_USB_SUBMIT_URB)
|
||||||
{
|
{
|
||||||
|
|
|
@ -519,6 +519,7 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
BOOLEAN IsCompanion = FALSE;
|
BOOLEAN IsCompanion = FALSE;
|
||||||
ULONG LegacyBIOS;
|
ULONG LegacyBIOS;
|
||||||
ULONG MiniportFlags;
|
ULONG MiniportFlags;
|
||||||
|
ULONG ix;
|
||||||
|
|
||||||
DPRINT("USBPORT_StartDevice: FdoDevice - %p, UsbPortResources - %p\n",
|
DPRINT("USBPORT_StartDevice: FdoDevice - %p, UsbPortResources - %p\n",
|
||||||
FdoDevice,
|
FdoDevice,
|
||||||
|
@ -610,6 +611,7 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
KeInitializeSpinLock(&FdoExtension->PowerWakeSpinLock);
|
KeInitializeSpinLock(&FdoExtension->PowerWakeSpinLock);
|
||||||
KeInitializeSpinLock(&FdoExtension->SetPowerD0SpinLock);
|
KeInitializeSpinLock(&FdoExtension->SetPowerD0SpinLock);
|
||||||
KeInitializeSpinLock(&FdoExtension->RootHubCallbackSpinLock);
|
KeInitializeSpinLock(&FdoExtension->RootHubCallbackSpinLock);
|
||||||
|
KeInitializeSpinLock(&FdoExtension->TtSpinLock);
|
||||||
|
|
||||||
KeInitializeDpc(&FdoExtension->IsrDpc, USBPORT_IsrDpc, FdoDevice);
|
KeInitializeDpc(&FdoExtension->IsrDpc, USBPORT_IsrDpc, FdoDevice);
|
||||||
|
|
||||||
|
@ -754,6 +756,12 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
|
||||||
FdoExtension->TotalBusBandwidth = TotalBusBandwidth;
|
FdoExtension->TotalBusBandwidth = TotalBusBandwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] = FdoExtension->TotalBusBandwidth -
|
||||||
|
FdoExtension->TotalBusBandwidth / 10;
|
||||||
|
}
|
||||||
|
|
||||||
FdoExtension->ActiveIrpTable = ExAllocatePoolWithTag(NonPagedPool,
|
FdoExtension->ActiveIrpTable = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
sizeof(USBPORT_IRP_TABLE),
|
sizeof(USBPORT_IRP_TABLE),
|
||||||
USB_PORT_TAG);
|
USB_PORT_TAG);
|
||||||
|
|
|
@ -105,8 +105,6 @@ USBPORT_DoSetPowerD0(IN PDEVICE_OBJECT FdoDevice)
|
||||||
{
|
{
|
||||||
DPRINT("USBPORT_DoSetPowerD0: FIXME!\n");
|
DPRINT("USBPORT_DoSetPowerD0: FIXME!\n");
|
||||||
return;
|
return;
|
||||||
DbgBreakPoint();
|
|
||||||
//ASSERT(FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -148,8 +148,8 @@ USBPORT_SplitBulkInterruptTransfer(IN PDEVICE_OBJECT FdoDevice,
|
||||||
|
|
||||||
InitializeListHead(&tmplist);
|
InitializeListHead(&tmplist);
|
||||||
|
|
||||||
DPRINT1("USBPORT_SplitBulkInterruptTransfer: TransferBufferLength - %x, NeedSplits - %x\n",
|
DPRINT("USBPORT_SplitBulkInterruptTransfer: TransferBufferLength - %x, NeedSplits - %x\n",
|
||||||
TransferBufferLength, NeedSplits);
|
TransferBufferLength, NeedSplits);
|
||||||
|
|
||||||
if (!NeedSplits)
|
if (!NeedSplits)
|
||||||
{
|
{
|
||||||
|
@ -214,7 +214,7 @@ Exit:
|
||||||
|
|
||||||
while (!IsListEmpty(&tmplist))
|
while (!IsListEmpty(&tmplist))
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_SplitBulkInterruptTransfer: ... \n");
|
DPRINT("USBPORT_SplitBulkInterruptTransfer: ... \n");
|
||||||
|
|
||||||
SplitTransfer = CONTAINING_RECORD(tmplist.Flink,
|
SplitTransfer = CONTAINING_RECORD(tmplist.Flink,
|
||||||
USBPORT_TRANSFER,
|
USBPORT_TRANSFER,
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -112,6 +112,23 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef NDEBUG_USBPORT_USB2
|
||||||
|
|
||||||
|
#define DPRINT_USB2(fmt, ...) do { \
|
||||||
|
if (DbgPrint("(%s:%d) " fmt, __RELFILE__, __LINE__, ##__VA_ARGS__)) \
|
||||||
|
DbgPrint("(%s:%d) DbgPrint() failed!\n", __RELFILE__, __LINE__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define DPRINT_USB2 __noop
|
||||||
|
#else
|
||||||
|
#define DPRINT_USB2(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#else /* not DBG */
|
#else /* not DBG */
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
|
@ -121,6 +138,7 @@
|
||||||
#define DPRINT_INT __noop
|
#define DPRINT_INT __noop
|
||||||
#define DPRINT_TIMER __noop
|
#define DPRINT_TIMER __noop
|
||||||
#define DPRINT_QUEUE __noop
|
#define DPRINT_QUEUE __noop
|
||||||
|
#define DPRINT_USB2 __noop
|
||||||
#else
|
#else
|
||||||
#define DPRINT_MINIPORT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
#define DPRINT_MINIPORT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
#define DPRINT_CORE(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
#define DPRINT_CORE(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
|
@ -128,6 +146,7 @@
|
||||||
#define DPRINT_INT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
#define DPRINT_INT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
#define DPRINT_TIMER(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
#define DPRINT_TIMER(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
#define DPRINT_QUEUE(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
#define DPRINT_QUEUE(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
|
#define DPRINT_USB2(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
#endif /* not DBG */
|
#endif /* not DBG */
|
||||||
|
|
|
@ -637,8 +637,8 @@ USBPORT_InvalidateControllerHandler(IN PDEVICE_OBJECT FdoDevice,
|
||||||
{
|
{
|
||||||
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
|
||||||
DPRINT("USBPORT_InvalidateControllerHandler: Invalidate Type - %x\n",
|
DPRINT_CORE("USBPORT_InvalidateControllerHandler: Invalidate Type - %x\n",
|
||||||
Type);
|
Type);
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
@ -869,7 +869,7 @@ USBPORT_DpcHandler(IN PDEVICE_OBJECT FdoDevice)
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
LONG LockCounter;
|
LONG LockCounter;
|
||||||
|
|
||||||
DPRINT("USBPORT_DpcHandler: ... \n");
|
DPRINT_CORE("USBPORT_DpcHandler: ... \n");
|
||||||
|
|
||||||
FdoExtension = FdoDevice->DeviceExtension;
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
@ -1845,7 +1845,8 @@ USBPORT_AddDevice(IN PDRIVER_OBJECT DriverObject,
|
||||||
RtlInitUnicodeString(&DeviceName, CharDeviceName);
|
RtlInitUnicodeString(&DeviceName, CharDeviceName);
|
||||||
|
|
||||||
Length = sizeof(USBPORT_DEVICE_EXTENSION) +
|
Length = sizeof(USBPORT_DEVICE_EXTENSION) +
|
||||||
MiniPortInterface->Packet.MiniPortExtensionSize;
|
MiniPortInterface->Packet.MiniPortExtensionSize +
|
||||||
|
sizeof(USB2_HC_EXTENSION);
|
||||||
|
|
||||||
/* Create device */
|
/* Create device */
|
||||||
Status = IoCreateDevice(DriverObject,
|
Status = IoCreateDevice(DriverObject,
|
||||||
|
@ -1903,6 +1904,22 @@ USBPORT_AddDevice(IN PDRIVER_OBJECT DriverObject,
|
||||||
FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
|
FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
|
||||||
sizeof(USBPORT_DEVICE_EXTENSION));
|
sizeof(USBPORT_DEVICE_EXTENSION));
|
||||||
|
|
||||||
|
if (MiniPortInterface->Packet.MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
|
||||||
|
{
|
||||||
|
FdoExtension->Usb2Extension =
|
||||||
|
(PUSB2_HC_EXTENSION)((ULONG_PTR)FdoExtension->MiniPortExt +
|
||||||
|
MiniPortInterface->Packet.MiniPortExtensionSize);
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AddDevice: Usb2Extension - %p\n",
|
||||||
|
FdoExtension->Usb2Extension);
|
||||||
|
|
||||||
|
USB2_InitController(FdoExtension->Usb2Extension);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FdoExtension->Usb2Extension = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
FdoExtension->MiniPortInterface = MiniPortInterface;
|
FdoExtension->MiniPortInterface = MiniPortInterface;
|
||||||
FdoExtension->FdoNameNumber = DeviceNumber;
|
FdoExtension->FdoNameNumber = DeviceNumber;
|
||||||
|
|
||||||
|
@ -1936,7 +1953,7 @@ USBPORT_Unload(IN PDRIVER_OBJECT DriverObject)
|
||||||
|
|
||||||
if (!MiniPortInterface)
|
if (!MiniPortInterface)
|
||||||
{
|
{
|
||||||
DPRINT("USBPORT_Unload: CRITICAL ERROR!!! USBPORT_FindMiniPort not found MiniPortInterface\n");
|
DPRINT("USBPORT_Unload: CRITICAL ERROR!!! Not found MiniPortInterface\n");
|
||||||
KeBugCheckEx(BUGCODE_USB_DRIVER, 1, 0, 0, 0);
|
KeBugCheckEx(BUGCODE_USB_DRIVER, 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@
|
||||||
/* Device handle Flags (USBPORT_DEVICE_HANDLE) */
|
/* Device handle Flags (USBPORT_DEVICE_HANDLE) */
|
||||||
#define DEVICE_HANDLE_FLAG_ROOTHUB 0x00000002
|
#define DEVICE_HANDLE_FLAG_ROOTHUB 0x00000002
|
||||||
#define DEVICE_HANDLE_FLAG_REMOVED 0x00000008
|
#define DEVICE_HANDLE_FLAG_REMOVED 0x00000008
|
||||||
#define DEVICE_HANDLE_FLAG_INITIALIZED 0x00000010
|
#define DEVICE_HANDLE_FLAG_USB2HUB 0x00000010
|
||||||
|
|
||||||
/* Endpoint Flags (USBPORT_ENDPOINT) */
|
/* Endpoint Flags (USBPORT_ENDPOINT) */
|
||||||
#define ENDPOINT_FLAG_DMA_TYPE 0x00000001
|
#define ENDPOINT_FLAG_DMA_TYPE 0x00000001
|
||||||
|
@ -153,6 +153,11 @@ typedef struct _USBPORT_COMMON_BUFFER_HEADER {
|
||||||
|
|
||||||
typedef struct _USBPORT_ENDPOINT *PUSBPORT_ENDPOINT;
|
typedef struct _USBPORT_ENDPOINT *PUSBPORT_ENDPOINT;
|
||||||
|
|
||||||
|
typedef struct _USB2_HC_EXTENSION *PUSB2_HC_EXTENSION;
|
||||||
|
typedef struct _USB2_TT_EXTENSION *PUSB2_TT_EXTENSION;
|
||||||
|
typedef struct _USB2_TT *PUSB2_TT;
|
||||||
|
typedef struct _USB2_TT_ENDPOINT *PUSB2_TT_ENDPOINT;
|
||||||
|
|
||||||
typedef struct _USBPORT_PIPE_HANDLE {
|
typedef struct _USBPORT_PIPE_HANDLE {
|
||||||
ULONG Flags;
|
ULONG Flags;
|
||||||
ULONG PipeFlags;
|
ULONG PipeFlags;
|
||||||
|
@ -191,6 +196,8 @@ typedef struct _USBPORT_DEVICE_HANDLE {
|
||||||
LIST_ENTRY DeviceHandleLink;
|
LIST_ENTRY DeviceHandleLink;
|
||||||
LONG DeviceHandleLock;
|
LONG DeviceHandleLock;
|
||||||
ULONG TtCount;
|
ULONG TtCount;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
|
||||||
|
LIST_ENTRY TtList;
|
||||||
} USBPORT_DEVICE_HANDLE, *PUSBPORT_DEVICE_HANDLE;
|
} USBPORT_DEVICE_HANDLE, *PUSBPORT_DEVICE_HANDLE;
|
||||||
|
|
||||||
typedef struct _USBPORT_ENDPOINT {
|
typedef struct _USBPORT_ENDPOINT {
|
||||||
|
@ -198,6 +205,8 @@ typedef struct _USBPORT_ENDPOINT {
|
||||||
PDEVICE_OBJECT FdoDevice;
|
PDEVICE_OBJECT FdoDevice;
|
||||||
PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
|
PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
|
||||||
PUSBPORT_DEVICE_HANDLE DeviceHandle;
|
PUSBPORT_DEVICE_HANDLE DeviceHandle;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
|
||||||
|
PUSB2_TT_ENDPOINT TtEndpoint;
|
||||||
USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
|
USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
|
||||||
ULONG EndpointWorker;
|
ULONG EndpointWorker;
|
||||||
ULONG FrameNumber;
|
ULONG FrameNumber;
|
||||||
|
@ -226,6 +235,8 @@ typedef struct _USBPORT_ENDPOINT {
|
||||||
LIST_ENTRY FlushLink;
|
LIST_ENTRY FlushLink;
|
||||||
LIST_ENTRY FlushControllerLink;
|
LIST_ENTRY FlushControllerLink;
|
||||||
LIST_ENTRY FlushAbortLink;
|
LIST_ENTRY FlushAbortLink;
|
||||||
|
LIST_ENTRY TtLink;
|
||||||
|
LIST_ENTRY RebalanceLink;
|
||||||
} USBPORT_ENDPOINT, *PUSBPORT_ENDPOINT;
|
} USBPORT_ENDPOINT, *PUSBPORT_ENDPOINT;
|
||||||
|
|
||||||
typedef struct _USBPORT_ISO_BLOCK *PUSBPORT_ISO_BLOCK;
|
typedef struct _USBPORT_ISO_BLOCK *PUSBPORT_ISO_BLOCK;
|
||||||
|
@ -374,10 +385,14 @@ typedef struct _USBPORT_DEVICE_EXTENSION {
|
||||||
KSPIN_LOCK SetPowerD0SpinLock;
|
KSPIN_LOCK SetPowerD0SpinLock;
|
||||||
KDPC WorkerRequestDpc;
|
KDPC WorkerRequestDpc;
|
||||||
KDPC HcWakeDpc;
|
KDPC HcWakeDpc;
|
||||||
|
/* Usb 2.0 HC Extension */
|
||||||
|
PUSB2_HC_EXTENSION Usb2Extension;
|
||||||
|
ULONG Bandwidth[32];
|
||||||
|
KSPIN_LOCK TtSpinLock;
|
||||||
|
|
||||||
/* Miniport extension should be aligned on 0x100 */
|
/* Miniport extension should be aligned on 0x100 */
|
||||||
#if !defined(_M_X64)
|
#if !defined(_M_X64)
|
||||||
ULONG Padded[34];
|
ULONG Padded[64];
|
||||||
#else
|
#else
|
||||||
ULONG Padded[0];
|
ULONG Padded[0];
|
||||||
#endif
|
#endif
|
||||||
|
@ -385,7 +400,7 @@ typedef struct _USBPORT_DEVICE_EXTENSION {
|
||||||
} USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
|
} USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
|
||||||
|
|
||||||
#if !defined(_M_X64)
|
#if !defined(_M_X64)
|
||||||
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x400);
|
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x500);
|
||||||
#else
|
#else
|
||||||
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
|
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
|
||||||
#endif
|
#endif
|
||||||
|
@ -430,6 +445,130 @@ typedef struct _TIMER_WORK_QUEUE_ITEM {
|
||||||
ULONG Context;
|
ULONG Context;
|
||||||
} TIMER_WORK_QUEUE_ITEM, *PTIMER_WORK_QUEUE_ITEM;
|
} TIMER_WORK_QUEUE_ITEM, *PTIMER_WORK_QUEUE_ITEM;
|
||||||
|
|
||||||
|
/* Transaction Translator */
|
||||||
|
/* See Chapter 5 - USB Data Flow Model and Chapter 11 - Hub Specification */
|
||||||
|
|
||||||
|
#define USB2_FRAMES 32
|
||||||
|
#define USB2_MICROFRAMES 8
|
||||||
|
#define USB2_MAX_MICROFRAMES (USB2_FRAMES * USB2_MICROFRAMES)
|
||||||
|
#define USB2_PREV_MICROFRAME 0xFF
|
||||||
|
|
||||||
|
#define USB2_MAX_MICROFRAME_ALLOCATION 7000 // bytes
|
||||||
|
#define USB2_CONTROLLER_DELAY 100
|
||||||
|
#define USB2_FS_MAX_PERIODIC_ALLOCATION 1157 // ((12000 / 8 bits) * 0.9) / (7/6) - 90% max, and bits stuffing
|
||||||
|
#define USB2_FS_SOF_TIME 6
|
||||||
|
#define USB2_HUB_DELAY 30
|
||||||
|
#define USB2_MAX_FS_LS_TRANSACTIONS_IN_UFRAME 16
|
||||||
|
#define USB2_FS_RAW_BYTES_IN_MICROFRAME 188 // (12000 / 8 bits / USB2_MICROFRAMES) = 187,5. But we use "best case budget"
|
||||||
|
|
||||||
|
/* Overheads */
|
||||||
|
#define USB2_LS_INTERRUPT_OVERHEAD 117 // FS-bytes
|
||||||
|
#define USB2_FS_INTERRUPT_OVERHEAD 13
|
||||||
|
#define USB2_HS_INTERRUPT_OUT_OVERHEAD 45
|
||||||
|
#define USB2_HS_INTERRUPT_IN_OVERHEAD 25
|
||||||
|
#define USB2_FS_ISOCHRONOUS_OVERHEAD 9
|
||||||
|
#define USB2_HS_ISOCHRONOUS_OUT_OVERHEAD 38
|
||||||
|
#define USB2_HS_ISOCHRONOUS_IN_OVERHEAD 18
|
||||||
|
|
||||||
|
#define USB2_HS_SS_INTERRUPT_OUT_OVERHEAD 58
|
||||||
|
#define USB2_HS_CS_INTERRUPT_OUT_OVERHEAD 36
|
||||||
|
#define USB2_HS_SS_INTERRUPT_IN_OVERHEAD 39
|
||||||
|
#define USB2_HS_CS_INTERRUPT_IN_OVERHEAD 38
|
||||||
|
|
||||||
|
#define USB2_HS_SS_ISOCHRONOUS_OUT_OVERHEAD 58
|
||||||
|
#define USB2_HS_SS_ISOCHRONOUS_IN_OVERHEAD 39
|
||||||
|
#define USB2_HS_CS_ISOCHRONOUS_IN_OVERHEAD 38
|
||||||
|
|
||||||
|
#define USB2_BIT_STUFFING_OVERHEAD (8 * (7/6)) // 7.1.9 Bit Stuffing
|
||||||
|
|
||||||
|
typedef union _USB2_TT_ENDPOINT_PARAMS {
|
||||||
|
struct {
|
||||||
|
ULONG TransferType : 4;
|
||||||
|
ULONG Direction : 1;
|
||||||
|
USB_DEVICE_SPEED DeviceSpeed : 2;
|
||||||
|
BOOL EndpointMoved : 1;
|
||||||
|
ULONG Reserved : 24;
|
||||||
|
};
|
||||||
|
ULONG AsULONG;
|
||||||
|
} USB2_TT_ENDPOINT_PARAMS;
|
||||||
|
|
||||||
|
C_ASSERT(sizeof(USB2_TT_ENDPOINT_PARAMS) == sizeof(ULONG));
|
||||||
|
|
||||||
|
typedef union _USB2_TT_ENDPOINT_NUMS {
|
||||||
|
struct {
|
||||||
|
ULONG NumStarts : 4;
|
||||||
|
ULONG NumCompletes : 4;
|
||||||
|
ULONG Reserved : 24;
|
||||||
|
};
|
||||||
|
ULONG AsULONG;
|
||||||
|
} USB2_TT_ENDPOINT_NUMS;
|
||||||
|
|
||||||
|
C_ASSERT(sizeof(USB2_TT_ENDPOINT_NUMS) == sizeof(ULONG));
|
||||||
|
|
||||||
|
typedef struct _USB2_TT_ENDPOINT {
|
||||||
|
PUSB2_TT Tt;
|
||||||
|
PUSBPORT_ENDPOINT Endpoint;
|
||||||
|
struct _USB2_TT_ENDPOINT * NextTtEndpoint;
|
||||||
|
USB2_TT_ENDPOINT_PARAMS TtEndpointParams;
|
||||||
|
USB2_TT_ENDPOINT_NUMS Nums;
|
||||||
|
BOOL IsPromoted;
|
||||||
|
USHORT MaxPacketSize;
|
||||||
|
USHORT PreviosPeriod;
|
||||||
|
USHORT Period;
|
||||||
|
USHORT ActualPeriod;
|
||||||
|
USHORT CalcBusTime;
|
||||||
|
USHORT StartTime;
|
||||||
|
USHORT Reserved2;
|
||||||
|
UCHAR StartFrame;
|
||||||
|
UCHAR StartMicroframe;
|
||||||
|
} USB2_TT_ENDPOINT, *PUSB2_TT_ENDPOINT;
|
||||||
|
|
||||||
|
typedef struct _USB2_FRAME_BUDGET {
|
||||||
|
PUSB2_TT_ENDPOINT IsoEndpoint;
|
||||||
|
PUSB2_TT_ENDPOINT IntEndpoint;
|
||||||
|
PUSB2_TT_ENDPOINT AltEndpoint;
|
||||||
|
USHORT TimeUsed;
|
||||||
|
USHORT Reserved2;
|
||||||
|
} USB2_FRAME_BUDGET, *PUSB2_FRAME_BUDGET;
|
||||||
|
|
||||||
|
typedef struct _USB2_TT {
|
||||||
|
PUSB2_HC_EXTENSION HcExtension;
|
||||||
|
ULONG DelayTime;
|
||||||
|
ULONG MaxTime;
|
||||||
|
USB2_TT_ENDPOINT IntEndpoint[USB2_FRAMES];
|
||||||
|
USB2_TT_ENDPOINT IsoEndpoint[USB2_FRAMES];
|
||||||
|
USB2_FRAME_BUDGET FrameBudget[USB2_FRAMES];
|
||||||
|
ULONG NumStartSplits[USB2_FRAMES][USB2_MICROFRAMES];
|
||||||
|
ULONG TimeCS[USB2_FRAMES][USB2_MICROFRAMES];
|
||||||
|
} USB2_TT, *PUSB2_TT;
|
||||||
|
|
||||||
|
#define USB2_TT_EXTENSION_FLAG_DELETED 1
|
||||||
|
|
||||||
|
typedef struct _USB2_TT_EXTENSION {
|
||||||
|
PDEVICE_OBJECT RootHubPdo;
|
||||||
|
ULONG Flags;
|
||||||
|
ULONG BusBandwidth;
|
||||||
|
ULONG Bandwidth[USB2_FRAMES];
|
||||||
|
ULONG MaxBandwidth;
|
||||||
|
ULONG MinBandwidth;
|
||||||
|
USHORT DeviceAddress;
|
||||||
|
USHORT TtNumber;
|
||||||
|
LIST_ENTRY EndpointList;
|
||||||
|
LIST_ENTRY Link;
|
||||||
|
USB2_TT Tt;
|
||||||
|
} USB2_TT_EXTENSION, *PUSB2_TT_EXTENSION;
|
||||||
|
|
||||||
|
typedef struct _USB2_HC_EXTENSION {
|
||||||
|
ULONG MaxHsBusAllocation;
|
||||||
|
ULONG HcDelayTime;
|
||||||
|
ULONG TimeUsed[USB2_FRAMES][USB2_MICROFRAMES];
|
||||||
|
USB2_TT HcTt;
|
||||||
|
} USB2_HC_EXTENSION, *PUSB2_HC_EXTENSION;
|
||||||
|
|
||||||
|
typedef struct _USB2_REBALANCE {
|
||||||
|
PUSB2_TT_ENDPOINT RebalanceEndpoint[USB2_FRAMES - 2];
|
||||||
|
} USB2_REBALANCE, *PUSB2_REBALANCE;
|
||||||
|
|
||||||
/* usbport.c */
|
/* usbport.c */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -1184,4 +1323,30 @@ USBPORT_FreeBandwidthUSB2(
|
||||||
IN PDEVICE_OBJECT FdoDevice,
|
IN PDEVICE_OBJECT FdoDevice,
|
||||||
IN PUSBPORT_ENDPOINT Endpoint);
|
IN PUSBPORT_ENDPOINT Endpoint);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USBPORT_UpdateAllocatedBwTt(
|
||||||
|
IN PUSB2_TT_EXTENSION TtExtension);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USB2_InitTT(
|
||||||
|
IN PUSB2_HC_EXTENSION HcExtension,
|
||||||
|
IN PUSB2_TT Tt);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USB2_InitController(
|
||||||
|
IN PUSB2_HC_EXTENSION HcExtension);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USBPORT_DumpingEndpointProperties(
|
||||||
|
IN PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
USBPORT_DumpingTtEndpoint(
|
||||||
|
IN PUSB2_TT_ENDPOINT TtEndpoint);
|
||||||
|
|
||||||
#endif /* USBPORT_H__ */
|
#endif /* USBPORT_H__ */
|
||||||
|
|
|
@ -279,6 +279,14 @@ C_ASSERT(sizeof(USB_HUB_STATUS_AND_CHANGE) == sizeof(ULONG));
|
||||||
#define USB_20_HUB_DESCRIPTOR_TYPE 0x29
|
#define USB_20_HUB_DESCRIPTOR_TYPE 0x29
|
||||||
#define USB_30_HUB_DESCRIPTOR_TYPE 0x2A
|
#define USB_30_HUB_DESCRIPTOR_TYPE 0x2A
|
||||||
|
|
||||||
|
#define USB_REQUEST_CLEAR_TT_BUFFER 0x08
|
||||||
|
#define USB_REQUEST_RESET_TT 0x09
|
||||||
|
#define USB_REQUEST_GET_TT_STATE 0x0A
|
||||||
|
#define USB_REQUEST_STOP_TT 0x0B
|
||||||
|
|
||||||
|
#define USB_REQUEST_SET_HUB_DEPTH 0x0C
|
||||||
|
#define USB_REQUEST_GET_PORT_ERR_COUNT 0x0D
|
||||||
|
|
||||||
#define USB_DEVICE_CLASS_RESERVED 0x00
|
#define USB_DEVICE_CLASS_RESERVED 0x00
|
||||||
#define USB_DEVICE_CLASS_AUDIO 0x01
|
#define USB_DEVICE_CLASS_AUDIO 0x01
|
||||||
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
|
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue