+#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;
+