281b6c856d342ca955a4778ae9dec8ed38bb04ce
[reactos.git] / drivers / usb / usbohci_new / usbohci.h
1 #ifndef USBOHCI_H__
2 #define USBOHCI_H__
3
4 #include <ntddk.h>
5 #include <windef.h>
6 #include <stdio.h>
7 #include <hubbusif.h>
8 #include <usbbusif.h>
9 #include <usbdlib.h>
10 #include <drivers/usbport/usbmport.h>
11 #include "hardware.h"
12
13 extern USBPORT_REGISTRATION_PACKET RegPacket;
14
15 #define OHCI_HCD_ED_FLAG_CONTROL 0x00000001
16 #define OHCI_HCD_ED_FLAG_RESET_ON_HALT 0x00000008
17 #define OHCI_HCD_ED_FLAG_NOT_ACCESSED 0x00000010
18
19 #define OHCI_HCD_TD_FLAG_ALLOCATED 0x00000001
20 #define OHCI_HCD_TD_FLAG_PROCESSED 0x00000002
21 #define OHCI_HCD_TD_FLAG_CONTROL_STATUS 0x00000004
22 #define OHCI_HCD_TD_FLAG_DONE 0x00000008
23 #define OHCI_HCD_TD_FLAG_NOT_ACCESSED 0x00000010
24
25 #define OHCI_MAX_ISO_TRANSFER_SIZE 0x10000
26 #define OHCI_MAX_CONTROL_TRANSFER_SIZE 0x10000
27 #define OHCI_MAX_BULK_TRANSFER_SIZE 0x40000
28 #define OHCI_MAX_INTERRUPT_TRANSFER_SIZE 0x1000
29
30 #define OHCI_MAX_ISO_TD_COUNT 64
31 #define OHCI_MAX_CONTROL_TD_COUNT 38
32 #define OHCI_MAX_BULK_TD_COUNT 68
33 #define OHCI_MAX_INTERRUPT_TD_COUNT 4
34
35 #define OHCI_NON_DATA_CONTROL_TDS 2
36
37 #define OHCI_TRANSFER_FLAGS_SHORT_TRANSFER_OK 1
38
39 typedef struct _OHCI_TRANSFER *POHCI_TRANSFER;
40
41 typedef union _OHCI_HW_TRANSFER_DESCRIPTOR {
42 struct {
43 OHCI_TRANSFER_DESCRIPTOR gTD; // must be aligned to a 16-byte boundary
44 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket;
45 ULONG Padded[2];
46 };
47 struct {
48 OHCI_ISO_TRANSFER_DESCRIPTOR iTD; // must be aligned to a 32-byte boundary
49 };
50 } OHCI_HW_TRANSFER_DESCRIPTOR, *POHCI_HW_TRANSFER_DESCRIPTOR;
51
52 C_ASSERT(sizeof(OHCI_HW_TRANSFER_DESCRIPTOR) == 32);
53
54 typedef struct _OHCI_HCD_TD {
55 /* Hardware part */
56 OHCI_HW_TRANSFER_DESCRIPTOR HwTD; // must be aligned to a 32-byte boundary
57 /* Software part */
58 ULONG PhysicalAddress;
59 ULONG Flags;
60 ULONG OhciTransfer;
61 ULONG NextHcdTD;
62 ULONG TransferLen;
63 LIST_ENTRY DoneLink;
64 ULONG Pad[1];
65 } OHCI_HCD_TD, *POHCI_HCD_TD;
66
67 C_ASSERT(sizeof(OHCI_HCD_TD) == 64);
68
69 typedef struct _OHCI_HCD_ED {
70 /* Hardware part */
71 OHCI_ENDPOINT_DESCRIPTOR HwED; // must be aligned to a 16-byte boundary
72 /* Software part */
73 ULONG PhysicalAddress;
74 ULONG Flags;
75 LIST_ENTRY HcdEDLink;
76 ULONG Pad[8];
77 } OHCI_HCD_ED, *POHCI_HCD_ED;
78
79 C_ASSERT(sizeof(OHCI_HCD_ED) == 64);
80
81 #define OHCI_STATIC_ED_TYPE_INTERRUPT 0
82 #define OHCI_STATIC_ED_TYPE_CONTROL 1
83 #define OHCI_STATIC_ED_TYPE_BULK 2
84
85 typedef struct _OHCI_STATIC_ED {
86 /* Software only */
87 POHCI_ENDPOINT_DESCRIPTOR HwED;
88 ULONG PhysicalAddress;
89 UCHAR HeadIndex;
90 UCHAR Reserved[3];
91 LIST_ENTRY Link;
92 ULONG Type;
93 PULONG pNextED;
94 ULONG HccaIndex;
95 } OHCI_STATIC_ED, *POHCI_STATIC_ED;
96
97 typedef struct _OHCI_HC_RESOURCES {
98 OHCI_HCCA HcHCCA; // (256 byte align)
99 OHCI_ENDPOINT_DESCRIPTOR InterrruptHeadED[63]; // (16 byte align)
100 OHCI_ENDPOINT_DESCRIPTOR ControlHeadED; // (16 byte align)
101 OHCI_ENDPOINT_DESCRIPTOR BulkHeadED; // (16 byte align)
102 } OHCI_HC_RESOURCES, *POHCI_HC_RESOURCES;
103
104 /* OHCI Endpoint follows USBPORT Endpoint */
105 typedef struct _OHCI_ENDPOINT {
106 ULONG Reserved;
107 USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
108 POHCI_STATIC_ED HeadED;
109 POHCI_HCD_TD FirstTD;
110 POHCI_HCD_ED HcdED;
111 ULONG MaxTransferDescriptors;
112 POHCI_HCD_TD HcdHeadP;
113 POHCI_HCD_TD HcdTailP;
114 LIST_ENTRY TDList;
115 } OHCI_ENDPOINT, *POHCI_ENDPOINT;
116
117 /* OHCI Transfer follows USBPORT Transfer */
118 typedef struct _OHCI_TRANSFER {
119 ULONG Reserved;
120 ULONG TransferLen;
121 PUSBPORT_TRANSFER_PARAMETERS TransferParameters;
122 ULONG PendingTDs;
123 ULONG Flags;
124 USBD_STATUS USBDStatus;
125 POHCI_ENDPOINT OhciEndpoint;
126 POHCI_HCD_TD NextTD;
127 POHCI_HCD_TD ControlStatusTD;
128 } OHCI_TRANSFER, *POHCI_TRANSFER;
129
130 /* OHCI Extension follows USBPORT Extension */
131 typedef struct _OHCI_EXTENSION {
132 ULONG Reserved;
133 POHCI_OPERATIONAL_REGISTERS OperationalRegs;
134 OHCI_REG_FRAME_INTERVAL FrameInterval;
135 ULONG FrameHighPart;
136 ULONG HcdFmNumber;
137 POHCI_HC_RESOURCES HcResourcesVA;
138 POHCI_HC_RESOURCES HcResourcesPA;
139 OHCI_STATIC_ED IntStaticED[63];
140 OHCI_STATIC_ED ControlStaticED;
141 OHCI_STATIC_ED BulkStaticED;
142 } OHCI_EXTENSION, *POHCI_EXTENSION;
143
144 /* roothub.c */
145 VOID
146 NTAPI
147 OHCI_RH_GetRootHubData(
148 IN PVOID ohciExtension,
149 IN PVOID rootHubData);
150
151 MPSTATUS
152 NTAPI
153 OHCI_RH_GetStatus(
154 IN PVOID ohciExtension,
155 IN PUSHORT Status);
156
157 MPSTATUS
158 NTAPI
159 OHCI_RH_GetPortStatus(
160 IN PVOID ohciExtension,
161 IN USHORT Port,
162 IN PUSB_PORT_STATUS_AND_CHANGE PortStatus);
163
164 MPSTATUS
165 NTAPI
166 OHCI_RH_GetHubStatus(
167 IN PVOID ohciExtension,
168 IN PUSB_HUB_STATUS_AND_CHANGE HubStatus);
169
170 MPSTATUS
171 NTAPI
172 OHCI_RH_SetFeaturePortReset(
173 IN PVOID ohciExtension,
174 IN USHORT Port);
175
176 MPSTATUS
177 NTAPI
178 OHCI_RH_SetFeaturePortPower(
179 IN PVOID ohciExtension,
180 IN USHORT Port);
181
182 MPSTATUS
183 NTAPI
184 OHCI_RH_SetFeaturePortEnable(
185 IN PVOID ohciExtension,
186 IN USHORT Port);
187
188 MPSTATUS
189 NTAPI
190 OHCI_RH_SetFeaturePortSuspend(
191 IN PVOID ohciExtension,
192 IN USHORT Port);
193
194 MPSTATUS
195 NTAPI
196 OHCI_RH_ClearFeaturePortEnable(
197 IN PVOID ohciExtension,
198 IN USHORT Port);
199
200 MPSTATUS
201 NTAPI
202 OHCI_RH_ClearFeaturePortPower(
203 IN PVOID ohciExtension,
204 IN USHORT Port);
205
206 MPSTATUS
207 NTAPI
208 OHCI_RH_ClearFeaturePortSuspend(
209 IN PVOID ohciExtension,
210 IN USHORT Port);
211
212 MPSTATUS
213 NTAPI
214 OHCI_RH_ClearFeaturePortEnableChange(
215 IN PVOID ohciExtension,
216 IN USHORT Port);
217
218 MPSTATUS
219 NTAPI
220 OHCI_RH_ClearFeaturePortConnectChange(
221 IN PVOID ohciExtension,
222 IN USHORT Port);
223
224 MPSTATUS
225 NTAPI
226 OHCI_RH_ClearFeaturePortResetChange(
227 IN PVOID ohciExtension,
228 IN USHORT Port);
229
230 MPSTATUS
231 NTAPI
232 OHCI_RH_ClearFeaturePortSuspendChange(
233 IN PVOID ohciExtension,
234 IN USHORT Port);
235
236 MPSTATUS
237 NTAPI
238 OHCI_RH_ClearFeaturePortOvercurrentChange(
239 IN PVOID ohciExtension,
240 IN USHORT Port);
241
242 VOID
243 NTAPI
244 OHCI_RH_DisableIrq(
245 IN PVOID ohciExtension);
246
247 VOID
248 NTAPI
249 OHCI_RH_EnableIrq(
250 IN PVOID ohciExtension);
251
252 OHCI_REG_RH_DESCRIPTORA
253 NTAPI
254 OHCI_ReadRhDescriptorA(
255 IN POHCI_EXTENSION OhciExtension);
256
257 #endif /* USBOHCI_H__ */