[USBEHCI_NEW] Bring-in the USB EHCI miniport driver created by Vadim Galyant. (#301)
[reactos.git] / sdk / include / reactos / drivers / usbport / usbmport.h
1 #ifndef USBMPORT_H__
2 #define USBMPORT_H__
3
4 #define USBPORT_HCI_MN 0x10000001
5
6 /* Tranfer types */
7 #define USBPORT_TRANSFER_TYPE_ISOCHRONOUS 0
8 #define USBPORT_TRANSFER_TYPE_CONTROL 1
9 #define USBPORT_TRANSFER_TYPE_BULK 2
10 #define USBPORT_TRANSFER_TYPE_INTERRUPT 3
11
12 /* Endpoint states */
13 #define USBPORT_ENDPOINT_UNKNOWN 0
14 #define USBPORT_ENDPOINT_PAUSED 2
15 #define USBPORT_ENDPOINT_ACTIVE 3
16 #define USBPORT_ENDPOINT_REMOVE 4
17 #define USBPORT_ENDPOINT_CLOSED 5
18
19 /* Endpoint status */
20 #define USBPORT_ENDPOINT_RUN 0
21 #define USBPORT_ENDPOINT_HALT 1
22 #define USBPORT_ENDPOINT_CONTROL 4
23
24 /* Interrupt Endpoint Poll Interval */
25 #define ENDPOINT_INTERRUPT_1ms 1
26 #define ENDPOINT_INTERRUPT_2ms 2
27 #define ENDPOINT_INTERRUPT_4ms 4
28 #define ENDPOINT_INTERRUPT_8ms 8
29 #define ENDPOINT_INTERRUPT_16ms 16
30 #define ENDPOINT_INTERRUPT_32ms 32
31
32 #define INTERRUPT_ENDPOINTs (ENDPOINT_INTERRUPT_32ms + \
33 ENDPOINT_INTERRUPT_16ms + \
34 ENDPOINT_INTERRUPT_8ms + \
35 ENDPOINT_INTERRUPT_4ms + \
36 ENDPOINT_INTERRUPT_2ms + \
37 ENDPOINT_INTERRUPT_1ms)
38
39 /* Types of resources. For USBPORT_RESOURCES::ResourcesTypes */
40 #define USBPORT_RESOURCES_PORT 1
41 #define USBPORT_RESOURCES_INTERRUPT 2
42 #define USBPORT_RESOURCES_MEMORY 4
43
44 typedef struct _USBPORT_RESOURCES {
45 ULONG ResourcesTypes;
46 USB_CONTROLLER_FLAVOR HcFlavor;
47 ULONG InterruptVector;
48 KIRQL InterruptLevel;
49 UCHAR Padded1[3];
50 KAFFINITY InterruptAffinity;
51 BOOLEAN ShareVector;
52 UCHAR Padded2[3];
53 KINTERRUPT_MODE InterruptMode;
54 ULONG_PTR Reserved;
55 PVOID ResourceBase;
56 ULONG IoSpaceLength;
57 ULONG_PTR StartVA;
58 ULONG StartPA;
59 UCHAR LegacySupport;
60 BOOLEAN IsChirpHandled;
61 UCHAR Reserved2;
62 UCHAR Reserved3;
63 } USBPORT_RESOURCES, *PUSBPORT_RESOURCES;
64
65 C_ASSERT(sizeof(USBPORT_RESOURCES) == 32 + 5 * sizeof(PVOID));
66
67 typedef struct _USBPORT_ENDPOINT_PROPERTIES {
68 USHORT DeviceAddress;
69 USHORT EndpointAddress;
70 USHORT TotalMaxPacketSize; // TransactionPerMicroframe * MaxPacketSize
71 UCHAR Period;
72 UCHAR Reserved1;
73 USB_DEVICE_SPEED DeviceSpeed;
74 ULONG UsbBandwidth;
75 ULONG ScheduleOffset;
76 ULONG TransferType;
77 ULONG Direction;
78 ULONG_PTR BufferVA;
79 ULONG BufferPA;
80 ULONG BufferLength;
81 ULONG Reserved3;
82 ULONG MaxTransferSize;
83 USHORT HubAddr;
84 USHORT PortNumber;
85 UCHAR InterruptScheduleMask;
86 UCHAR SplitCompletionMask;
87 UCHAR TransactionPerMicroframe; // 1 + additional transactions. Total: from 1 to 3)
88 UCHAR Reserved4;
89 ULONG MaxPacketSize;
90 ULONG Reserved6;
91 } USBPORT_ENDPOINT_PROPERTIES, *PUSBPORT_ENDPOINT_PROPERTIES;
92
93 C_ASSERT(sizeof(USBPORT_ENDPOINT_PROPERTIES) == 56 + 2 * sizeof(PVOID));
94
95 typedef struct _USBPORT_TRANSFER_PARAMETERS {
96 ULONG TransferFlags;
97 ULONG TransferBufferLength;
98 ULONG TransferCounter;
99 BOOL IsTransferSplited;
100 ULONG Reserved2;
101 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket;
102 } USBPORT_TRANSFER_PARAMETERS, *PUSBPORT_TRANSFER_PARAMETERS;
103
104 C_ASSERT(sizeof(USBPORT_TRANSFER_PARAMETERS) == 28);
105
106 typedef struct _USBPORT_SCATTER_GATHER_ELEMENT {
107 PHYSICAL_ADDRESS SgPhysicalAddress;
108 ULONG Reserved1;
109 ULONG SgTransferLength;
110 ULONG SgOffset;
111 ULONG Reserved2;
112 } USBPORT_SCATTER_GATHER_ELEMENT, *PUSBPORT_SCATTER_GATHER_ELEMENT;
113
114 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_ELEMENT) == 24);
115
116 typedef struct _USBPORT_SCATTER_GATHER_LIST {
117 ULONG Flags;
118 ULONG_PTR CurrentVa;
119 PVOID MappedSystemVa;
120 ULONG SgElementCount;
121 USBPORT_SCATTER_GATHER_ELEMENT SgElement[2];
122 } USBPORT_SCATTER_GATHER_LIST, *PUSBPORT_SCATTER_GATHER_LIST;
123
124 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_LIST) == 48 + 4 * sizeof(PVOID));
125
126 typedef struct _USBPORT_ENDPOINT_REQUIREMENTS {
127 ULONG HeaderBufferSize;
128 ULONG MaxTransferSize;
129 } USBPORT_ENDPOINT_REQUIREMENTS, *PUSBPORT_ENDPOINT_REQUIREMENTS;
130
131 typedef ULONG MPSTATUS; // Miniport status
132 typedef ULONG RHSTATUS; // Roothub status
133
134 #define MP_STATUS_SUCCESS 0
135 #define MP_STATUS_FAILURE 1
136 #define MP_STATUS_NO_RESOURCES 2
137 #define MP_STATUS_NO_BANDWIDTH 3
138 #define MP_STATUS_ERROR 4
139 #define MP_STATUS_RESERVED1 5
140 #define MP_STATUS_NOT_SUPPORTED 6
141 #define MP_STATUS_HW_ERROR 7
142 #define MP_STATUS_UNSUCCESSFUL 8
143
144 #define RH_STATUS_SUCCESS 0
145 #define RH_STATUS_NO_CHANGES 1
146 #define RH_STATUS_UNSUCCESSFUL 2
147
148 /* Additional USB Class Codes from USB.org */
149 #define USBC_DEVICE_CLASS_TYPE_C_BRIDGE 0x12
150
151 /* Miniport functions */
152 typedef MPSTATUS
153 (NTAPI *PHCI_OPEN_ENDPOINT)(
154 PVOID,
155 PUSBPORT_ENDPOINT_PROPERTIES,
156 PVOID);
157
158 typedef MPSTATUS
159 (NTAPI *PHCI_REOPEN_ENDPOINT)(
160 PVOID,
161 PUSBPORT_ENDPOINT_PROPERTIES,
162 PVOID);
163
164 typedef VOID
165 (NTAPI *PHCI_QUERY_ENDPOINT_REQUIREMENTS)(
166 PVOID,
167 PUSBPORT_ENDPOINT_PROPERTIES,
168 PUSBPORT_ENDPOINT_REQUIREMENTS);
169
170 typedef VOID
171 (NTAPI *PHCI_CLOSE_ENDPOINT)(
172 PVOID,
173 PVOID,
174 BOOLEAN);
175
176 typedef MPSTATUS
177 (NTAPI *PHCI_START_CONTROLLER)(
178 PVOID,
179 PUSBPORT_RESOURCES);
180
181 typedef VOID
182 (NTAPI *PHCI_STOP_CONTROLLER)(
183 PVOID,
184 BOOLEAN);
185
186 typedef VOID
187 (NTAPI *PHCI_SUSPEND_CONTROLLER)(PVOID);
188
189 typedef MPSTATUS
190 (NTAPI *PHCI_RESUME_CONTROLLER)(PVOID);
191
192 typedef BOOLEAN
193 (NTAPI *PHCI_INTERRUPT_SERVICE)(PVOID);
194
195 typedef VOID
196 (NTAPI *PHCI_INTERRUPT_DPC)(
197 PVOID,
198 BOOLEAN);
199
200 typedef MPSTATUS
201 (NTAPI *PHCI_SUBMIT_TRANSFER)(
202 PVOID,
203 PVOID,
204 PUSBPORT_TRANSFER_PARAMETERS,
205 PVOID,
206 PUSBPORT_SCATTER_GATHER_LIST);
207
208 typedef MPSTATUS
209 (NTAPI *PHCI_SUBMIT_ISO_TRANSFER)(
210 PVOID,
211 PVOID,
212 PUSBPORT_TRANSFER_PARAMETERS,
213 PVOID,
214 PVOID);
215
216 typedef VOID
217 (NTAPI *PHCI_ABORT_TRANSFER)(
218 PVOID,
219 PVOID,
220 PVOID,
221 PULONG);
222
223 typedef ULONG
224 (NTAPI *PHCI_GET_ENDPOINT_STATE)(
225 PVOID,
226 PVOID);
227
228 typedef VOID
229 (NTAPI *PHCI_SET_ENDPOINT_STATE)(
230 PVOID,
231 PVOID,
232 ULONG);
233
234 typedef VOID
235 (NTAPI *PHCI_POLL_ENDPOINT)(
236 PVOID,
237 PVOID);
238
239 typedef VOID
240 (NTAPI *PHCI_CHECK_CONTROLLER)(PVOID);
241
242 typedef ULONG
243 (NTAPI *PHCI_GET_32BIT_FRAME_NUMBER)(PVOID);
244
245 typedef VOID
246 (NTAPI *PHCI_INTERRUPT_NEXT_SOF)(PVOID);
247
248 typedef VOID
249 (NTAPI *PHCI_ENABLE_INTERRUPTS)(PVOID);
250
251 typedef VOID
252 (NTAPI *PHCI_DISABLE_INTERRUPTS)(PVOID);
253
254 typedef VOID
255 (NTAPI *PHCI_POLL_CONTROLLER)(PVOID);
256
257 typedef VOID
258 (NTAPI *PHCI_SET_ENDPOINT_DATA_TOGGLE)(
259 PVOID,
260 PVOID,
261 ULONG);
262
263 typedef ULONG
264 (NTAPI *PHCI_GET_ENDPOINT_STATUS)(
265 PVOID,
266 PVOID);
267
268 typedef VOID
269 (NTAPI *PHCI_SET_ENDPOINT_STATUS)(
270 PVOID,
271 PVOID,
272 ULONG);
273
274 typedef VOID
275 (NTAPI *PHCI_RESET_CONTROLLER)(PVOID);
276
277 /* Roothub functions */
278 typedef VOID
279 (NTAPI *PHCI_RH_GET_ROOT_HUB_DATA)(
280 PVOID,
281 PVOID);
282
283 typedef MPSTATUS
284 (NTAPI *PHCI_RH_GET_STATUS)(
285 PVOID,
286 PUSHORT);
287
288 #define USB20_PORT_STATUS_RESERVED1_OWNED_BY_COMPANION (1 << 2)
289
290 typedef MPSTATUS
291 (NTAPI *PHCI_RH_GET_PORT_STATUS)(
292 PVOID,
293 USHORT,
294 PUSB_PORT_STATUS_AND_CHANGE);
295
296 typedef MPSTATUS
297 (NTAPI *PHCI_RH_GET_HUB_STATUS)(
298 PVOID,
299 PUSB_HUB_STATUS_AND_CHANGE);
300
301 typedef MPSTATUS
302 (NTAPI *PHCI_RH_SET_FEATURE_PORT_RESET)(
303 PVOID,
304 USHORT);
305
306 typedef MPSTATUS
307 (NTAPI *PHCI_RH_SET_FEATURE_PORT_POWER)(
308 PVOID,
309 USHORT);
310
311 typedef MPSTATUS
312 (NTAPI *PHCI_RH_SET_FEATURE_PORT_ENABLE)(
313 PVOID,
314 USHORT);
315
316 typedef MPSTATUS
317 (NTAPI *PHCI_RH_SET_FEATURE_PORT_SUSPEND)(
318 PVOID,
319 USHORT);
320
321 typedef MPSTATUS
322 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_ENABLE)(
323 PVOID,
324 USHORT);
325
326 typedef MPSTATUS
327 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_POWER)(
328 PVOID,
329 USHORT);
330
331 typedef MPSTATUS
332 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND)(
333 PVOID,
334 USHORT);
335
336 typedef MPSTATUS
337 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE)(
338 PVOID,
339 USHORT);
340
341 typedef MPSTATUS
342 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE)(
343 PVOID,
344 USHORT);
345
346 typedef MPSTATUS
347 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE)(
348 PVOID,
349 USHORT);
350
351 typedef MPSTATUS
352 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE)(
353 PVOID,
354 USHORT);
355
356 typedef MPSTATUS
357 (NTAPI *PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE)(
358 PVOID,
359 USHORT);
360
361 typedef VOID
362 (NTAPI *PHCI_RH_DISABLE_IRQ)(PVOID);
363
364 typedef VOID
365 (NTAPI *PHCI_RH_ENABLE_IRQ)(PVOID);
366
367 /* Miniport ioctl functions */
368 typedef MPSTATUS
369 (NTAPI *PHCI_START_SEND_ONE_PACKET)(
370 PVOID,
371 PVOID,
372 PVOID,
373 PULONG,
374 PVOID,
375 PVOID,
376 ULONG,
377 USBD_STATUS *);
378
379 typedef MPSTATUS
380 (NTAPI *PHCI_END_SEND_ONE_PACKET)(
381 PVOID,
382 PVOID,
383 PVOID,
384 PULONG,
385 PVOID,
386 PVOID,
387 ULONG,
388 USBD_STATUS *);
389
390 typedef MPSTATUS
391 (NTAPI *PHCI_PASS_THRU)(
392 PVOID,
393 PVOID,
394 ULONG,
395 PVOID);
396
397 /* Port functions */
398 typedef ULONG
399 (NTAPI *PUSBPORT_DBG_PRINT)(
400 PVOID,
401 ULONG,
402 PCH,
403 ...);
404
405 typedef ULONG
406 (NTAPI *PUSBPORT_TEST_DEBUG_BREAK)(PVOID);
407
408 typedef ULONG
409 (NTAPI *PUSBPORT_ASSERT_FAILURE)(
410 PVOID,
411 PVOID,
412 PVOID,
413 ULONG,
414 PCHAR);
415
416 typedef MPSTATUS
417 (NTAPI *PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE)(
418 PVOID,
419 BOOL,
420 PCWSTR,
421 SIZE_T,
422 PVOID,
423 SIZE_T);
424
425 typedef ULONG
426 (NTAPI *PUSBPORT_INVALIDATE_ROOT_HUB)(PVOID);
427
428 typedef ULONG
429 (NTAPI *PUSBPORT_INVALIDATE_ENDPOINT)(
430 PVOID,
431 PVOID);
432
433 typedef VOID
434 (NTAPI *PUSBPORT_COMPLETE_TRANSFER)(
435 PVOID,
436 PVOID,
437 PVOID,
438 USBD_STATUS,
439 ULONG);
440
441 typedef ULONG
442 (NTAPI *PUSBPORT_COMPLETE_ISO_TRANSFER)(
443 PVOID,
444 PVOID,
445 PVOID,
446 ULONG);
447
448 typedef ULONG
449 (NTAPI *PUSBPORT_LOG_ENTRY)(
450 PVOID,
451 ULONG,
452 ULONG,
453 ULONG,
454 ULONG,
455 ULONG);
456
457 typedef PVOID
458 (NTAPI *PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS)(
459 ULONG,
460 PVOID,
461 PVOID);
462
463 typedef VOID
464 (NTAPI ASYNC_TIMER_CALLBACK)(
465 IN PVOID MiniportExtension,
466 IN PVOID CallBackContext);
467
468 typedef ULONG
469 (NTAPI *PUSBPORT_REQUEST_ASYNC_CALLBACK)(
470 PVOID,
471 ULONG,
472 PVOID,
473 SIZE_T,
474 ASYNC_TIMER_CALLBACK *);
475
476 typedef MPSTATUS
477 (NTAPI *PUSBPORT_READ_WRITE_CONFIG_SPACE)(
478 PVOID,
479 BOOLEAN,
480 PVOID,
481 ULONG,
482 ULONG);
483
484 typedef NTSTATUS
485 (NTAPI *PUSBPORT_WAIT)(
486 PVOID,
487 ULONG);
488
489 #define USBPORT_INVALIDATE_CONTROLLER_RESET 1
490 #define USBPORT_INVALIDATE_CONTROLLER_SURPRISE_REMOVE 2
491 #define USBPORT_INVALIDATE_CONTROLLER_SOFT_INTERRUPT 3
492
493 typedef ULONG
494 (NTAPI *PUSBPORT_INVALIDATE_CONTROLLER)(
495 PVOID,
496 ULONG);
497
498 typedef VOID
499 (NTAPI *PUSBPORT_BUG_CHECK)(PVOID);
500
501 typedef ULONG
502 (NTAPI *PUSBPORT_NOTIFY_DOUBLE_BUFFER)(
503 PVOID,
504 PVOID,
505 PVOID,
506 SIZE_T);
507
508 /* Miniport functions */
509 typedef VOID
510 (NTAPI *PHCI_REBALANCE_ENDPOINT)(
511 PVOID,
512 PUSBPORT_ENDPOINT_PROPERTIES,
513 PVOID);
514
515 typedef VOID
516 (NTAPI *PHCI_FLUSH_INTERRUPTS)(PVOID);
517
518 typedef MPSTATUS
519 (NTAPI *PHCI_RH_CHIRP_ROOT_PORT)(
520 PVOID,
521 USHORT);
522
523 typedef VOID
524 (NTAPI *PHCI_TAKE_PORT_CONTROL)(PVOID);
525
526 #define USB_MINIPORT_VERSION_OHCI 0x01
527 #define USB_MINIPORT_VERSION_UHCI 0x02
528 #define USB_MINIPORT_VERSION_EHCI 0x03
529 #define USB_MINIPORT_VERSION_XHCI 0x04
530
531 #define USB_MINIPORT_FLAGS_INTERRUPT 0x0001
532 #define USB_MINIPORT_FLAGS_PORT_IO 0x0002
533 #define USB_MINIPORT_FLAGS_MEMORY_IO 0x0004
534 #define USB_MINIPORT_FLAGS_USB2 0x0010
535 #define USB_MINIPORT_FLAGS_DISABLE_SS 0x0020
536 #define USB_MINIPORT_FLAGS_NOT_LOCK_INT 0x0040
537 #define USB_MINIPORT_FLAGS_POLLING 0x0080
538 #define USB_MINIPORT_FLAGS_NO_DMA 0x0100
539 #define USB_MINIPORT_FLAGS_WAKE_SUPPORT 0x0200
540
541 #define TOTAL_USB11_BUS_BANDWIDTH 12000
542 #define TOTAL_USB20_BUS_BANDWIDTH 400000
543
544 typedef struct _USBPORT_REGISTRATION_PACKET {
545 ULONG MiniPortVersion;
546 ULONG MiniPortFlags;
547 ULONG MiniPortBusBandwidth;
548 ULONG Reserved1;
549 SIZE_T MiniPortExtensionSize;
550 SIZE_T MiniPortEndpointSize;
551 SIZE_T MiniPortTransferSize;
552 ULONG Reserved2;
553 ULONG Reserved3;
554 SIZE_T MiniPortResourcesSize;
555
556 /* Miniport */
557 PHCI_OPEN_ENDPOINT OpenEndpoint;
558 PHCI_REOPEN_ENDPOINT ReopenEndpoint;
559 PHCI_QUERY_ENDPOINT_REQUIREMENTS QueryEndpointRequirements;
560 PHCI_CLOSE_ENDPOINT CloseEndpoint;
561 PHCI_START_CONTROLLER StartController;
562 PHCI_STOP_CONTROLLER StopController;
563 PHCI_SUSPEND_CONTROLLER SuspendController;
564 PHCI_RESUME_CONTROLLER ResumeController;
565 PHCI_INTERRUPT_SERVICE InterruptService;
566 PHCI_INTERRUPT_DPC InterruptDpc;
567 PHCI_SUBMIT_TRANSFER SubmitTransfer;
568 PHCI_SUBMIT_ISO_TRANSFER SubmitIsoTransfer;
569 PHCI_ABORT_TRANSFER AbortTransfer;
570 PHCI_GET_ENDPOINT_STATE GetEndpointState;
571 PHCI_SET_ENDPOINT_STATE SetEndpointState;
572 PHCI_POLL_ENDPOINT PollEndpoint;
573 PHCI_CHECK_CONTROLLER CheckController;
574 PHCI_GET_32BIT_FRAME_NUMBER Get32BitFrameNumber;
575 PHCI_INTERRUPT_NEXT_SOF InterruptNextSOF;
576 PHCI_ENABLE_INTERRUPTS EnableInterrupts;
577 PHCI_DISABLE_INTERRUPTS DisableInterrupts;
578 PHCI_POLL_CONTROLLER PollController;
579 PHCI_SET_ENDPOINT_DATA_TOGGLE SetEndpointDataToggle;
580 PHCI_GET_ENDPOINT_STATUS GetEndpointStatus;
581 PHCI_SET_ENDPOINT_STATUS SetEndpointStatus;
582 PHCI_RESET_CONTROLLER ResetController;
583
584 /* Roothub */
585 PHCI_RH_GET_ROOT_HUB_DATA RH_GetRootHubData;
586 PHCI_RH_GET_STATUS RH_GetStatus;
587 PHCI_RH_GET_PORT_STATUS RH_GetPortStatus;
588 PHCI_RH_GET_HUB_STATUS RH_GetHubStatus;
589 PHCI_RH_SET_FEATURE_PORT_RESET RH_SetFeaturePortReset;
590 PHCI_RH_SET_FEATURE_PORT_POWER RH_SetFeaturePortPower;
591 PHCI_RH_SET_FEATURE_PORT_ENABLE RH_SetFeaturePortEnable;
592 PHCI_RH_SET_FEATURE_PORT_SUSPEND RH_SetFeaturePortSuspend;
593 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE RH_ClearFeaturePortEnable;
594 PHCI_RH_CLEAR_FEATURE_PORT_POWER RH_ClearFeaturePortPower;
595 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND RH_ClearFeaturePortSuspend;
596 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE RH_ClearFeaturePortEnableChange;
597 PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE RH_ClearFeaturePortConnectChange;
598 PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE RH_ClearFeaturePortResetChange;
599 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE RH_ClearFeaturePortSuspendChange;
600 PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE RH_ClearFeaturePortOvercurrentChange;
601 PHCI_RH_DISABLE_IRQ RH_DisableIrq;
602 PHCI_RH_ENABLE_IRQ RH_EnableIrq;
603
604 /* Miniport ioctl */
605 PHCI_START_SEND_ONE_PACKET StartSendOnePacket;
606 PHCI_END_SEND_ONE_PACKET EndSendOnePacket;
607 PHCI_PASS_THRU PassThru;
608
609 /* Port */
610 PUSBPORT_DBG_PRINT UsbPortDbgPrint;
611 PUSBPORT_TEST_DEBUG_BREAK UsbPortTestDebugBreak;
612 PUSBPORT_ASSERT_FAILURE UsbPortAssertFailure;
613 PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE UsbPortGetMiniportRegistryKeyValue;
614 PUSBPORT_INVALIDATE_ROOT_HUB UsbPortInvalidateRootHub;
615 PUSBPORT_INVALIDATE_ENDPOINT UsbPortInvalidateEndpoint;
616 PUSBPORT_COMPLETE_TRANSFER UsbPortCompleteTransfer;
617 PUSBPORT_COMPLETE_ISO_TRANSFER UsbPortCompleteIsoTransfer;
618 PUSBPORT_LOG_ENTRY UsbPortLogEntry;
619 PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS UsbPortGetMappedVirtualAddress;
620 PUSBPORT_REQUEST_ASYNC_CALLBACK UsbPortRequestAsyncCallback;
621 PUSBPORT_READ_WRITE_CONFIG_SPACE UsbPortReadWriteConfigSpace;
622 PUSBPORT_WAIT UsbPortWait;
623 PUSBPORT_INVALIDATE_CONTROLLER UsbPortInvalidateController;
624 PUSBPORT_BUG_CHECK UsbPortBugCheck;
625 PUSBPORT_NOTIFY_DOUBLE_BUFFER UsbPortNotifyDoubleBuffer;
626
627 /* Miniport */
628 PHCI_REBALANCE_ENDPOINT RebalanceEndpoint;
629 PHCI_FLUSH_INTERRUPTS FlushInterrupts;
630 PHCI_RH_CHIRP_ROOT_PORT RH_ChirpRootPort;
631 PHCI_TAKE_PORT_CONTROL TakePortControl;
632 ULONG Reserved4;
633 ULONG Reserved5;
634 } USBPORT_REGISTRATION_PACKET, *PUSBPORT_REGISTRATION_PACKET;
635
636 #define USB10_MINIPORT_INTERFACE_VERSION 100
637 #define USB20_MINIPORT_INTERFACE_VERSION 200
638
639 typedef struct _USBPORT_MINIPORT_INTERFACE {
640 PDRIVER_OBJECT DriverObject;
641 LIST_ENTRY DriverLink;
642 PDRIVER_UNLOAD DriverUnload;
643 ULONG Version;
644 USBPORT_REGISTRATION_PACKET Packet;
645 } USBPORT_MINIPORT_INTERFACE, *PUSBPORT_MINIPORT_INTERFACE;
646
647 C_ASSERT(sizeof(USBPORT_MINIPORT_INTERFACE) == 32 + 76 * sizeof(PVOID));
648
649 #define USBPORT_TRANSFER_DIRECTION_OUT 1 // From host to device
650 #define USBPORT_MAX_DEVICE_ADDRESS 127
651
652 /* For USB1.1 or USB3 Hub Descriptors */
653 typedef union _USBPORT_HUB_11_CHARACTERISTICS {
654 struct {
655 USHORT PowerControlMode :1;
656 USHORT NoPowerSwitching :1; // Reserved. Used only on 1.0 compliant hubs that implement no power switching.
657 USHORT PartOfCompoundDevice :1;
658 USHORT OverCurrentProtectionMode :1;
659 USHORT NoOverCurrentProtection :1;
660 USHORT Reserved1 :11;
661 };
662 USHORT AsUSHORT;
663 } USBPORT_HUB_11_CHARACTERISTICS;
664
665 C_ASSERT(sizeof(USBPORT_HUB_11_CHARACTERISTICS) == sizeof(USHORT));
666
667 /* For USB2.0 Hub Descriptors */
668 typedef union _USBPORT_HUB_20_CHARACTERISTICS {
669 struct {
670 USHORT PowerControlMode :1;
671 USHORT NoPowerSwitching :1; // Reserved. Used only on 1.0 compliant hubs that implement no power switching.
672 USHORT PartOfCompoundDevice :1;
673 USHORT OverCurrentProtectionMode :1;
674 USHORT NoOverCurrentProtection :1;
675 USHORT TtThinkTime :2;
676 USHORT PortIndicatorsSupported :1;
677 USHORT Reserved1 :8;
678 };
679 USHORT AsUSHORT;
680 } USBPORT_HUB_20_CHARACTERISTICS;
681
682 C_ASSERT(sizeof(USBPORT_HUB_20_CHARACTERISTICS) == sizeof(USHORT));
683
684 typedef USBPORT_HUB_11_CHARACTERISTICS USBPORT_HUB_30_CHARACTERISTICS;
685
686 typedef union _USBPORT_HUB_CHARACTERISTICS {
687 USHORT AsUSHORT;
688 USBPORT_HUB_11_CHARACTERISTICS Usb11HubCharacteristics;
689 USBPORT_HUB_20_CHARACTERISTICS Usb20HubCharacteristics;
690 USBPORT_HUB_30_CHARACTERISTICS Usb30HubCharacteristics;
691 } USBPORT_HUB_CHARACTERISTICS;
692
693 C_ASSERT(sizeof(USBPORT_HUB_CHARACTERISTICS) == sizeof(USHORT));
694
695 typedef struct _USBPORT_ROOT_HUB_DATA {
696 ULONG NumberOfPorts;
697 USBPORT_HUB_CHARACTERISTICS HubCharacteristics;
698 USHORT Padded1;
699 ULONG PowerOnToPowerGood;
700 ULONG HubControlCurrent;
701 } USBPORT_ROOT_HUB_DATA, *PUSBPORT_ROOT_HUB_DATA;
702
703 C_ASSERT(sizeof(USBPORT_ROOT_HUB_DATA) == 16);
704
705 ULONG
706 NTAPI
707 USBPORT_GetHciMn(VOID);
708
709 NTSTATUS
710 NTAPI
711 USBPORT_RegisterUSBPortDriver(
712 IN PDRIVER_OBJECT DriverObject,
713 IN ULONG Version,
714 IN PUSBPORT_REGISTRATION_PACKET RegistrationPacket);
715
716 #endif /* USBMPORT_H__ */