[USBPORT] Add USBPORT_UpdateAllocatedBwTt().
[reactos.git] / drivers / usb / usbport / usb2.c
1 /*
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>
6 */
7
8 #include "usbport.h"
9
10 //#define NDEBUG
11 #include <debug.h>
12
13 VOID
14 NTAPI
15 USB2_InitTtEndpoint(IN PUSB2_TT_ENDPOINT TtEndpoint,
16 IN UCHAR TransferType,
17 IN UCHAR Direction,
18 IN UCHAR DeviceSpeed,
19 IN USHORT Period,
20 IN USHORT MaxPacketSize,
21 IN PUSB2_TT Tt)
22 {
23 RtlZeroMemory(TtEndpoint, sizeof(USB2_TT_ENDPOINT));
24
25 TtEndpoint->TtEndpointParams.TransferType = TransferType;
26 TtEndpoint->TtEndpointParams.Direction = Direction;
27 TtEndpoint->TtEndpointParams.DeviceSpeed = DeviceSpeed;
28
29 TtEndpoint->Period = Period;
30 TtEndpoint->MaxPacketSize = MaxPacketSize;
31 TtEndpoint->Tt = Tt;
32 }
33
34 VOID
35 NTAPI
36 USBPORT_UpdateAllocatedBwTt(IN PUSB2_TT_EXTENSION TtExtension)
37 {
38 ULONG BusBandwidth;
39 ULONG NewBusBandwidth;
40 ULONG MaxBusBandwidth = 0;
41 ULONG MinBusBandwidth;
42 ULONG ix;
43
44 DPRINT("USBPORT_UpdateAllocatedBwTt: TtExtension - %p\n", TtExtension);
45
46 BusBandwidth = TtExtension->BusBandwidth;
47 MinBusBandwidth = BusBandwidth;
48
49 for (ix = 0; ix < USB2_FRAMES; ix++)
50 {
51 NewBusBandwidth = BusBandwidth - TtExtension->Bandwidth[ix];
52
53 if (NewBusBandwidth > MaxBusBandwidth)
54 MaxBusBandwidth = NewBusBandwidth;
55
56 if (NewBusBandwidth < MinBusBandwidth)
57 MinBusBandwidth = NewBusBandwidth;
58 }
59
60 TtExtension->MaxBandwidth = MaxBusBandwidth;
61
62 if (MinBusBandwidth == BusBandwidth)
63 TtExtension->MinBandwidth = 0;
64 else
65 TtExtension->MinBandwidth = MinBusBandwidth;
66 }
67
68 BOOLEAN
69 NTAPI
70 USBPORT_AllocateBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice,
71 IN PUSBPORT_ENDPOINT Endpoint)
72 {
73 DPRINT1("USBPORT_AllocateBandwidthUSB2: UNIMPLEMENTED. FIXME. \n");
74 return TRUE;
75 }
76
77 VOID
78 NTAPI
79 USBPORT_FreeBandwidthUSB2(IN PDEVICE_OBJECT FdoDevice,
80 IN PUSBPORT_ENDPOINT Endpoint)
81 {
82 DPRINT1("USBPORT_FreeBandwidthUSB2: UNIMPLEMENTED. FIXME. \n");
83 }
84
85 VOID
86 NTAPI
87 USB2_InitTT(IN PUSB2_HC_EXTENSION HcExtension,
88 IN PUSB2_TT Tt)
89 {
90 ULONG ix;
91 ULONG jx;
92
93 DPRINT("USB2_InitTT: HcExtension - %p, Tt - %p\n", HcExtension, Tt);
94
95 Tt->HcExtension = HcExtension;
96 Tt->DelayTime = 1;
97 Tt->MaxTime = USB2_FS_MAX_PERIODIC_ALLOCATION;
98
99 for (ix = 0; ix < USB2_FRAMES; ix++)
100 {
101 Tt->FrameBudget[ix].TimeUsed = USB2_MAX_MICROFRAMES;
102 Tt->FrameBudget[ix].AltEndpoint = NULL;
103
104 for (jx = 0; jx < USB2_MICROFRAMES; jx++)
105 {
106 Tt->TimeCS[ix][jx] = 0;
107 Tt->NumStartSplits[ix][jx] = 0;
108 }
109
110 Tt->FrameBudget[ix].IsoEndpoint = &Tt->IsoEndpoint[ix];
111
112 USB2_InitTtEndpoint(&Tt->IsoEndpoint[ix],
113 USBPORT_TRANSFER_TYPE_ISOCHRONOUS,
114 USBPORT_TRANSFER_DIRECTION_OUT,
115 UsbFullSpeed,
116 USB2_FRAMES,
117 0,
118 Tt);
119
120 Tt->IsoEndpoint[ix].ActualPeriod = USB2_FRAMES;
121 Tt->IsoEndpoint[ix].CalcBusTime = USB2_FS_SOF_TIME + USB2_HUB_DELAY;
122 Tt->IsoEndpoint[ix].StartFrame = ix;
123 Tt->IsoEndpoint[ix].StartMicroframe = 0xFF;
124
125 Tt->FrameBudget[ix].IntEndpoint = &Tt->IntEndpoint[ix];
126
127 USB2_InitTtEndpoint(&Tt->IntEndpoint[ix],
128 USBPORT_TRANSFER_TYPE_INTERRUPT,
129 USBPORT_TRANSFER_DIRECTION_OUT,
130 UsbFullSpeed,
131 USB2_FRAMES,
132 0,
133 Tt);
134
135 Tt->IntEndpoint[ix].ActualPeriod = USB2_FRAMES;
136 Tt->IntEndpoint[ix].CalcBusTime = USB2_FS_SOF_TIME + USB2_HUB_DELAY;
137 Tt->IntEndpoint[ix].StartFrame = ix;
138 Tt->IntEndpoint[ix].StartMicroframe = 0xFF;
139 }
140 }
141
142 VOID
143 NTAPI
144 USB2_InitController(IN PUSB2_HC_EXTENSION HcExtension)
145 {
146 ULONG ix;
147 ULONG jx;
148
149 DPRINT("USB2_InitController: HcExtension - %p\n", HcExtension);
150
151 HcExtension->MaxHsBusAllocation = USB2_MAX_MICROFRAME_ALLOCATION;
152
153 for (ix = 0; ix < USB2_FRAMES; ix++)
154 {
155 for (jx = 0; jx < USB2_MICROFRAMES; jx++)
156 {
157 HcExtension->TimeUsed[ix][jx] = 0;
158 }
159 }
160
161 HcExtension->HcDelayTime = USB2_CONTROLLER_DELAY;
162
163 USB2_InitTT(HcExtension, &HcExtension->HcTt);
164 }