Merge PR #283 "[USBPORT] Transaction Translator (TT) support bringup"

This commit is contained in:
Colin Finck 2018-03-29 23:52:22 +02:00
commit 765280bf5f
12 changed files with 2941 additions and 66 deletions

View file

@ -12,6 +12,7 @@
#define NDEBUG_USBPORT_MINIPORT
#define NDEBUG_USBPORT_URB
//#define NDEBUG_USBPORT_USB2
#include "usbdebug.h"
ULONG
@ -275,3 +276,39 @@ USBPORT_DumpingIDs(IN PVOID Buffer)
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);
}

View file

@ -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
NTAPI
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 Port)
{
PUSBPORT_DEVICE_HANDLE TtDeviceHandle = NULL;
PUSB2_TT_EXTENSION TtExtension = NULL;
USHORT port;
PUSBPORT_DEVICE_HANDLE DeviceHandle;
PUSBPORT_PIPE_HANDLE PipeHandle;
BOOL IsOpenedPipe;
@ -902,7 +975,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
SIZE_T DescriptorMinSize;
UCHAR MaxPacketSize;
PUSBPORT_DEVICE_EXTENSION FdoExtension;
PUSBPORT_REGISTRATION_PACKET Packet;
NTSTATUS Status;
DPRINT("USBPORT_CreateDevice: PortStatus - %p, Port - %x\n",
@ -910,6 +983,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
Port);
FdoExtension = FdoDevice->DeviceExtension;
Packet = &FdoExtension->MiniPortInterface->Packet;
KeWaitForSingleObject(&FdoExtension->DeviceSemaphore,
Executive,
@ -928,11 +1002,21 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
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))
{
DPRINT1("USBPORT_CreateDevice: USB1 device connected to USB2 port. FIXME: Transaction Translator.\n");
DbgBreakPoint();
DPRINT1("USBPORT_CreateDevice: USB1 device connected to USB2 port\n");
TtExtension = USBPORT_GetTt(FdoDevice,
HubDeviceHandle,
&port,
&TtDeviceHandle);
DPRINT("USBPORT_CreateDevice: TtDeviceHandle - %p, port - %x\n",
TtDeviceHandle,
port);
}
KeReleaseSemaphore(&FdoExtension->DeviceSemaphore,
@ -954,6 +1038,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
*pUsbdDeviceHandle = NULL;
DeviceHandle->TtExtension = TtExtension;
DeviceHandle->PortNumber = Port;
DeviceHandle->HubDeviceHandle = HubDeviceHandle;
@ -993,6 +1078,7 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
}
InitializeListHead(&DeviceHandle->PipeHandleList);
InitializeListHead(&DeviceHandle->TtList);
Status = USBPORT_OpenPipe(FdoDevice,
DeviceHandle,
@ -1089,7 +1175,36 @@ USBPORT_CreateDevice(IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
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;
@ -1262,6 +1377,12 @@ USBPORT_InitializeDevice(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
(MaxPacketSize == 16) ||
(MaxPacketSize == 32) ||
(MaxPacketSize == 64));
if (DeviceHandle->DeviceSpeed == UsbHighSpeed &&
DeviceHandle->DeviceDescriptor.bDeviceClass == USB_DEVICE_CLASS_HUB)
{
DeviceHandle->Flags |= DEVICE_HANDLE_FLAG_USB2HUB;
}
}
else
{
@ -1443,6 +1564,9 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
IN ULONG Flags)
{
PUSBPORT_DEVICE_EXTENSION FdoExtension;
PUSB2_TT_EXTENSION TtExtension;
ULONG ix;
KIRQL OldIrql;
DPRINT("USBPORT_RemoveDevice: DeviceHandle - %p, Flags - %x\n",
DeviceHandle,
@ -1502,6 +1626,41 @@ USBPORT_RemoveDevice(IN PDEVICE_OBJECT FdoDevice,
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,
LOW_REALTIME_PRIORITY,
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");
NewDeviceHandle->TtCount = OldDeviceHandle->TtCount;
#ifndef NDEBUG
DbgBreakPoint();
#endif
}
while (!IsListEmpty(&OldDeviceHandle->PipeHandleList))
@ -1770,7 +1933,55 @@ USBPORT_InitializeTT(IN PDEVICE_OBJECT FdoDevice,
IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
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;
}
@ -1783,7 +1994,7 @@ USBPORT_Initialize20Hub(IN PDEVICE_OBJECT FdoDevice,
NTSTATUS Status;
ULONG ix;
DPRINT("USBPORT_Initialize20Hub \n");
DPRINT("USBPORT_Initialize20Hub: TtCount - %X\n", TtCount);
if (!HubDeviceHandle)
{

View file

@ -20,7 +20,7 @@ USBPORT_CalculateUsbBandwidth(IN PDEVICE_OBJECT FdoDevice,
{
PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties;
ULONG Bandwidth;
ULONG Additional;
ULONG Overhead;
DPRINT("USBPORT_CalculateUsbBandwidth ... \n");
@ -29,25 +29,25 @@ USBPORT_CalculateUsbBandwidth(IN PDEVICE_OBJECT FdoDevice,
switch (EndpointProperties->TransferType)
{
case USBPORT_TRANSFER_TYPE_ISOCHRONOUS:
Additional = 9;
Overhead = USB2_FS_ISOCHRONOUS_OVERHEAD;
break;
case USBPORT_TRANSFER_TYPE_INTERRUPT:
Additional = 13;
Overhead = USB2_FS_INTERRUPT_OVERHEAD;
break;
default: //USBPORT_TRANSFER_TYPE_CONTROL or USBPORT_TRANSFER_TYPE_BULK
Additional = 0;
Overhead = 0;
break;
}
if (Additional == 0)
if (Overhead == 0)
{
Bandwidth = 0;
}
else
{
Bandwidth = (EndpointProperties->TotalMaxPacketSize + Additional) * 8 * 7 / 6;
Bandwidth = (EndpointProperties->TotalMaxPacketSize + Overhead) * USB2_BIT_STUFFING_OVERHEAD;
}
if (EndpointProperties->DeviceSpeed == UsbLowSpeed)
@ -68,9 +68,19 @@ USBPORT_AllocateBandwidth(IN PDEVICE_OBJECT FdoDevice,
ULONG TransferType;
ULONG TotalBusBandwidth;
ULONG EndpointBandwidth;
ULONG MinBandwidth;
PULONG Bandwidth;
ULONG MaxBandwidth = 0;
ULONG ix;
ULONG Offset;
LONG ScheduleOffset = -1;
ULONG Period;
ULONG Factor;
UCHAR Bit;
DPRINT("USBPORT_AllocateBandwidth: ... \n");
DPRINT("USBPORT_AllocateBandwidth: FdoDevice - %p, Endpoint - %p\n",
FdoDevice,
Endpoint);
FdoExtension = FdoDevice->DeviceExtension;
EndpointProperties = &Endpoint->EndpointProperties;
@ -86,17 +96,74 @@ USBPORT_AllocateBandwidth(IN PDEVICE_OBJECT FdoDevice,
TotalBusBandwidth = FdoExtension->TotalBusBandwidth;
EndpointBandwidth = EndpointProperties->UsbBandwidth;
Period = EndpointProperties->Period;
ASSERT(Period != 0);
Factor = USB2_FRAMES / Period;
DPRINT1("USBPORT_AllocateBandwidth: FIXME. \n");
DPRINT1("USBPORT_AllocateBandwidth: Endpoint - %p, Type - %x, TotalBandwidth - %x, EpBandwidth - %x, Period - %x\n",
Endpoint,
TransferType,
TotalBusBandwidth,
EndpointBandwidth,
Period);
for (Offset = 0; Offset < Period; Offset++)
{
MinBandwidth = TotalBusBandwidth;
Bandwidth = &FdoExtension->Bandwidth[Offset * Factor];
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
@ -104,7 +171,63 @@ NTAPI
USBPORT_FreeBandwidth(IN PDEVICE_OBJECT FdoDevice,
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
@ -379,7 +502,7 @@ USBPORT_DeleteEndpoint(IN PDEVICE_OBJECT FdoDevice,
BOOLEAN Result;
KIRQL OldIrql;
DPRINT("USBPORT_DeleteEndpoint: Endpoint - %p\n", Endpoint);
DPRINT1("USBPORT_DeleteEndpoint: Endpoint - %p\n", Endpoint);
FdoExtension = FdoDevice->DeviceExtension;
@ -471,10 +594,13 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
PUSBPORT_DEVICE_EXTENSION FdoExtension;
PUSBPORT_RHDEVICE_EXTENSION PdoExtension;
PUSBPORT_ENDPOINT Endpoint;
PUSBPORT_REGISTRATION_PACKET Packet;
PUSB2_TT_EXTENSION TtExtension;
ULONG ix;
BOOLEAN IsReady;
KIRQL OldIrql;
DPRINT("USBPORT_ClosePipe \n");
DPRINT1("USBPORT_ClosePipe \n");
FdoExtension = FdoDevice->DeviceExtension;
@ -492,7 +618,6 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
}
Endpoint = PipeHandle->Endpoint;
DPRINT("USBPORT_ClosePipe: Endpoint - %p\n", Endpoint);
KeAcquireSpinLock(&FdoExtension->EndpointListSpinLock, &OldIrql);
@ -543,16 +668,46 @@ USBPORT_ClosePipe(IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
}
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_FreeBandwidthUSB20();
USBPORT_FreeBandwidthUSB2(FdoDevice, Endpoint);
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
{
DPRINT("USBPORT_ClosePipe: FIXME USBPORT_FreeBandwidthUSB11\n");
//USBPORT_FreeBandwidthUSB11();
USBPORT_FreeBandwidth(FdoDevice, Endpoint);
}
KeAcquireSpinLock(&Endpoint->EndpointSpinLock, &Endpoint->EndpointOldIrql);
@ -630,7 +785,7 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
USHORT AdditionalTransaction;
BOOLEAN IsAllocatedBandwidth;
DPRINT("USBPORT_OpenPipe: DeviceHandle - %p, FdoDevice - %p, PipeHandle - %p\n",
DPRINT1("USBPORT_OpenPipe: DeviceHandle - %p, FdoDevice - %p, PipeHandle - %p\n",
DeviceHandle,
FdoDevice,
PipeHandle);
@ -642,13 +797,13 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
if (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2)
{
DPRINT1("USBPORT_OpenPipe: FIXME USB2 EndpointSize\n");
EndpointSize += sizeof(USB2_TT_ENDPOINT);
}
if (PipeHandle->EndpointDescriptor.wMaxPacketSize == 0)
{
USBPORT_AddPipeHandle(DeviceHandle, PipeHandle);
PipeHandle->Flags = (PipeHandle->Flags & ~PIPE_HANDLE_FLAG_CLOSED) |
PIPE_HANDLE_FLAG_NULL_PACKET_SIZE;
@ -672,6 +827,26 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
Endpoint->DeviceHandle = DeviceHandle;
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->StateChangeSpinLock);
@ -695,6 +870,17 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
EndpointProperties->TotalMaxPacketSize = MaxPacketSize *
(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)
{
case USB_ENDPOINT_TYPE_CONTROL:
@ -739,14 +925,14 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
Interval = EndpointDescriptor->bInterval;
}
EndpointProperties->Period = 32;
EndpointProperties->Period = ENDPOINT_INTERRUPT_32ms;
if (Interval && (Interval < 32))
if (Interval && (Interval < USB2_FRAMES))
{
if ((EndpointProperties->DeviceSpeed != UsbLowSpeed) ||
(Interval >= 8))
(Interval >= ENDPOINT_INTERRUPT_8ms))
{
if (!(Interval & 0x20))
if (!(Interval & ENDPOINT_INTERRUPT_32ms))
{
Period = EndpointProperties->Period;
@ -761,7 +947,7 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
}
else
{
EndpointProperties->Period = 8;
EndpointProperties->Period = ENDPOINT_INTERRUPT_8ms;
}
}
}
@ -770,15 +956,20 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice,
{
if (EndpointProperties->DeviceSpeed == UsbHighSpeed)
{
EndpointProperties->Period =
EndpointProperties->Period =
USBPORT_NormalizeHsInterval(EndpointDescriptor->bInterval);
}
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)
{
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);
}
@ -974,7 +1172,7 @@ USBPORT_ReopenPipe(IN PDEVICE_OBJECT FdoDevice,
KIRQL MiniportOldIrql;
NTSTATUS Status;
DPRINT("USBPORT_ReopenPipe ... \n");
DPRINT1("USBPORT_ReopenPipe ... \n");
FdoExtension = FdoDevice->DeviceExtension;
Packet = &FdoExtension->MiniPortInterface->Packet;
@ -1081,7 +1279,7 @@ USBPORT_FlushClosedEndpointList(IN PDEVICE_OBJECT FdoDevice)
PLIST_ENTRY ClosedList;
PUSBPORT_ENDPOINT Endpoint;
DPRINT("USBPORT_FlushClosedEndpointList: ... \n");
DPRINT_CORE("USBPORT_FlushClosedEndpointList: ... \n");
FdoExtension = FdoDevice->DeviceExtension;

View file

@ -7,7 +7,7 @@
#include "usbport.h"
//#define NDEBUG
#define NDEBUG
#include <debug.h>
VOID
@ -326,10 +326,10 @@ USBPORT_PdoInternalDeviceControl(IN PDEVICE_OBJECT PdoDevice,
IoStack = IoGetCurrentIrpStackLocation(Irp);
IoCtl = IoStack->Parameters.DeviceIoControl.IoControlCode;
DPRINT("USBPORT_PdoInternalDeviceControl: PdoDevice - %p, Irp - %p, IoCtl - %x\n",
PdoDevice,
Irp,
IoCtl);
//DPRINT("USBPORT_PdoInternalDeviceControl: PdoDevice - %p, Irp - %p, IoCtl - %x\n",
// PdoDevice,
// Irp,
// IoCtl);
if (IoCtl == IOCTL_INTERNAL_USB_SUBMIT_URB)
{

View file

@ -519,6 +519,7 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
BOOLEAN IsCompanion = FALSE;
ULONG LegacyBIOS;
ULONG MiniportFlags;
ULONG ix;
DPRINT("USBPORT_StartDevice: FdoDevice - %p, UsbPortResources - %p\n",
FdoDevice,
@ -610,6 +611,7 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
KeInitializeSpinLock(&FdoExtension->PowerWakeSpinLock);
KeInitializeSpinLock(&FdoExtension->SetPowerD0SpinLock);
KeInitializeSpinLock(&FdoExtension->RootHubCallbackSpinLock);
KeInitializeSpinLock(&FdoExtension->TtSpinLock);
KeInitializeDpc(&FdoExtension->IsrDpc, USBPORT_IsrDpc, FdoDevice);
@ -754,6 +756,12 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
FdoExtension->TotalBusBandwidth = TotalBusBandwidth;
}
for (ix = 0; ix < USB2_FRAMES; ix++)
{
FdoExtension->Bandwidth[ix] = FdoExtension->TotalBusBandwidth -
FdoExtension->TotalBusBandwidth / 10;
}
FdoExtension->ActiveIrpTable = ExAllocatePoolWithTag(NonPagedPool,
sizeof(USBPORT_IRP_TABLE),
USB_PORT_TAG);

View file

@ -105,8 +105,6 @@ USBPORT_DoSetPowerD0(IN PDEVICE_OBJECT FdoDevice)
{
DPRINT("USBPORT_DoSetPowerD0: FIXME!\n");
return;
DbgBreakPoint();
//ASSERT(FALSE);
}
VOID

View file

@ -148,8 +148,8 @@ USBPORT_SplitBulkInterruptTransfer(IN PDEVICE_OBJECT FdoDevice,
InitializeListHead(&tmplist);
DPRINT1("USBPORT_SplitBulkInterruptTransfer: TransferBufferLength - %x, NeedSplits - %x\n",
TransferBufferLength, NeedSplits);
DPRINT("USBPORT_SplitBulkInterruptTransfer: TransferBufferLength - %x, NeedSplits - %x\n",
TransferBufferLength, NeedSplits);
if (!NeedSplits)
{
@ -214,7 +214,7 @@ Exit:
while (!IsListEmpty(&tmplist))
{
DPRINT1("USBPORT_SplitBulkInterruptTransfer: ... \n");
DPRINT("USBPORT_SplitBulkInterruptTransfer: ... \n");
SplitTransfer = CONTAINING_RECORD(tmplist.Flink,
USBPORT_TRANSFER,

File diff suppressed because it is too large Load diff

View file

@ -112,6 +112,23 @@
#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 */
#if defined(_MSC_VER)
@ -121,6 +138,7 @@
#define DPRINT_INT __noop
#define DPRINT_TIMER __noop
#define DPRINT_QUEUE __noop
#define DPRINT_USB2 __noop
#else
#define DPRINT_MINIPORT(...) 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_TIMER(...) 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 /* not DBG */

View file

@ -637,8 +637,8 @@ USBPORT_InvalidateControllerHandler(IN PDEVICE_OBJECT FdoDevice,
{
PUSBPORT_DEVICE_EXTENSION FdoExtension;
DPRINT("USBPORT_InvalidateControllerHandler: Invalidate Type - %x\n",
Type);
DPRINT_CORE("USBPORT_InvalidateControllerHandler: Invalidate Type - %x\n",
Type);
FdoExtension = FdoDevice->DeviceExtension;
@ -869,7 +869,7 @@ USBPORT_DpcHandler(IN PDEVICE_OBJECT FdoDevice)
LIST_ENTRY List;
LONG LockCounter;
DPRINT("USBPORT_DpcHandler: ... \n");
DPRINT_CORE("USBPORT_DpcHandler: ... \n");
FdoExtension = FdoDevice->DeviceExtension;
@ -1845,7 +1845,8 @@ USBPORT_AddDevice(IN PDRIVER_OBJECT DriverObject,
RtlInitUnicodeString(&DeviceName, CharDeviceName);
Length = sizeof(USBPORT_DEVICE_EXTENSION) +
MiniPortInterface->Packet.MiniPortExtensionSize;
MiniPortInterface->Packet.MiniPortExtensionSize +
sizeof(USB2_HC_EXTENSION);
/* Create device */
Status = IoCreateDevice(DriverObject,
@ -1903,6 +1904,22 @@ USBPORT_AddDevice(IN PDRIVER_OBJECT DriverObject,
FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
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->FdoNameNumber = DeviceNumber;
@ -1936,7 +1953,7 @@ USBPORT_Unload(IN PDRIVER_OBJECT DriverObject)
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);
}

View file

@ -104,7 +104,7 @@
/* Device handle Flags (USBPORT_DEVICE_HANDLE) */
#define DEVICE_HANDLE_FLAG_ROOTHUB 0x00000002
#define DEVICE_HANDLE_FLAG_REMOVED 0x00000008
#define DEVICE_HANDLE_FLAG_INITIALIZED 0x00000010
#define DEVICE_HANDLE_FLAG_USB2HUB 0x00000010
/* Endpoint Flags (USBPORT_ENDPOINT) */
#define ENDPOINT_FLAG_DMA_TYPE 0x00000001
@ -153,6 +153,11 @@ typedef struct _USBPORT_COMMON_BUFFER_HEADER {
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 {
ULONG Flags;
ULONG PipeFlags;
@ -191,6 +196,8 @@ typedef struct _USBPORT_DEVICE_HANDLE {
LIST_ENTRY DeviceHandleLink;
LONG DeviceHandleLock;
ULONG TtCount;
PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
LIST_ENTRY TtList;
} USBPORT_DEVICE_HANDLE, *PUSBPORT_DEVICE_HANDLE;
typedef struct _USBPORT_ENDPOINT {
@ -198,6 +205,8 @@ typedef struct _USBPORT_ENDPOINT {
PDEVICE_OBJECT FdoDevice;
PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
PUSBPORT_DEVICE_HANDLE DeviceHandle;
PUSB2_TT_EXTENSION TtExtension; // Transaction Translator
PUSB2_TT_ENDPOINT TtEndpoint;
USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
ULONG EndpointWorker;
ULONG FrameNumber;
@ -226,6 +235,8 @@ typedef struct _USBPORT_ENDPOINT {
LIST_ENTRY FlushLink;
LIST_ENTRY FlushControllerLink;
LIST_ENTRY FlushAbortLink;
LIST_ENTRY TtLink;
LIST_ENTRY RebalanceLink;
} USBPORT_ENDPOINT, *PUSBPORT_ENDPOINT;
typedef struct _USBPORT_ISO_BLOCK *PUSBPORT_ISO_BLOCK;
@ -374,10 +385,14 @@ typedef struct _USBPORT_DEVICE_EXTENSION {
KSPIN_LOCK SetPowerD0SpinLock;
KDPC WorkerRequestDpc;
KDPC HcWakeDpc;
/* Usb 2.0 HC Extension */
PUSB2_HC_EXTENSION Usb2Extension;
ULONG Bandwidth[32];
KSPIN_LOCK TtSpinLock;
/* Miniport extension should be aligned on 0x100 */
#if !defined(_M_X64)
ULONG Padded[34];
ULONG Padded[64];
#else
ULONG Padded[0];
#endif
@ -385,7 +400,7 @@ typedef struct _USBPORT_DEVICE_EXTENSION {
} USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
#if !defined(_M_X64)
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x400);
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x500);
#else
C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
#endif
@ -430,6 +445,130 @@ typedef struct _TIMER_WORK_QUEUE_ITEM {
ULONG Context;
} 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 */
NTSTATUS
NTAPI
@ -1184,4 +1323,30 @@ USBPORT_FreeBandwidthUSB2(
IN PDEVICE_OBJECT FdoDevice,
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__ */

View file

@ -279,6 +279,14 @@ C_ASSERT(sizeof(USB_HUB_STATUS_AND_CHANGE) == sizeof(ULONG));
#define USB_20_HUB_DESCRIPTOR_TYPE 0x29
#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_AUDIO 0x01
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02