https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7553e5419936d978b3f5ec3408feee067c48afb1
commit 7553e5419936d978b3f5ec3408feee067c48afb1 Author: Vadim Galyant <v...@rambler.ru> AuthorDate: Fri Dec 8 20:21:08 2017 +0900 Commit: Amine Khaldi <amine.kha...@reactos.org> CommitDate: Sun Jan 21 19:35:48 2018 +0100 [USBPORT] Start implementation USB2_AllocateTimeForEndpoint(). --- drivers/usb/usbport/usb2.c | 161 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/drivers/usb/usbport/usb2.c b/drivers/usb/usbport/usb2.c index 86e45a1adc..1811b541c0 100644 --- a/drivers/usb/usbport/usb2.c +++ b/drivers/usb/usbport/usb2.c @@ -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;