mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
[USBPORT] Start implementation USB2_AllocateTimeForEndpoint().
This commit is contained in:
parent
65f8f961a3
commit
7553e54199
1 changed files with 161 additions and 0 deletions
|
@ -491,6 +491,167 @@ USB2_AllocateTimeForEndpoint(IN PUSB2_TT_ENDPOINT TtEndpoint,
|
|||
IN PUSB2_REBALANCE Rebalance,
|
||||
IN PULONG RebalanceListEntries)
|
||||
{
|
||||
PUSB2_TT Tt;
|
||||
PUSB2_HC_EXTENSION HcExtension;
|
||||
ULONG Speed;
|
||||
ULONG TimeUsed;
|
||||
ULONG MinTimeUsed;
|
||||
ULONG ix;
|
||||
ULONG frame;
|
||||
ULONG uframe;
|
||||
ULONG Microframe;
|
||||
ULONG TransferType;
|
||||
ULONG Overhead;
|
||||
BOOLEAN Result = TRUE;
|
||||
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: TtEndpoint - %p\n", TtEndpoint);
|
||||
|
||||
Tt = TtEndpoint->Tt;
|
||||
HcExtension = Tt->HcExtension;
|
||||
|
||||
TtEndpoint->Nums.NumStarts = 0;
|
||||
TtEndpoint->Nums.NumCompletes = 0;
|
||||
|
||||
TtEndpoint->StartFrame = 0;
|
||||
TtEndpoint->StartMicroframe = 0;
|
||||
|
||||
if (TtEndpoint->CalcBusTime)
|
||||
{
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: TtEndpoint already allocated!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Speed = TtEndpoint->TtEndpointParams.DeviceSpeed;
|
||||
|
||||
if (Speed == UsbHighSpeed)
|
||||
{
|
||||
if (TtEndpoint->Period > USB2_MAX_MICROFRAMES)
|
||||
TtEndpoint->ActualPeriod = USB2_MAX_MICROFRAMES;
|
||||
else
|
||||
TtEndpoint->ActualPeriod = TtEndpoint->Period;
|
||||
|
||||
MinTimeUsed = HcExtension->TimeUsed[0][0];
|
||||
|
||||
for (ix = 1; ix < TtEndpoint->ActualPeriod; ix++)
|
||||
{
|
||||
frame = ix / USB2_MICROFRAMES;
|
||||
uframe = ix % (USB2_MICROFRAMES - 1);
|
||||
|
||||
TimeUsed = HcExtension->TimeUsed[frame][uframe];
|
||||
|
||||
if (TimeUsed < MinTimeUsed)
|
||||
{
|
||||
MinTimeUsed = TimeUsed;
|
||||
TtEndpoint->StartFrame = frame;
|
||||
TtEndpoint->StartMicroframe = uframe;
|
||||
}
|
||||
}
|
||||
|
||||
TtEndpoint->CalcBusTime = USB2_GetOverhead(TtEndpoint) +
|
||||
USB2_AddDataBitStuff(TtEndpoint->MaxPacketSize);
|
||||
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: StartFrame - %X, StartMicroframe - %X, CalcBusTime - %X\n",
|
||||
TtEndpoint->StartFrame,
|
||||
TtEndpoint->StartMicroframe,
|
||||
TtEndpoint->CalcBusTime);
|
||||
|
||||
Microframe = TtEndpoint->StartFrame * USB2_MICROFRAMES +
|
||||
TtEndpoint->StartMicroframe;
|
||||
|
||||
if (Microframe >= USB2_MAX_MICROFRAMES)
|
||||
{
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: Microframe >= 256. Result - TRUE\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
for (ix = Microframe;
|
||||
ix < USB2_MAX_MICROFRAMES;
|
||||
ix += TtEndpoint->ActualPeriod)
|
||||
{
|
||||
frame = ix / USB2_MICROFRAMES;
|
||||
uframe = ix % (USB2_MICROFRAMES - 1);
|
||||
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: frame - %X, uframe - %X, TimeUsed[f][uf] - %X\n",
|
||||
frame,
|
||||
uframe,
|
||||
HcExtension->TimeUsed[frame][uframe]);
|
||||
|
||||
if (!USB2_AllocateCheck(&HcExtension->TimeUsed[frame][uframe],
|
||||
TtEndpoint->CalcBusTime,
|
||||
USB2_MAX_MICROFRAME_ALLOCATION))
|
||||
{
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: Result = FALSE\n");
|
||||
Result = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Result)
|
||||
{
|
||||
for (ix = Microframe;
|
||||
ix < USB2_MAX_MICROFRAMES;
|
||||
ix += TtEndpoint->ActualPeriod)
|
||||
{
|
||||
frame = ix / USB2_MICROFRAMES;
|
||||
uframe = ix % (USB2_MICROFRAMES - 1);
|
||||
|
||||
HcExtension->TimeUsed[frame][uframe] -= TtEndpoint->CalcBusTime;
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: Result - TRUE\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Speed != UsbHighSpeed (FS/LS) */
|
||||
|
||||
if (TtEndpoint->Period > USB2_FRAMES)
|
||||
TtEndpoint->ActualPeriod = USB2_FRAMES;
|
||||
else
|
||||
TtEndpoint->ActualPeriod = TtEndpoint->Period;
|
||||
|
||||
MinTimeUsed = Tt->FrameBudget[0].TimeUsed;
|
||||
|
||||
for (ix = 1; ix < TtEndpoint->ActualPeriod; ix++)
|
||||
{
|
||||
if ((Tt->FrameBudget[ix].TimeUsed) < MinTimeUsed)
|
||||
{
|
||||
MinTimeUsed = Tt->FrameBudget[ix].TimeUsed;
|
||||
TtEndpoint->StartFrame = ix;
|
||||
}
|
||||
}
|
||||
|
||||
TransferType = TtEndpoint->TtEndpointParams.TransferType;
|
||||
|
||||
if (TransferType == USBPORT_TRANSFER_TYPE_ISOCHRONOUS)
|
||||
{
|
||||
if (Speed == UsbFullSpeed)
|
||||
{
|
||||
Overhead = USB2_FS_ISOCHRONOUS_OVERHEAD + Tt->DelayTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: ISO can not be on a LS bus!\n");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Speed == UsbFullSpeed)
|
||||
Overhead = USB2_FS_INTERRUPT_OVERHEAD + Tt->DelayTime;
|
||||
else
|
||||
Overhead = USB2_LS_INTERRUPT_OVERHEAD + Tt->DelayTime;
|
||||
}
|
||||
|
||||
if (Speed == UsbLowSpeed)
|
||||
{
|
||||
TtEndpoint->CalcBusTime = TtEndpoint->MaxPacketSize * 8 + Overhead;
|
||||
}
|
||||
else
|
||||
{
|
||||
TtEndpoint->CalcBusTime = TtEndpoint->MaxPacketSize + Overhead;
|
||||
}
|
||||
|
||||
|
||||
DPRINT("USB2_AllocateTimeForEndpoint: UNIMPLEMENTED. FIXME\n");
|
||||
ASSERT(FALSE);
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in a new issue