mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[USBPORT] Implement USBPORT_FreeBandwidthUSB2().
This commit is contained in:
parent
57f092106a
commit
7b92b8a6e2
2 changed files with 121 additions and 4 deletions
|
@ -1075,13 +1075,14 @@ USB2_DeallocateEndpointBudget(IN PUSB2_TT_ENDPOINT TtEndpoint,
|
||||||
USHORT Period;
|
USHORT Period;
|
||||||
BOOLEAN IsMoved = FALSE;
|
BOOLEAN IsMoved = FALSE;
|
||||||
|
|
||||||
DPRINT("USB2_DeallocateEndpointBudget: TtEndpoint - %p, MaxFrames - %X\n",
|
DPRINT("USB2_DeallocateEndpointBudget: TtEndpoint - %p, MaxFrames - %X, CalcBusTime - %X\n",
|
||||||
TtEndpoint,
|
TtEndpoint,
|
||||||
MaxFrames);
|
MaxFrames,
|
||||||
|
TtEndpoint->CalcBusTime);
|
||||||
|
|
||||||
if (TtEndpoint->CalcBusTime == 0)
|
if (TtEndpoint->CalcBusTime == 0)
|
||||||
{
|
{
|
||||||
DPRINT("USB2_DeallocateEndpointBudget: endpoint not allocated\n");//error((int)"endpoint not allocated");
|
DPRINT("USB2_DeallocateEndpointBudget: TtEndpoint not allocated!\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2087,7 +2088,122 @@ NTAPI
|
||||||
USBPORT_FreeBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice,
|
USBPORT_FreeBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice,
|
||||||
IN PUSBPORT_ENDPOINT Endpoint)
|
IN PUSBPORT_ENDPOINT Endpoint)
|
||||||
{
|
{
|
||||||
DPRINT1("USBPORT_FreeBandwidthUSB2: UNIMPLEMENTED. FIXME. \n");
|
PUSBPORT_DEVICE_EXTENSION FdoExtension;
|
||||||
|
ULONG Period;
|
||||||
|
ULONG ScheduleOffset;
|
||||||
|
ULONG EndpointBandwidth;
|
||||||
|
LIST_ENTRY RebalanceList;
|
||||||
|
ULONG TransferType;
|
||||||
|
PUSB2_REBALANCE Rebalance;
|
||||||
|
ULONG RebalanceListEntries;
|
||||||
|
ULONG Factor;
|
||||||
|
ULONG ix;
|
||||||
|
ULONG n;
|
||||||
|
PUSB2_TT_EXTENSION TtExtension;
|
||||||
|
PUSB2_TT_ENDPOINT RebalanceTtEndpoint;
|
||||||
|
|
||||||
|
DPRINT("USBPORT_FreeBandwidthUSB2: Endpoint - %p\n", Endpoint);
|
||||||
|
|
||||||
|
FdoExtension = FdoDevice->DeviceExtension;
|
||||||
|
|
||||||
|
Period = Endpoint->EndpointProperties.Period;
|
||||||
|
ScheduleOffset = Endpoint->EndpointProperties.ScheduleOffset;
|
||||||
|
EndpointBandwidth = Endpoint->EndpointProperties.UsbBandwidth;
|
||||||
|
|
||||||
|
InitializeListHead(&RebalanceList);
|
||||||
|
|
||||||
|
TransferType = Endpoint->EndpointProperties.TransferType;
|
||||||
|
|
||||||
|
if (TransferType == USBPORT_TRANSFER_TYPE_CONTROL ||
|
||||||
|
TransferType == USBPORT_TRANSFER_TYPE_BULK ||
|
||||||
|
(Endpoint->Flags & ENDPOINT_FLAG_ROOTHUB_EP0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rebalance = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
|
sizeof(USB2_REBALANCE),
|
||||||
|
USB_PORT_TAG);
|
||||||
|
|
||||||
|
if (!Rebalance)
|
||||||
|
{
|
||||||
|
DPRINT1("USBPORT_FreeBandwidthUSB2: Rebalance == NULL!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlZeroMemory(Rebalance, sizeof(USB2_REBALANCE));
|
||||||
|
|
||||||
|
Factor = USB2_FRAMES / Period;
|
||||||
|
ASSERT(Factor);
|
||||||
|
|
||||||
|
n = ScheduleOffset * Factor;
|
||||||
|
|
||||||
|
TtExtension = Endpoint->TtExtension;
|
||||||
|
|
||||||
|
if (TtExtension)
|
||||||
|
{
|
||||||
|
for (ix = 0; ix < Factor; ix++)
|
||||||
|
{
|
||||||
|
TtExtension->Bandwidth[n + ix] += EndpointBandwidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (ix = 1; ix < Factor; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[n + ix] += EndpointBandwidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RebalanceListEntries = USB2_FRAMES - 2;
|
||||||
|
|
||||||
|
USB2_DeallocateEndpointBudget(Endpoint->TtEndpoint,
|
||||||
|
Rebalance,
|
||||||
|
&RebalanceListEntries,
|
||||||
|
USB2_FRAMES);
|
||||||
|
|
||||||
|
RebalanceListEntries = 0;
|
||||||
|
|
||||||
|
for (ix = 0; Rebalance->RebalanceEndpoint[ix]; ix++)
|
||||||
|
{
|
||||||
|
RebalanceListEntries = ix + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ix = 0; ix < RebalanceListEntries; ix++)
|
||||||
|
{
|
||||||
|
RebalanceTtEndpoint = Rebalance->RebalanceEndpoint[ix];
|
||||||
|
|
||||||
|
DPRINT("USBPORT_AllocateBandwidthUSB2: RebalanceTtEndpoint[%X] - %p, RebalanceTtEndpoint - %p, RebalanceLink - %p\n",
|
||||||
|
ix,
|
||||||
|
RebalanceTtEndpoint,
|
||||||
|
&RebalanceTtEndpoint->Endpoint->RebalanceLink);
|
||||||
|
|
||||||
|
InsertTailList(&RebalanceList,
|
||||||
|
&RebalanceTtEndpoint->Endpoint->RebalanceLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExFreePoolWithTag(Rebalance, USB_PORT_TAG);
|
||||||
|
|
||||||
|
USB2_Rebalance(FdoDevice, &RebalanceList);
|
||||||
|
|
||||||
|
if (!TtExtension)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] += TtExtension->MaxBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
USBPORT_UpdateAllocatedBwTt(TtExtension);
|
||||||
|
|
||||||
|
for (ix = 0; ix < USB2_FRAMES; ix++)
|
||||||
|
{
|
||||||
|
FdoExtension->Bandwidth[ix] -= TtExtension->MaxBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("USBPORT_FreeBandwidthUSB2: exit\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -508,6 +508,7 @@ typedef struct _USB2_TT_ENDPOINT {
|
||||||
struct _USB2_TT_ENDPOINT * NextTtEndpoint;
|
struct _USB2_TT_ENDPOINT * NextTtEndpoint;
|
||||||
USB2_TT_ENDPOINT_PARAMS TtEndpointParams;
|
USB2_TT_ENDPOINT_PARAMS TtEndpointParams;
|
||||||
USB2_TT_ENDPOINT_NUMS Nums;
|
USB2_TT_ENDPOINT_NUMS Nums;
|
||||||
|
BOOL IsPromoted;
|
||||||
USHORT MaxPacketSize;
|
USHORT MaxPacketSize;
|
||||||
USHORT PreviosPeriod;
|
USHORT PreviosPeriod;
|
||||||
USHORT Period;
|
USHORT Period;
|
||||||
|
|
Loading…
Reference in a new issue