mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 01:48:42 +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_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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -105,8 +105,6 @@ USBPORT_DoSetPowerD0(IN PDEVICE_OBJECT FdoDevice)
|
|||
{
|
||||
DPRINT("USBPORT_DoSetPowerD0: FIXME!\n");
|
||||
return;
|
||||
DbgBreakPoint();
|
||||
//ASSERT(FALSE);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
|
|
@ -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
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue