2 * PROJECT: ReactOS USB Port Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBPort USB 2.0 functions
5 * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
15 USB2_AllocateCheck(IN OUT PULONG OutTimeUsed
,
17 IN ULONG LimitAllocation
)
20 BOOLEAN Result
= TRUE
;
22 BusTime
= *OutTimeUsed
+ CalcBusTime
;
23 *OutTimeUsed
+= CalcBusTime
;
25 if (BusTime
> LimitAllocation
)
27 DPRINT("USB2_AllocateCheck: BusTime > LimitAllocation\n");
36 USB2_AddDataBitStuff(IN USHORT DataTime
)
38 return (DataTime
+ (DataTime
/ 16));
43 USB2_IncMicroFrame(OUT PUCHAR frame
,
48 if (*uframe
> (USB2_MICROFRAMES
- 1))
51 *frame
= (*frame
+ 1) & (USB2_FRAMES
- 1);
57 USB2_GetPrevMicroFrame(OUT PUCHAR frame
,
60 *uframe
= USB2_MICROFRAMES
- 1;
65 *frame
= USB2_FRAMES
- 1;
70 USB2_CheckTtEndpointInsert(IN PUSB2_TT_ENDPOINT nextTtEndpoint
,
71 IN PUSB2_TT_ENDPOINT TtEndpoint
)
75 DPRINT("USB2_CheckTtEndpointInsert: nextTtEndpoint - %p, TtEndpoint - %p\n",
81 if (TtEndpoint
->CalcBusTime
>= (USB2_FS_MAX_PERIODIC_ALLOCATION
/ 2))
83 DPRINT1("USB2_CheckTtEndpointInsert: Result - FALSE\n");
89 DPRINT("USB2_CheckTtEndpointInsert: Result - TRUE\n");
93 TransferType
= TtEndpoint
->TtEndpointParams
.TransferType
;
95 if (nextTtEndpoint
->ActualPeriod
< TtEndpoint
->ActualPeriod
&&
96 TransferType
== USBPORT_TRANSFER_TYPE_INTERRUPT
)
98 DPRINT("USB2_CheckTtEndpointInsert: Result - TRUE\n");
102 if ((nextTtEndpoint
->ActualPeriod
<= TtEndpoint
->ActualPeriod
&&
103 TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
) ||
104 nextTtEndpoint
== TtEndpoint
)
106 DPRINT("USB2_CheckTtEndpointInsert: Result - TRUE\n");
110 DPRINT("USB2_CheckTtEndpointInsert: Result - FALSE\n");
116 USB2_GetOverhead(IN PUSB2_TT_ENDPOINT TtEndpoint
)
124 TransferType
= TtEndpoint
->TtEndpointParams
.TransferType
;
125 Direction
= TtEndpoint
->TtEndpointParams
.Direction
;
126 DeviceSpeed
= TtEndpoint
->TtEndpointParams
.Direction
;
128 HostDelay
= TtEndpoint
->Tt
->HcExtension
->HcDelayTime
;
130 if (DeviceSpeed
== UsbHighSpeed
)
132 if (Direction
== USBPORT_TRANSFER_DIRECTION_OUT
)
134 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
135 Overhead
= HostDelay
+ USB2_HS_ISOCHRONOUS_OUT_OVERHEAD
;
137 Overhead
= HostDelay
+ USB2_HS_INTERRUPT_OUT_OVERHEAD
;
141 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
142 Overhead
= HostDelay
+ USB2_HS_ISOCHRONOUS_IN_OVERHEAD
;
144 Overhead
= HostDelay
+ USB2_HS_ISOCHRONOUS_OUT_OVERHEAD
;
147 else if (DeviceSpeed
== UsbFullSpeed
)
149 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
150 Overhead
= HostDelay
+ USB2_FS_ISOCHRONOUS_OVERHEAD
;
152 Overhead
= HostDelay
+ USB2_FS_INTERRUPT_OVERHEAD
;
156 Overhead
= HostDelay
+ USB2_LS_INTERRUPT_OVERHEAD
;
164 USB2_GetHsOverhead(IN PUSB2_TT_ENDPOINT TtEndpoint
,
165 IN PULONG OverheadSS
,
166 IN PULONG OverheadCS
)
172 TransferType
= TtEndpoint
->TtEndpointParams
.TransferType
;
173 Direction
= TtEndpoint
->TtEndpointParams
.Direction
;
175 HostDelay
= TtEndpoint
->Tt
->HcExtension
->HcDelayTime
;
177 if (Direction
== USBPORT_TRANSFER_DIRECTION_OUT
)
179 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
181 *OverheadSS
= HostDelay
+ USB2_HS_SS_ISOCHRONOUS_OUT_OVERHEAD
;
186 *OverheadSS
= HostDelay
+ USB2_HS_SS_INTERRUPT_OUT_OVERHEAD
;
187 *OverheadCS
= HostDelay
+ USB2_HS_CS_INTERRUPT_OUT_OVERHEAD
;
192 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
194 *OverheadSS
= HostDelay
+ USB2_HS_SS_ISOCHRONOUS_IN_OVERHEAD
;
195 *OverheadCS
= HostDelay
+ USB2_HS_CS_ISOCHRONOUS_IN_OVERHEAD
;
199 *OverheadSS
= HostDelay
+ USB2_HS_SS_INTERRUPT_IN_OVERHEAD
;
200 *OverheadCS
= HostDelay
+ USB2_HS_CS_INTERRUPT_IN_OVERHEAD
;
203 DPRINT("USB2_GetHsOverhead: *OverheadSS - %X, *OverheadCS - %X\n",
211 USB2_GetLastIsoTime(IN PUSB2_TT_ENDPOINT TtEndpoint
,
214 PUSB2_TT_ENDPOINT nextTtEndpoint
;
217 DPRINT("USB2_GetLastIsoTime: TtEndpoint - %p, Frame - %X\n",
221 nextTtEndpoint
= TtEndpoint
->Tt
->FrameBudget
[Frame
].IsoEndpoint
->NextTtEndpoint
;
223 if (nextTtEndpoint
||
224 (nextTtEndpoint
= TtEndpoint
->Tt
->FrameBudget
[Frame
].AltEndpoint
) != NULL
)
226 Result
= nextTtEndpoint
->StartTime
+ nextTtEndpoint
->CalcBusTime
;
230 Result
= USB2_FS_SOF_TIME
;
238 USB2_GetStartTime(IN PUSB2_TT_ENDPOINT nextTtEndpoint
,
239 IN PUSB2_TT_ENDPOINT TtEndpoint
,
240 IN PUSB2_TT_ENDPOINT prevTtEndpoint
,
243 PUSB2_TT_ENDPOINT ttEndpoint
;
246 DPRINT("USB2_GetStartTime: nextTtEndpoint - %p, TtEndpoint - %p, prevTtEndpoint - %p, Frame - %X\n",
252 TransferType
= TtEndpoint
->TtEndpointParams
.TransferType
;
254 if (nextTtEndpoint
&& TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
256 return nextTtEndpoint
->StartTime
+ nextTtEndpoint
->CalcBusTime
;
259 if (TransferType
== USBPORT_TRANSFER_TYPE_ISOCHRONOUS
)
261 ttEndpoint
= TtEndpoint
->Tt
->FrameBudget
[Frame
].AltEndpoint
;
264 return ttEndpoint
->StartTime
+ ttEndpoint
->CalcBusTime
;
266 return USB2_FS_SOF_TIME
;
270 ttEndpoint
= prevTtEndpoint
;
272 if (ttEndpoint
== TtEndpoint
->Tt
->FrameBudget
[Frame
].IntEndpoint
)
273 return USB2_GetLastIsoTime(TtEndpoint
, Frame
);
275 return ttEndpoint
->StartTime
+ ttEndpoint
->CalcBusTime
;
281 USB2_InitTtEndpoint(IN PUSB2_TT_ENDPOINT TtEndpoint
,
282 IN UCHAR TransferType
,
284 IN UCHAR DeviceSpeed
,
286 IN USHORT MaxPacketSize
,
289 RtlZeroMemory(TtEndpoint
, sizeof(USB2_TT_ENDPOINT
));
291 TtEndpoint
->TtEndpointParams
.TransferType
= TransferType
;
292 TtEndpoint
->TtEndpointParams
.Direction
= Direction
;
293 TtEndpoint
->TtEndpointParams
.DeviceSpeed
= DeviceSpeed
;
295 TtEndpoint
->Period
= Period
;
296 TtEndpoint
->MaxPacketSize
= MaxPacketSize
;
302 USB2_AllocateHS(IN PUSB2_TT_ENDPOINT TtEndpoint
,
305 PUSB2_HC_EXTENSION HcExtension
;
310 ULONG RemainDataTime
;
319 DPRINT("USB2_AllocateHS: TtEndpoint - %p, Frame - %X, TtEndpoint->StartFrame - %X\n",
322 TtEndpoint
->StartFrame
);
325 HcExtension
= Tt
->HcExtension
;
327 TransferType
= TtEndpoint
->TtEndpointParams
.TransferType
;
328 Direction
= TtEndpoint
->TtEndpointParams
.Direction
;
332 TtEndpoint
->StartMicroframe
=
333 TtEndpoint
->StartTime
/ USB2_FS_RAW_BYTES_IN_MICROFRAME
- 1;
335 DPRINT("USB2_AllocateHS: TtEndpoint->StartMicroframe - %X\n",
336 TtEndpoint
->StartMicroframe
);
339 USB2_GetHsOverhead(TtEndpoint
, &OverheadSS
, &OverheadCS
);
341 if (TransferType
== USBPORT_TRANSFER_TYPE_INTERRUPT
)
345 TtEndpoint
->Nums
.NumStarts
= 1;
347 if ((CHAR
)TtEndpoint
->StartMicroframe
< 5)
349 TtEndpoint
->Nums
.NumCompletes
= 3;
353 TtEndpoint
->Nums
.NumCompletes
= 2;
359 if (Direction
== USBPORT_TRANSFER_DIRECTION_OUT
)
361 DPRINT("USB2_AllocateHS: ISO UNIMPLEMENTED\n");
366 DPRINT("USB2_AllocateHS: ISO UNIMPLEMENTED\n");
371 frame
= TtEndpoint
->StartFrame
+ Frame
;
372 uframe
= TtEndpoint
->StartMicroframe
;
374 if (TtEndpoint
->StartMicroframe
== 0xFF)
375 USB2_GetPrevMicroFrame(&frame
, &uframe
);
377 for (ix
= 0; ix
< TtEndpoint
->Nums
.NumStarts
; ix
++)
379 if (!USB2_AllocateCheck(&HcExtension
->TimeUsed
[frame
][uframe
],
381 USB2_MAX_MICROFRAME_ALLOCATION
))
386 if (Tt
->NumStartSplits
[frame
][uframe
] > (USB2_MAX_FS_LS_TRANSACTIONS_IN_UFRAME
- 1))
388 DPRINT1("USB2_AllocateHS: Num Start Splits - %X\n",
389 Tt
->NumStartSplits
[frame
][uframe
] + 1);
395 ++Tt
->NumStartSplits
[frame
][uframe
];
396 USB2_IncMicroFrame(&frame
, &uframe
);
399 frame
= TtEndpoint
->StartFrame
+ Frame
;
400 uframe
= TtEndpoint
->StartMicroframe
+ TtEndpoint
->Nums
.NumStarts
+ 1;
402 for (ix
= 0; ix
< TtEndpoint
->Nums
.NumCompletes
; ix
++)
404 if (!USB2_AllocateCheck(&HcExtension
->TimeUsed
[frame
][uframe
],
406 USB2_MAX_MICROFRAME_ALLOCATION
))
411 USB2_IncMicroFrame(&frame
, &uframe
);
414 if (Direction
== USBPORT_TRANSFER_DIRECTION_OUT
)
416 DPRINT("USB2_AllocateHS: DIRECTION OUT UNIMPLEMENTED\n");
421 frame
= TtEndpoint
->StartFrame
+ Frame
;
422 uframe
= TtEndpoint
->StartMicroframe
+ TtEndpoint
->Nums
.NumStarts
+ 1;
424 for (ix
= 0; ix
< TtEndpoint
->Nums
.NumCompletes
; ix
++)
426 if (Tt
->TimeCS
[frame
][uframe
] < USB2_FS_RAW_BYTES_IN_MICROFRAME
)
428 if (Tt
->TimeCS
[frame
][uframe
] < USB2_FS_RAW_BYTES_IN_MICROFRAME
)
430 RemainDataTime
= USB2_FS_RAW_BYTES_IN_MICROFRAME
-
431 Tt
->TimeCS
[frame
][uframe
];
438 PktSize
= TtEndpoint
->MaxPacketSize
;
440 if (RemainDataTime
>= USB2_AddDataBitStuff(PktSize
))
442 DataTime
= USB2_AddDataBitStuff(PktSize
);
446 DataTime
= RemainDataTime
;
449 if (!USB2_AllocateCheck(&HcExtension
->TimeUsed
[frame
][uframe
],
451 USB2_MAX_MICROFRAME_ALLOCATION
))
457 PktSize
= TtEndpoint
->MaxPacketSize
;
459 if (USB2_AddDataBitStuff(PktSize
) < USB2_FS_RAW_BYTES_IN_MICROFRAME
)
461 Tt
->TimeCS
[frame
][uframe
] += USB2_AddDataBitStuff(PktSize
);
465 Tt
->TimeCS
[frame
][uframe
] += USB2_FS_RAW_BYTES_IN_MICROFRAME
;
468 USB2_IncMicroFrame(&frame
, &uframe
);
472 DPRINT("USB2_AllocateHS: Result - %X\n", Result
);
478 USB2_DeallocateEndpointBudget(IN PUSB2_TT_ENDPOINT TtEndpoint
,
479 IN PUSB2_REBALANCE Rebalance
,
480 IN PULONG RebalanceListEntries
,
483 DPRINT("USB2_DeallocateEndpointBudget: UNIMPLEMENTED FIXME\n");
490 USB2_AllocateTimeForEndpoint(IN PUSB2_TT_ENDPOINT TtEndpoint
,
491 IN PUSB2_REBALANCE Rebalance
,
492 IN PULONG RebalanceListEntries
)
494 DPRINT("USB2_AllocateTimeForEndpoint: UNIMPLEMENTED. FIXME\n");
501 USB2_PromotePeriods(IN PUSB2_TT_ENDPOINT TtEndpoint
,
502 IN PUSB2_REBALANCE Rebalance
,
503 IN PULONG RebalanceListEntries
)
505 DPRINT1("USB2_PromotePeriods: UNIMPLEMENTED. FIXME\n");
512 USBPORT_UpdateAllocatedBwTt(IN PUSB2_TT_EXTENSION TtExtension
)
515 ULONG NewBusBandwidth
;
516 ULONG MaxBusBandwidth
= 0;
517 ULONG MinBusBandwidth
;
520 DPRINT("USBPORT_UpdateAllocatedBwTt: TtExtension - %p\n", TtExtension
);
522 BusBandwidth
= TtExtension
->BusBandwidth
;
523 MinBusBandwidth
= BusBandwidth
;
525 for (ix
= 0; ix
< USB2_FRAMES
; ix
++)
527 NewBusBandwidth
= BusBandwidth
- TtExtension
->Bandwidth
[ix
];
529 if (NewBusBandwidth
> MaxBusBandwidth
)
530 MaxBusBandwidth
= NewBusBandwidth
;
532 if (NewBusBandwidth
< MinBusBandwidth
)
533 MinBusBandwidth
= NewBusBandwidth
;
536 TtExtension
->MaxBandwidth
= MaxBusBandwidth
;
538 if (MinBusBandwidth
== BusBandwidth
)
539 TtExtension
->MinBandwidth
= 0;
541 TtExtension
->MinBandwidth
= MinBusBandwidth
;
546 USBPORT_AllocateBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice
,
547 IN PUSBPORT_ENDPOINT Endpoint
)
549 PUSBPORT_DEVICE_EXTENSION FdoExtension
;
550 PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
551 PUSB2_TT_EXTENSION TtExtension
;
553 PUSB2_REBALANCE Rebalance
;
554 LIST_ENTRY RebalanceList
;
555 ULONG RebalanceListEntries
;
556 PUSB2_TT_ENDPOINT TtEndpoint
;
557 PUSB2_TT_ENDPOINT RebalanceTtEndpoint
;
559 USB_DEVICE_SPEED DeviceSpeed
;
561 ULONG AllocedBusTime
;
562 ULONG EndpointBandwidth
;
563 ULONG ScheduleOffset
;
573 DPRINT("USBPORT_AllocateBandwidthUSB2: FdoDevice - %p, Endpoint - %p\n",
577 EndpointProperties
= &Endpoint
->EndpointProperties
;
578 EndpointProperties
->ScheduleOffset
= 0;
580 if (Endpoint
->Flags
& ENDPOINT_FLAG_ROOTHUB_EP0
)
582 DPRINT("USBPORT_AllocateBandwidthUSB2: ENDPOINT_FLAG_ROOTHUB_EP0\n");
586 FdoExtension
= FdoDevice
->DeviceExtension
;
588 TransferType
= EndpointProperties
->TransferType
;
589 DPRINT("USBPORT_AllocateBandwidthUSB2: TransferType - %X\n", TransferType
);
591 if (TransferType
== USBPORT_TRANSFER_TYPE_CONTROL
||
592 TransferType
== USBPORT_TRANSFER_TYPE_BULK
)
597 if (Endpoint
->TtExtension
)
598 TtExtension
= Endpoint
->TtExtension
;
602 InitializeListHead(&RebalanceList
);
604 Rebalance
= ExAllocatePoolWithTag(NonPagedPool
,
605 sizeof(USB2_REBALANCE
),
608 DPRINT("USBPORT_AllocateBandwidthUSB2: Rebalance - %p, TtExtension - %p\n",
614 RtlZeroMemory(Rebalance
, sizeof(USB2_REBALANCE
));
616 TtEndpoint
= Endpoint
->TtEndpoint
;
617 TtEndpoint
->Endpoint
= Endpoint
;
619 Direction
= EndpointProperties
->Direction
== USBPORT_TRANSFER_DIRECTION_OUT
;
620 DeviceSpeed
= EndpointProperties
->DeviceSpeed
;
627 Tt
= &TtExtension
->Tt
;
629 Period
= USB2_FRAMES
;
631 while (Period
> 0 && Period
> EndpointProperties
->Period
)
636 DPRINT("USBPORT_AllocateBandwidthUSB2: Period - %X\n", Period
);
642 Tt
= &FdoExtension
->Usb2Extension
->HcTt
;
644 if (EndpointProperties
->Period
> USB2_MAX_MICROFRAMES
)
645 Period
= USB2_MAX_MICROFRAMES
;
647 Period
= EndpointProperties
->Period
;
654 DPRINT1("USBPORT_AllocateBandwidthUSB2: DeviceSpeed - %X!\n",
659 Tt
= &TtExtension
->Tt
;
664 USB2_InitTtEndpoint(TtEndpoint
,
669 EndpointProperties
->MaxPacketSize
,
672 RebalanceListEntries
= USB2_FRAMES
- 2;
674 Result
= USB2_AllocateTimeForEndpoint(TtEndpoint
,
676 &RebalanceListEntries
);
680 Result
= USB2_PromotePeriods(TtEndpoint
,
682 &RebalanceListEntries
);
685 RebalanceListEntries
= 0;
687 for (ix
= 0; Rebalance
->RebalanceEndpoint
[ix
]; ix
++)
689 RebalanceListEntries
= ix
+ 1;
694 RebalanceListEntries
= 0;
698 DPRINT("USBPORT_AllocateBandwidthUSB2: RebalanceListEntries - %X, Result - %X\n",
699 RebalanceListEntries
,
702 for (ix
= 0; ix
< RebalanceListEntries
; ix
++)
704 RebalanceTtEndpoint
= Rebalance
->RebalanceEndpoint
[ix
];
706 DPRINT("USBPORT_AllocateBandwidthUSB2: RebalanceTtEndpoint[%X] - %p, RebalanceTtEndpoint - %p, RebalanceLink - %p\n",
709 &RebalanceTtEndpoint
->Endpoint
->RebalanceLink
);
711 InsertTailList(&RebalanceList
,
712 &RebalanceTtEndpoint
->Endpoint
->RebalanceLink
);
716 ExFreePoolWithTag(Rebalance
, USB_PORT_TAG
);
720 SMask
= USB2_GetSMASK(Endpoint
->TtEndpoint
);
721 EndpointProperties
->InterruptScheduleMask
= SMask
;
723 CMask
= USB2_GetCMASK(Endpoint
->TtEndpoint
);
724 EndpointProperties
->SplitCompletionMask
= CMask
;
726 AllocedBusTime
= TtEndpoint
->CalcBusTime
;
728 EndpointBandwidth
= USB2_MICROFRAMES
* AllocedBusTime
;
729 EndpointProperties
->UsbBandwidth
= EndpointBandwidth
;
731 ActualPeriod
= Endpoint
->TtEndpoint
->ActualPeriod
;
732 EndpointProperties
->Period
= ActualPeriod
;
734 ScheduleOffset
= Endpoint
->TtEndpoint
->StartFrame
;
735 EndpointProperties
->ScheduleOffset
= ScheduleOffset
;
737 Factor
= USB2_FRAMES
/ ActualPeriod
;
740 n
= ScheduleOffset
* Factor
;
744 for (ix
= 0; ix
< Factor
; ix
++)
746 TtExtension
->Bandwidth
[n
+ ix
] -= EndpointBandwidth
;
751 for (ix
= 1; ix
< Factor
; ix
++)
753 FdoExtension
->Bandwidth
[n
+ ix
] -= EndpointBandwidth
;
757 USBPORT_DumpingEndpointProperties(EndpointProperties
);
758 USBPORT_DumpingTtEndpoint(Endpoint
->TtEndpoint
);
760 if (AllocedBusTime
>= (USB2_FS_MAX_PERIODIC_ALLOCATION
/ 2))
762 DPRINT1("USBPORT_AllocateBandwidthUSB2: AllocedBusTime >= 0.5 * MAX_ALLOCATION \n");
766 //USB2_Rebalance(FdoDevice, &RebalanceList);
770 DPRINT("USBPORT_AllocateBandwidthUSB2: Result - %X\n", Result
);
774 for (ix
= 0; ix
< USB2_FRAMES
; ix
++)
776 FdoExtension
->Bandwidth
[ix
] += TtExtension
->MaxBandwidth
;
779 USBPORT_UpdateAllocatedBwTt(TtExtension
);
781 for (ix
= 0; ix
< USB2_FRAMES
; ix
++)
783 FdoExtension
->Bandwidth
[ix
] -= TtExtension
->MaxBandwidth
;
786 DPRINT("USBPORT_AllocateBandwidthUSB2: Result - %X\n", Result
);
793 USBPORT_FreeBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice
,
794 IN PUSBPORT_ENDPOINT Endpoint
)
796 DPRINT1("USBPORT_FreeBandwidthUSB2: UNIMPLEMENTED. FIXME. \n");
801 USB2_InitTT(IN PUSB2_HC_EXTENSION HcExtension
,
807 DPRINT("USB2_InitTT: HcExtension - %p, Tt - %p\n", HcExtension
, Tt
);
809 Tt
->HcExtension
= HcExtension
;
811 Tt
->MaxTime
= USB2_FS_MAX_PERIODIC_ALLOCATION
;
813 for (ix
= 0; ix
< USB2_FRAMES
; ix
++)
815 Tt
->FrameBudget
[ix
].TimeUsed
= USB2_MAX_MICROFRAMES
;
816 Tt
->FrameBudget
[ix
].AltEndpoint
= NULL
;
818 for (jx
= 0; jx
< USB2_MICROFRAMES
; jx
++)
820 Tt
->TimeCS
[ix
][jx
] = 0;
821 Tt
->NumStartSplits
[ix
][jx
] = 0;
824 Tt
->FrameBudget
[ix
].IsoEndpoint
= &Tt
->IsoEndpoint
[ix
];
826 USB2_InitTtEndpoint(&Tt
->IsoEndpoint
[ix
],
827 USBPORT_TRANSFER_TYPE_ISOCHRONOUS
,
828 USBPORT_TRANSFER_DIRECTION_OUT
,
834 Tt
->IsoEndpoint
[ix
].ActualPeriod
= USB2_FRAMES
;
835 Tt
->IsoEndpoint
[ix
].CalcBusTime
= USB2_FS_SOF_TIME
+ USB2_HUB_DELAY
;
836 Tt
->IsoEndpoint
[ix
].StartFrame
= ix
;
837 Tt
->IsoEndpoint
[ix
].StartMicroframe
= 0xFF;
839 Tt
->FrameBudget
[ix
].IntEndpoint
= &Tt
->IntEndpoint
[ix
];
841 USB2_InitTtEndpoint(&Tt
->IntEndpoint
[ix
],
842 USBPORT_TRANSFER_TYPE_INTERRUPT
,
843 USBPORT_TRANSFER_DIRECTION_OUT
,
849 Tt
->IntEndpoint
[ix
].ActualPeriod
= USB2_FRAMES
;
850 Tt
->IntEndpoint
[ix
].CalcBusTime
= USB2_FS_SOF_TIME
+ USB2_HUB_DELAY
;
851 Tt
->IntEndpoint
[ix
].StartFrame
= ix
;
852 Tt
->IntEndpoint
[ix
].StartMicroframe
= 0xFF;
858 USB2_InitController(IN PUSB2_HC_EXTENSION HcExtension
)
863 DPRINT("USB2_InitController: HcExtension - %p\n", HcExtension
);
865 HcExtension
->MaxHsBusAllocation
= USB2_MAX_MICROFRAME_ALLOCATION
;
867 for (ix
= 0; ix
< USB2_FRAMES
; ix
++)
869 for (jx
= 0; jx
< USB2_MICROFRAMES
; jx
++)
871 HcExtension
->TimeUsed
[ix
][jx
] = 0;
875 HcExtension
->HcDelayTime
= USB2_CONTROLLER_DELAY
;
877 USB2_InitTT(HcExtension
, &HcExtension
->HcTt
);