[USBPORT] Define structures for Transaction Translator.
[reactos.git] / drivers / usb / usbport / usbport.h
1 /*
2 * PROJECT: ReactOS USB Port Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: USBPort declarations
5 * COPYRIGHT: Copyright 2017 Vadim Galyant <vgal@rambler.ru>
6 */
7
8 #ifndef USBPORT_H__
9 #define USBPORT_H__
10
11 #include <ntddk.h>
12 #include <windef.h>
13 #include <stdio.h>
14 #include <wdmguid.h>
15 #include <ntstrsafe.h>
16 #include <usb.h>
17 #include <hubbusif.h>
18 #include <usbbusif.h>
19 #include <usbdlib.h>
20 #include <usbuser.h>
21 #include <drivers/usbport/usbmport.h>
22
23 #define PCI_INTERFACE_USB_ID_UHCI 0x00
24 #define PCI_INTERFACE_USB_ID_OHCI 0x10
25 #define PCI_INTERFACE_USB_ID_EHCI 0x20
26 #define PCI_INTERFACE_USB_ID_XHCI 0x30
27
28 #ifdef USBD_TRANSFER_DIRECTION // due hubbusif.h included usbdi.h (Which overwrites...)
29 #undef USBD_TRANSFER_DIRECTION
30 #define USBD_TRANSFER_DIRECTION 0x00000001
31 #endif
32
33 #define USBPORT_RECIPIENT_HUB BMREQUEST_TO_DEVICE
34 #define USBPORT_RECIPIENT_PORT BMREQUEST_TO_OTHER
35
36 #define INVALIDATE_ENDPOINT_ONLY 0
37 #define INVALIDATE_ENDPOINT_WORKER_THREAD 1
38 #define INVALIDATE_ENDPOINT_WORKER_DPC 2
39 #define INVALIDATE_ENDPOINT_INT_NEXT_SOF 3
40
41 #define USBPORT_DMA_DIRECTION_FROM_DEVICE 1
42 #define USBPORT_DMA_DIRECTION_TO_DEVICE 2
43
44 #define USB_PORT_TAG 'pbsu'
45 #define URB_FUNCTION_MAX 0x31
46
47 /* Hub Class Feature Selectors (Recipient - Port) */
48 #define FEATURE_PORT_CONNECTION 0
49 #define FEATURE_PORT_ENABLE 1
50 #define FEATURE_PORT_SUSPEND 2
51 #define FEATURE_PORT_OVER_CURRENT 3
52 #define FEATURE_PORT_RESET 4
53 #define FEATURE_PORT_POWER 8
54 #define FEATURE_PORT_LOW_SPEED 9
55 #define FEATURE_C_PORT_CONNECTION 16
56 #define FEATURE_C_PORT_ENABLE 17
57 #define FEATURE_C_PORT_SUSPEND 18
58 #define FEATURE_C_PORT_OVER_CURRENT 19
59 #define FEATURE_C_PORT_RESET 20
60
61 /* Hub Class Feature Selectors (Recipient - Hub) */
62 #define FEATURE_C_HUB_LOCAL_POWER 0
63 #define FEATURE_C_HUB_OVER_CURRENT 1
64
65 /* Flags */
66 #define USBPORT_FLAG_INT_CONNECTED 0x00000001
67 #define USBPORT_FLAG_HC_STARTED 0x00000002
68 #define USBPORT_FLAG_HC_POLLING 0x00000004
69 #define USBPORT_FLAG_WORKER_THREAD_ON 0x00000008
70 #define USBPORT_FLAG_HC_SUSPEND 0x00000100
71 #define USBPORT_FLAG_INTERRUPT_ENABLED 0x00000400
72 #define USBPORT_FLAG_SELECTIVE_SUSPEND 0x00000800
73 #define USBPORT_FLAG_DOS_SYMBOLIC_NAME 0x00010000
74 #define USBPORT_FLAG_LEGACY_SUPPORT 0x00080000
75 #define USBPORT_FLAG_HC_WAKE_SUPPORT 0x00200000
76 #define USBPORT_FLAG_DIAGNOSTIC_MODE 0x00800000 //IOCTL_USB_DIAGNOSTIC_MODE_ON
77 #define USBPORT_FLAG_COMPANION_HC 0x01000000
78 #define USBPORT_FLAG_REGISTERED_FDO 0x02000000
79 #define USBPORT_FLAG_NO_HACTION 0x04000000
80 #define USBPORT_FLAG_BIOS_DISABLE_SS 0x08000000 //Selective Suspend
81 #define USBPORT_FLAG_PWR_AND_CHIRP_LOCK 0x10000000
82 #define USBPORT_FLAG_POWER_AND_CHIRP_OK 0x40000000
83 #define USBPORT_FLAG_RH_INIT_CALLBACK 0x80000000
84
85 /* PnP state Flags */
86 #define USBPORT_PNP_STATE_NOT_INIT 0x00000001
87 #define USBPORT_PNP_STATE_STARTED 0x00000002
88 #define USBPORT_PNP_STATE_FAILED 0x00000004
89 #define USBPORT_PNP_STATE_STOPPED 0x00000008
90
91 /* Timer Flags */
92 #define USBPORT_TMFLAG_TIMER_QUEUED 0x00000001
93 #define USBPORT_TMFLAG_HC_SUSPENDED 0x00000002
94 #define USBPORT_TMFLAG_HC_RESUME 0x00000004
95 #define USBPORT_TMFLAG_RH_SUSPENDED 0x00000008
96 #define USBPORT_TMFLAG_TIMER_STARTED 0x00000010
97 #define USBPORT_TMFLAG_WAKE 0x00000020
98 #define USBPORT_TMFLAG_IDLE_QUEUEITEM_ON 0x00000040
99
100 /* Miniport Flags */
101 #define USBPORT_MPFLAG_INTERRUPTS_ENABLED 0x00000001
102 #define USBPORT_MPFLAG_SUSPENDED 0x00000002
103
104 /* Device handle Flags (USBPORT_DEVICE_HANDLE) */
105 #define DEVICE_HANDLE_FLAG_ROOTHUB 0x00000002
106 #define DEVICE_HANDLE_FLAG_REMOVED 0x00000008
107 #define DEVICE_HANDLE_FLAG_INITIALIZED 0x00000010
108
109 /* Endpoint Flags (USBPORT_ENDPOINT) */
110 #define ENDPOINT_FLAG_DMA_TYPE 0x00000001
111 #define ENDPOINT_FLAG_ROOTHUB_EP0 0x00000002
112 #define ENDPOINT_FLAG_NUKE 0x00000008
113 #define ENDPOINT_FLAG_QUEUENE_EMPTY 0x00000010
114 #define ENDPOINT_FLAG_ABORTING 0x00000020
115 #define ENDPOINT_FLAG_IDLE 0x00000100
116 #define ENDPOINT_FLAG_OPENED 0x00000200
117 #define ENDPOINT_FLAG_CLOSED 0x00000400
118
119 /* UsbdFlags Flags (URB) */
120 #define USBD_FLAG_ALLOCATED_MDL 0x00000002
121 #define USBD_FLAG_NOT_ISO_TRANSFER 0x00000010
122 #define USBD_FLAG_ALLOCATED_TRANSFER 0x00000020
123
124 /* Pipe handle Flags (USBPORT_PIPE_HANDLE) */
125 #define PIPE_HANDLE_FLAG_CLOSED 0x00000001
126 #define PIPE_HANDLE_FLAG_NULL_PACKET_SIZE 0x00000002
127
128 /* Transfer Flags (USBPORT_TRANSFER) */
129 #define TRANSFER_FLAG_CANCELED 0x00000001
130 #define TRANSFER_FLAG_DMA_MAPPED 0x00000002
131 #define TRANSFER_FLAG_HIGH_SPEED 0x00000004
132 #define TRANSFER_FLAG_SUBMITED 0x00000008
133 #define TRANSFER_FLAG_ABORTED 0x00000010
134 #define TRANSFER_FLAG_ISO 0x00000020
135 #define TRANSFER_FLAG_DEVICE_GONE 0x00000080
136 #define TRANSFER_FLAG_SPLITED 0x00000100
137 #define TRANSFER_FLAG_COMPLETED 0x00000200
138 #define TRANSFER_FLAG_PARENT 0x00000400
139
140 extern KSPIN_LOCK USBPORT_SpinLock;
141 extern LIST_ENTRY USBPORT_MiniPortDrivers;
142
143 typedef USBD_STATUS* PUSBD_STATUS;
144
145 typedef struct _USBPORT_COMMON_BUFFER_HEADER {
146 ULONG Length;
147 ULONG_PTR BaseVA;
148 PHYSICAL_ADDRESS LogicalAddress;
149 SIZE_T BufferLength;
150 ULONG_PTR VirtualAddress;
151 ULONG_PTR PhysicalAddress;
152 } USBPORT_COMMON_BUFFER_HEADER, *PUSBPORT_COMMON_BUFFER_HEADER;
153
154 typedef struct _USBPORT_ENDPOINT *PUSBPORT_ENDPOINT;
155
156 typedef struct _USBPORT_PIPE_HANDLE {
157 ULONG Flags;
158 ULONG PipeFlags;
159 USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
160 UCHAR Padded;
161 PUSBPORT_ENDPOINT Endpoint;
162 LIST_ENTRY PipeLink;
163 } USBPORT_PIPE_HANDLE, *PUSBPORT_PIPE_HANDLE;
164
165 typedef struct _USBPORT_CONFIGURATION_HANDLE {
166 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
167 LIST_ENTRY InterfaceHandleList;
168 //USB_CONFIGURATION_DESCRIPTOR CfgDescriptor; // Body.
169 } USBPORT_CONFIGURATION_HANDLE, *PUSBPORT_CONFIGURATION_HANDLE;
170
171 typedef struct _USBPORT_INTERFACE_HANDLE {
172 LIST_ENTRY InterfaceLink;
173 UCHAR AlternateSetting;
174 UCHAR Pad1[3];
175 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
176 UCHAR Pad2[3];
177 USBPORT_PIPE_HANDLE PipeHandle[1];
178 } USBPORT_INTERFACE_HANDLE, *PUSBPORT_INTERFACE_HANDLE;
179
180 typedef struct _USBPORT_DEVICE_HANDLE {
181 ULONG Flags;
182 USHORT DeviceAddress;
183 USHORT PortNumber;
184 USBPORT_PIPE_HANDLE PipeHandle;
185 ULONG DeviceSpeed;
186 BOOL IsRootHub;
187 LIST_ENTRY PipeHandleList;
188 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle;
189 struct _USBPORT_DEVICE_HANDLE *HubDeviceHandle;
190 USB_DEVICE_DESCRIPTOR DeviceDescriptor;
191 LIST_ENTRY DeviceHandleLink;
192 LONG DeviceHandleLock;
193 ULONG TtCount;
194 } USBPORT_DEVICE_HANDLE, *PUSBPORT_DEVICE_HANDLE;
195
196 typedef struct _USBPORT_ENDPOINT {
197 ULONG Flags;
198 PDEVICE_OBJECT FdoDevice;
199 PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
200 PUSBPORT_DEVICE_HANDLE DeviceHandle;
201 USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
202 ULONG EndpointWorker;
203 ULONG FrameNumber;
204 /* Locks */
205 KSPIN_LOCK EndpointSpinLock;
206 KIRQL EndpointOldIrql;
207 KIRQL EndpointStateOldIrql;
208 UCHAR Padded[2];
209 LONG LockCounter;
210 LONG FlushPendingLock;
211 /* State */
212 ULONG StateLast;
213 ULONG StateNext;
214 LIST_ENTRY StateChangeLink;
215 KSPIN_LOCK StateChangeSpinLock;
216 /* Transfer lists */
217 LIST_ENTRY PendingTransferList;
218 LIST_ENTRY TransferList;
219 LIST_ENTRY CancelList;
220 LIST_ENTRY AbortList;
221 /* Links */
222 LIST_ENTRY EndpointLink;
223 LIST_ENTRY WorkerLink;
224 LIST_ENTRY CloseLink;
225 LIST_ENTRY DispatchLink;
226 LIST_ENTRY FlushLink;
227 LIST_ENTRY FlushControllerLink;
228 LIST_ENTRY FlushAbortLink;
229 } USBPORT_ENDPOINT, *PUSBPORT_ENDPOINT;
230
231 typedef struct _USBPORT_ISO_BLOCK *PUSBPORT_ISO_BLOCK;
232
233 typedef struct _USBPORT_TRANSFER {
234 ULONG Flags;
235 PIRP Irp;
236 PURB Urb;
237 PRKEVENT Event;
238 PVOID MiniportTransfer;
239 SIZE_T PortTransferLength; // Only port part
240 SIZE_T FullTransferLength; // Port + miniport
241 PUSBPORT_ENDPOINT Endpoint;
242 USBPORT_TRANSFER_PARAMETERS TransferParameters;
243 PMDL TransferBufferMDL;
244 ULONG Direction;
245 LIST_ENTRY TransferLink;
246 USBD_STATUS USBDStatus;
247 ULONG CompletedTransferLen;
248 ULONG NumberOfMapRegisters;
249 PVOID MapRegisterBase;
250 ULONG TimeOut;
251 LARGE_INTEGER Time;
252 struct _USBPORT_TRANSFER * ParentTransfer;
253 KSPIN_LOCK TransferSpinLock;
254 LIST_ENTRY SplitTransfersList; // for parent transfers
255 LIST_ENTRY SplitLink; // for splitted transfers
256 ULONG Period;
257 PUSBPORT_ISO_BLOCK IsoBlockPtr; // pointer on IsoBlock
258 // SgList should be LAST field
259 USBPORT_SCATTER_GATHER_LIST SgList; // variable length
260 //USBPORT_ISO_BLOCK IsoBlock; // variable length
261 } USBPORT_TRANSFER, *PUSBPORT_TRANSFER;
262
263 typedef struct _USBPORT_IRP_TABLE {
264 struct _USBPORT_IRP_TABLE * LinkNextTable;
265 PIRP irp[0X200];
266 } USBPORT_IRP_TABLE, *PUSBPORT_IRP_TABLE;
267
268 typedef struct _USBPORT_COMMON_DEVICE_EXTENSION {
269 PDEVICE_OBJECT SelfDevice;
270 PDEVICE_OBJECT LowerPdoDevice; // PhysicalDeviceObject
271 PDEVICE_OBJECT LowerDevice; // TopOfStackDeviceObject
272 ULONG IsPDO;
273 UNICODE_STRING SymbolicLinkName;
274 BOOL IsInterfaceEnabled;
275 DEVICE_POWER_STATE DevicePowerState;
276 ULONG PnpStateFlags;
277 } USBPORT_COMMON_DEVICE_EXTENSION, *PUSBPORT_COMMON_DEVICE_EXTENSION;
278
279 typedef struct _USBPORT_DEVICE_EXTENSION {
280 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension;
281 ULONG Flags;
282 PDEVICE_OBJECT RootHubPdo; // RootHubDeviceObject
283 KSPIN_LOCK RootHubCallbackSpinLock;
284 LONG RHInitCallBackLock;
285 LONG ChirpRootPortLock;
286 KSEMAPHORE ControllerSemaphore;
287 ULONG FdoNameNumber;
288 UNICODE_STRING DosDeviceSymbolicName;
289 ULONG UsbBIOSx;
290 LIST_ENTRY ControllerLink;
291 ULONG CommonBufferLimit;
292 /* Miniport */
293 ULONG MiniPortFlags;
294 PVOID MiniPortExt;
295 PUSBPORT_MINIPORT_INTERFACE MiniPortInterface;
296 USBPORT_RESOURCES UsbPortResources;
297 PUSBPORT_COMMON_BUFFER_HEADER MiniPortCommonBuffer;
298 KSPIN_LOCK MiniportSpinLock;
299 /* Bus Interface */
300 BUS_INTERFACE_STANDARD BusInterface;
301 USHORT VendorID;
302 USHORT DeviceID;
303 UCHAR RevisionID;
304 UCHAR ProgIf;
305 UCHAR SubClass;
306 UCHAR BaseClass;
307 /* Dma Adapter */
308 PDMA_ADAPTER DmaAdapter;
309 ULONG NumberMapRegs;
310 /* Interrupt */
311 PKINTERRUPT InterruptObject;
312 KDPC IsrDpc;
313 LONG IsrDpcCounter;
314 LONG IsrDpcHandlerCounter;
315 KSPIN_LOCK MiniportInterruptsSpinLock;
316 KTIMER TimerSoftInterrupt;
317 KDPC SoftInterruptDpc;
318 /* Endpoints */
319 ULONG PeriodicEndpoints;
320 LIST_ENTRY EndpointList;
321 KSPIN_LOCK EndpointListSpinLock;
322 LIST_ENTRY EpStateChangeList;
323 KSPIN_LOCK EpStateChangeSpinLock;
324 LIST_ENTRY EndpointClosedList;
325 KSPIN_LOCK EndpointClosedSpinLock;
326 LIST_ENTRY WorkerList;
327 /* Transfers */
328 LIST_ENTRY MapTransferList;
329 KSPIN_LOCK MapTransferSpinLock;
330 LIST_ENTRY DoneTransferList;
331 KSPIN_LOCK DoneTransferSpinLock;
332 KDPC TransferFlushDpc;
333 KSPIN_LOCK FlushTransferSpinLock;
334 KSPIN_LOCK FlushPendingTransferSpinLock;
335 /* Timer */
336 ULONG TimerValue; // Timer period (500) msec. default
337 ULONG TimerFlags;
338 KTIMER TimerObject;
339 KDPC TimerDpc;
340 KSPIN_LOCK TimerFlagsSpinLock;
341 /* Worker Thread */
342 PRKTHREAD WorkerThread;
343 HANDLE WorkerThreadHandle;
344 KEVENT WorkerThreadEvent;
345 KSPIN_LOCK WorkerThreadEventSpinLock;
346 /* Usb Devices */
347 ULONG UsbAddressBitMap[4];
348 LIST_ENTRY DeviceHandleList;
349 KSPIN_LOCK DeviceHandleSpinLock;
350 KSEMAPHORE DeviceSemaphore;
351 /* Device Capabilities */
352 DEVICE_CAPABILITIES Capabilities;
353 ULONG BusNumber;
354 ULONG PciDeviceNumber;
355 ULONG PciFunctionNumber;
356 ULONG TotalBusBandwidth;
357 /* Idle */
358 LARGE_INTEGER IdleTime;
359 IO_CSQ IdleIoCsq;
360 KSPIN_LOCK IdleIoCsqSpinLock;
361 LIST_ENTRY IdleIrpList;
362 LONG IdleLockCounter;
363 /* Bad Requests */
364 IO_CSQ BadRequestIoCsq;
365 KSPIN_LOCK BadRequestIoCsqSpinLock;
366 LIST_ENTRY BadRequestList;
367 LONG BadRequestLockCounter;
368 /* Irp Queues */
369 PUSBPORT_IRP_TABLE PendingIrpTable;
370 PUSBPORT_IRP_TABLE ActiveIrpTable;
371 /* Power */
372 LONG SetPowerLockCounter;
373 KSPIN_LOCK PowerWakeSpinLock;
374 KSPIN_LOCK SetPowerD0SpinLock;
375 KDPC WorkerRequestDpc;
376 KDPC HcWakeDpc;
377
378 /* Miniport extension should be aligned on 0x100 */
379 #if !defined(_M_X64)
380 ULONG Padded[34];
381 #else
382 ULONG Padded[0];
383 #endif
384
385 } USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
386
387 #if !defined(_M_X64)
388 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x400);
389 #else
390 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
391 #endif
392
393 typedef struct _USBPORT_RH_DESCRIPTORS {
394 USB_DEVICE_DESCRIPTOR DeviceDescriptor;
395 USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor;
396 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
397 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
398 USB_HUB_DESCRIPTOR Descriptor; // Size may be: 7 + 2[1..32] (7 + 2..64)
399 } USBPORT_RH_DESCRIPTORS, *PUSBPORT_RH_DESCRIPTORS;
400
401 typedef struct _USBPORT_RHDEVICE_EXTENSION {
402 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension;
403 ULONG Flags;
404 PDEVICE_OBJECT FdoDevice;
405 ULONG PdoNameNumber;
406 USBPORT_DEVICE_HANDLE DeviceHandle;
407 PUSBPORT_RH_DESCRIPTORS RootHubDescriptors;
408 PUSBPORT_ENDPOINT Endpoint;
409 ULONG ConfigurationValue;
410 PRH_INIT_CALLBACK RootHubInitCallback;
411 PVOID RootHubInitContext;
412 DEVICE_CAPABILITIES Capabilities;
413 PIRP WakeIrp;
414 } USBPORT_RHDEVICE_EXTENSION, *PUSBPORT_RHDEVICE_EXTENSION;
415
416 typedef struct _USBPORT_ASYNC_CALLBACK_DATA {
417 ULONG Reserved;
418 PDEVICE_OBJECT FdoDevice;
419 KTIMER AsyncTimer;
420 KDPC AsyncTimerDpc;
421 ASYNC_TIMER_CALLBACK *CallbackFunction;
422 ULONG CallbackContext;
423 } USBPORT_ASYNC_CALLBACK_DATA, *PUSBPORT_ASYNC_CALLBACK_DATA;
424
425 C_ASSERT(sizeof(USBPORT_ASYNC_CALLBACK_DATA) == 16 + 18 * sizeof(PVOID));
426
427 typedef struct _TIMER_WORK_QUEUE_ITEM {
428 WORK_QUEUE_ITEM WqItem;
429 PDEVICE_OBJECT FdoDevice;
430 ULONG Context;
431 } TIMER_WORK_QUEUE_ITEM, *PTIMER_WORK_QUEUE_ITEM;
432
433 /* Transaction Translator */
434 /* See Chapter 5 - USB Data Flow Model and Chapter 11 - Hub Specification */
435
436 #define USB2_FRAMES 32
437 #define USB2_MICROFRAMES 8
438 #define USB2_MAX_MICROFRAMES (USB2_FRAMES * USB2_MICROFRAMES)
439
440 #define USB2_MAX_MICROFRAME_ALLOCATION 7000 // bytes
441 #define USB2_CONTROLLER_DELAY 100
442 #define USB2_FS_MAX_PERIODIC_ALLOCATION 1157 // ((12000 / 8 bits) * 0.9) / (7/6) - 90% max, and bits stuffing
443 #define USB2_FS_SOF_TIME 6
444 #define USB2_HUB_DELAY 30
445 #define USB2_MAX_FS_LS_TRANSACTIONS_IN_UFRAME 16
446 #define USB2_FS_RAW_BYTES_IN_MICROFRAME 188 // (12000 / 8 bits / USB2_MICROFRAMES) = 187,5. But we use "best case budget"
447
448 /* Overheads */
449 #define USB2_LS_INTERRUPT_OVERHEAD 117 // FS-bytes
450 #define USB2_FS_INTERRUPT_OVERHEAD 13
451 #define USB2_HS_INTERRUPT_OUT_OVERHEAD 45
452 #define USB2_HS_INTERRUPT_IN_OVERHEAD 25
453 #define USB2_FS_ISOCHRONOUS_OVERHEAD 9
454 #define USB2_HS_ISOCHRONOUS_OUT_OVERHEAD 38
455 #define USB2_HS_ISOCHRONOUS_IN_OVERHEAD 18
456
457 typedef union _USB2_TT_ENDPOINT_PARAMS {
458 struct {
459 ULONG TransferType : 4;
460 ULONG Direction : 1;
461 USB_DEVICE_SPEED DeviceSpeed : 2;
462 ULONG EndpointMoved : 1;
463 ULONG Reserved : 24;
464 };
465 ULONG AsULONG;
466 } USB2_TT_ENDPOINT_PARAMS;
467
468 C_ASSERT(sizeof(USB2_TT_ENDPOINT_PARAMS) == sizeof(ULONG));
469
470 typedef union _USB2_TT_ENDPOINT_NUMS {
471 struct {
472 ULONG NumStarts : 4;
473 ULONG NumCompletes : 4;
474 ULONG Reserved : 24;
475 };
476 ULONG AsULONG;
477 } USB2_TT_ENDPOINT_NUMS;
478
479 C_ASSERT(sizeof(USB2_TT_ENDPOINT_NUMS) == sizeof(ULONG));
480
481 typedef struct _USB2_TT_ENDPOINT {
482 PUSB2_TT Tt;
483 PUSBPORT_ENDPOINT Endpoint;
484 struct _USB2_TT_ENDPOINT * NextTtEndpoint;
485 USB2_TT_ENDPOINT_PARAMS TtEndpointParams;
486 USB2_TT_ENDPOINT_NUMS Nums;
487 USHORT MaxPacketSize;
488 USHORT PreviosPeriod;
489 USHORT Period;
490 USHORT ActualPeriod;
491 USHORT CalcBusTime;
492 USHORT StartTime;
493 USHORT Reserved2;
494 UCHAR StartFrame;
495 UCHAR StartMicroframe;
496 } USB2_TT_ENDPOINT, *PUSB2_TT_ENDPOINT;
497
498 typedef struct _USB2_FRAME_BUDGET {
499 PUSB2_TT_ENDPOINT IsoEndpoint;
500 PUSB2_TT_ENDPOINT IntEndpoint;
501 PUSB2_TT_ENDPOINT AltEndpoint;
502 USHORT TimeUsed;
503 USHORT Reserved2;
504 } USB2_FRAME_BUDGET, *PUSB2_FRAME_BUDGET;
505
506 typedef struct _USB2_TT {
507 PUSB2_HC_EXTENSION HcExtension;
508 ULONG DelayTime;
509 ULONG MaxTime;
510 USB2_TT_ENDPOINT IntEndpoint[USB2_FRAMES];
511 USB2_TT_ENDPOINT IsoEndpoint[USB2_FRAMES];
512 USB2_FRAME_BUDGET FrameBudget[USB2_FRAMES];
513 ULONG NumStartSplits[USB2_FRAMES][USB2_MICROFRAMES];
514 ULONG TimeCS[USB2_FRAMES][USB2_MICROFRAMES];
515 } USB2_TT, *PUSB2_TT;
516
517 typedef struct _USB2_TT_EXTENSION {
518 PDEVICE_OBJECT RootHubPdo;
519 ULONG Flags;
520 ULONG BusBandwidth;
521 ULONG Bandwidth[USB2_FRAMES];
522 ULONG MaxBandwidth;
523 ULONG MinBandwidth;
524 USHORT DeviceAddress;
525 USHORT TtNumber;
526 LIST_ENTRY TtList;
527 LIST_ENTRY Link;
528 USB2_TT Tt;
529 } USB2_TT_EXTENSION, *PUSB2_TT_EXTENSION;
530
531 typedef struct _USB2_HC_EXTENSION {
532 ULONG MaxHsBusAllocation;
533 ULONG HcDelayTime;
534 ULONG TimeUsed[USB2_FRAMES][USB2_MICROFRAMES];
535 USB2_TT HcTt;
536 } USB2_HC_EXTENSION, *PUSB2_HC_EXTENSION;
537
538 /* usbport.c */
539 NTSTATUS
540 NTAPI
541 USBPORT_USBDStatusToNtStatus(
542 IN PURB Urb,
543 IN USBD_STATUS USBDStatus);
544
545 NTSTATUS
546 NTAPI
547 USBPORT_Wait(
548 IN PVOID MiniPortExtension,
549 IN ULONG Milliseconds);
550
551 VOID
552 NTAPI
553 USBPORT_TransferFlushDpc(
554 IN PRKDPC Dpc,
555 IN PVOID DeferredContext,
556 IN PVOID SystemArgument1,
557 IN PVOID SystemArgument2);
558
559 NTSTATUS
560 NTAPI
561 USBPORT_CreateWorkerThread(
562 IN PDEVICE_OBJECT FdoDevice);
563
564 BOOLEAN
565 NTAPI
566 USBPORT_StartTimer(
567 IN PDEVICE_OBJECT FdoDevice,
568 IN ULONG Time);
569
570 PUSBPORT_COMMON_BUFFER_HEADER
571 NTAPI
572 USBPORT_AllocateCommonBuffer(
573 IN PDEVICE_OBJECT FdoDevice,
574 IN SIZE_T BufferLength);
575
576 VOID
577 NTAPI
578 USBPORT_FreeCommonBuffer(
579 IN PDEVICE_OBJECT FdoDevice,
580 IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer);
581
582 USBD_STATUS
583 NTAPI
584 USBPORT_AllocateTransfer(
585 IN PDEVICE_OBJECT FdoDevice,
586 IN PURB Urb,
587 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
588 IN PIRP Irp,
589 IN PRKEVENT Event);
590
591 VOID
592 NTAPI
593 USBPORT_FlushMapTransfers(
594 IN PDEVICE_OBJECT FdoDevice);
595
596 VOID
597 NTAPI
598 USBPORT_IsrDpc(
599 IN PRKDPC Dpc,
600 IN PVOID DeferredContext,
601 IN PVOID SystemArgument1,
602 IN PVOID SystemArgument2);
603
604 BOOLEAN
605 NTAPI
606 USBPORT_InterruptService(
607 IN PKINTERRUPT Interrupt,
608 IN PVOID ServiceContext);
609
610 VOID
611 NTAPI
612 USBPORT_SignalWorkerThread(
613 IN PDEVICE_OBJECT FdoDevice);
614
615 VOID
616 NTAPI
617 USBPORT_CompleteTransfer(
618 IN PURB Urb,
619 IN USBD_STATUS TransferStatus);
620
621 VOID
622 NTAPI
623 USBPORT_DpcHandler(
624 IN PDEVICE_OBJECT FdoDevice);
625
626 VOID
627 NTAPI
628 USBPORT_WorkerRequestDpc(
629 IN PRKDPC Dpc,
630 IN PVOID DeferredContext,
631 IN PVOID SystemArgument1,
632 IN PVOID SystemArgument2);
633
634 BOOLEAN
635 NTAPI
636 USBPORT_QueueDoneTransfer(
637 IN PUSBPORT_TRANSFER Transfer,
638 IN USBD_STATUS USBDStatus);
639
640 VOID
641 NTAPI
642 USBPORT_MiniportInterrupts(
643 IN PDEVICE_OBJECT FdoDevice,
644 IN BOOLEAN IsEnable);
645
646 NTSTATUS
647 NTAPI
648 USBPORT_SetRegistryKeyValue(
649 IN PDEVICE_OBJECT DeviceObject,
650 IN BOOL UseDriverKey,
651 IN ULONG Type,
652 IN PCWSTR ValueNameString,
653 IN PVOID Data,
654 IN ULONG DataSize);
655
656 NTSTATUS
657 NTAPI
658 USBPORT_GetRegistryKeyValueFullInfo(
659 IN PDEVICE_OBJECT FdoDevice,
660 IN PDEVICE_OBJECT PdoDevice,
661 IN BOOL UseDriverKey,
662 IN PCWSTR SourceString,
663 IN ULONG LengthStr,
664 IN PVOID Buffer,
665 IN ULONG NumberOfBytes);
666
667 VOID
668 NTAPI
669 USBPORT_AddUSB1Fdo(
670 IN PDEVICE_OBJECT FdoDevice);
671
672 VOID
673 NTAPI
674 USBPORT_AddUSB2Fdo(
675 IN PDEVICE_OBJECT FdoDevice);
676
677 VOID
678 NTAPI
679 USBPORT_RemoveUSBxFdo(
680 IN PDEVICE_OBJECT FdoDevice);
681
682 PDEVICE_OBJECT
683 NTAPI
684 USBPORT_FindUSB2Controller(
685 IN PDEVICE_OBJECT FdoDevice);
686
687 PDEVICE_RELATIONS
688 NTAPI
689 USBPORT_FindCompanionControllers(
690 IN PDEVICE_OBJECT USB2FdoDevice,
691 IN BOOLEAN IsObRefer,
692 IN BOOLEAN IsFDOsReturned);
693
694 VOID
695 NTAPI
696 USBPORT_InvalidateControllerHandler(
697 IN PDEVICE_OBJECT FdoDevice,
698 IN ULONG Type);
699
700 VOID
701 NTAPI
702 USBPORT_DoneTransfer(
703 IN PUSBPORT_TRANSFER Transfer);
704
705 /* debug.c */
706 ULONG
707 NTAPI
708 USBPORT_DbgPrint(
709 IN PVOID MiniPortExtension,
710 IN ULONG Level,
711 IN PCH Format,
712 ...);
713
714 ULONG
715 NTAPI
716 USBPORT_TestDebugBreak(
717 IN PVOID MiniPortExtension);
718
719 ULONG
720 NTAPI
721 USBPORT_AssertFailure(
722 PVOID MiniPortExtension,
723 PVOID FailedAssertion,
724 PVOID FileName,
725 ULONG LineNumber,
726 PCHAR Message);
727
728 VOID
729 NTAPI
730 USBPORT_BugCheck(
731 IN PVOID MiniPortExtension);
732
733 ULONG
734 NTAPI
735 USBPORT_LogEntry(
736 IN PVOID MiniPortExtension,
737 IN ULONG DriverTag,
738 IN ULONG EnumTag,
739 IN ULONG P1,
740 IN ULONG P2,
741 IN ULONG P3);
742
743 VOID
744 NTAPI
745 USBPORT_DumpingDeviceDescriptor(
746 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
747
748 VOID
749 NTAPI
750 USBPORT_DumpingConfiguration(
751 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor);
752
753 VOID
754 NTAPI
755 USBPORT_DumpingCapabilities(
756 IN PDEVICE_CAPABILITIES Capabilities);
757
758 VOID
759 NTAPI
760 USBPORT_DumpingSetupPacket(
761 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket);
762
763 VOID
764 NTAPI
765 USBPORT_DumpingURB(
766 IN PURB Urb);
767
768 VOID
769 NTAPI
770 USBPORT_DumpingIDs(
771 IN PVOID Buffer);
772
773 /* device.c */
774 NTSTATUS
775 NTAPI
776 USBPORT_HandleSelectConfiguration(
777 IN PDEVICE_OBJECT FdoDevice,
778 IN PIRP Irp,
779 IN PURB Urb);
780
781 VOID
782 NTAPI
783 USBPORT_AddDeviceHandle(
784 IN PDEVICE_OBJECT FdoDevice,
785 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
786
787 VOID
788 NTAPI
789 USBPORT_RemoveDeviceHandle(
790 IN PDEVICE_OBJECT FdoDevice,
791 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
792
793 BOOLEAN
794 NTAPI
795 USBPORT_ValidateDeviceHandle(
796 IN PDEVICE_OBJECT FdoDevice,
797 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
798
799 NTSTATUS
800 NTAPI
801 USBPORT_CreateDevice(
802 IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
803 IN PDEVICE_OBJECT FdoDevice,
804 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
805 IN USHORT PortStatus,
806 IN USHORT Port);
807
808 NTSTATUS
809 NTAPI
810 USBPORT_InitializeDevice(
811 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
812 IN PDEVICE_OBJECT FdoDevice);
813
814 NTSTATUS
815 NTAPI
816 USBPORT_GetUsbDescriptor(
817 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
818 IN PDEVICE_OBJECT FdoDevice,
819 IN UCHAR Type,
820 IN PUCHAR ConfigDesc,
821 IN PULONG ConfigDescSize);
822
823 NTSTATUS
824 NTAPI
825 USBPORT_HandleSelectInterface(
826 IN PDEVICE_OBJECT FdoDevice,
827 IN PIRP Irp,
828 IN PURB Urb);
829
830 NTSTATUS
831 NTAPI
832 USBPORT_RemoveDevice(
833 IN PDEVICE_OBJECT FdoDevice,
834 IN OUT PUSBPORT_DEVICE_HANDLE DeviceHandle,
835 IN ULONG Flags);
836
837 NTSTATUS
838 NTAPI
839 USBPORT_SendSetupPacket(
840 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
841 IN PDEVICE_OBJECT FdoDevice,
842 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket,
843 IN PVOID Buffer,
844 IN ULONG Length,
845 IN OUT PULONG TransferedLen,
846 IN OUT PUSBD_STATUS pUSBDStatus);
847
848 NTSTATUS
849 NTAPI
850 USBPORT_RestoreDevice(
851 IN PDEVICE_OBJECT FdoDevice,
852 IN OUT PUSBPORT_DEVICE_HANDLE OldDeviceHandle,
853 IN OUT PUSBPORT_DEVICE_HANDLE NewDeviceHandle);
854
855 NTSTATUS
856 NTAPI
857 USBPORT_Initialize20Hub(
858 IN PDEVICE_OBJECT FdoDevice,
859 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
860 IN ULONG TtCount);
861
862 /* endpoint.c */
863 NTSTATUS
864 NTAPI
865 USBPORT_OpenPipe(
866 IN PDEVICE_OBJECT FdoDevice,
867 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
868 IN PUSBPORT_PIPE_HANDLE PipeHandle,
869 IN PUSBD_STATUS UsbdStatus);
870
871 MPSTATUS
872 NTAPI
873 MiniportOpenEndpoint(
874 IN PDEVICE_OBJECT FdoDevice,
875 IN PUSBPORT_ENDPOINT Endpoint);
876
877 NTSTATUS
878 NTAPI
879 USBPORT_ReopenPipe(
880 IN PDEVICE_OBJECT FdoDevice,
881 IN PUSBPORT_ENDPOINT Endpoint);
882
883 VOID
884 NTAPI
885 USBPORT_ClosePipe(
886 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
887 IN PDEVICE_OBJECT FdoDevice,
888 IN PUSBPORT_PIPE_HANDLE PipeHandle);
889
890 VOID
891 NTAPI
892 MiniportCloseEndpoint(
893 IN PDEVICE_OBJECT FdoDevice,
894 IN PUSBPORT_ENDPOINT Endpoint);
895
896 VOID
897 NTAPI
898 USBPORT_AddPipeHandle(
899 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
900 IN PUSBPORT_PIPE_HANDLE PipeHandle);
901
902 VOID
903 NTAPI
904 USBPORT_RemovePipeHandle(
905 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
906 IN PUSBPORT_PIPE_HANDLE PipeHandle);
907
908 BOOLEAN
909 NTAPI
910 USBPORT_ValidatePipeHandle(
911 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
912 IN PUSBPORT_PIPE_HANDLE PipeHandle);
913
914 VOID
915 NTAPI
916 USBPORT_FlushClosedEndpointList(
917 IN PDEVICE_OBJECT FdoDevice);
918
919 VOID
920 NTAPI
921 USBPORT_SetEndpointState(
922 IN PUSBPORT_ENDPOINT Endpoint,
923 IN ULONG State);
924
925 ULONG
926 NTAPI
927 USBPORT_GetEndpointState(
928 IN PUSBPORT_ENDPOINT Endpoint);
929
930 VOID
931 NTAPI
932 USBPORT_InvalidateEndpointHandler(
933 IN PDEVICE_OBJECT FdoDevice,
934 IN PUSBPORT_ENDPOINT Endpoint,
935 IN ULONG Type);
936
937 BOOLEAN
938 NTAPI
939 USBPORT_EndpointWorker(
940 IN PUSBPORT_ENDPOINT Endpoint,
941 IN BOOLEAN Flag);
942
943 VOID
944 NTAPI
945 USBPORT_NukeAllEndpoints(
946 IN PDEVICE_OBJECT FdoDevice);
947
948 BOOLEAN
949 NTAPI
950 USBPORT_EndpointHasQueuedTransfers(
951 IN PDEVICE_OBJECT FdoDevice,
952 IN PUSBPORT_ENDPOINT Endpoint,
953 IN PULONG TransferCount);
954
955 /* iface.c */
956 NTSTATUS
957 NTAPI
958 USBPORT_PdoQueryInterface(
959 IN PDEVICE_OBJECT FdoDevice,
960 IN PDEVICE_OBJECT PdoDevice,
961 IN PIRP Irp);
962
963 /* ioctl.c */
964 NTSTATUS
965 NTAPI
966 USBPORT_PdoDeviceControl(
967 PDEVICE_OBJECT PdoDevice,
968 PIRP Irp);
969
970 NTSTATUS
971 NTAPI
972 USBPORT_FdoDeviceControl(
973 PDEVICE_OBJECT FdoDevice,
974 PIRP Irp);
975
976 NTSTATUS
977 NTAPI
978 USBPORT_FdoInternalDeviceControl(
979 IN PDEVICE_OBJECT FdoDevice,
980 IN PIRP Irp);
981
982 NTSTATUS
983 NTAPI
984 USBPORT_PdoInternalDeviceControl(
985 IN PDEVICE_OBJECT FdoDevice,
986 IN PIRP Irp);
987
988 NTSTATUS
989 NTAPI
990 USBPORT_GetSymbolicName(
991 IN PDEVICE_OBJECT RootHubPdo,
992 IN PUNICODE_STRING DestinationString);
993
994 /* iso.c */
995 USBD_STATUS
996 NTAPI
997 USBPORT_InitializeIsoTransfer(
998 IN PDEVICE_OBJECT FdoDevice,
999 IN struct _URB_ISOCH_TRANSFER * Urb,
1000 IN PUSBPORT_TRANSFER Transfer);
1001
1002 ULONG
1003 NTAPI
1004 USBPORT_CompleteIsoTransfer(
1005 IN PVOID MiniPortExtension,
1006 IN PVOID MiniPortEndpoint,
1007 IN PVOID TransferParameters,
1008 IN ULONG TransferLength);
1009
1010 /* pnp.c */
1011 NTSTATUS
1012 NTAPI
1013 USBPORT_FdoPnP(
1014 IN PDEVICE_OBJECT FdoDevice,
1015 IN PIRP Irp);
1016
1017 NTSTATUS
1018 NTAPI
1019 USBPORT_PdoPnP(
1020 IN PDEVICE_OBJECT FdoDevice,
1021 IN PIRP Irp);
1022
1023 /* power.c */
1024 NTSTATUS
1025 NTAPI
1026 USBPORT_PdoPower(
1027 IN PDEVICE_OBJECT PdoDevice,
1028 IN PIRP Irp);
1029
1030 NTSTATUS
1031 NTAPI
1032 USBPORT_FdoPower(
1033 IN PDEVICE_OBJECT FdoDevice,
1034 IN PIRP Irp);
1035
1036 NTSTATUS
1037 NTAPI
1038 USBPORT_IdleNotification(
1039 IN PDEVICE_OBJECT PdoDevice,
1040 IN PIRP Irp);
1041
1042 VOID
1043 NTAPI
1044 USBPORT_AdjustDeviceCapabilities(
1045 IN PDEVICE_OBJECT FdoDevice,
1046 IN PDEVICE_OBJECT PdoDevice);
1047
1048 VOID
1049 NTAPI
1050 USBPORT_DoIdleNotificationCallback(
1051 IN PVOID Context);
1052
1053 VOID
1054 NTAPI
1055 USBPORT_CompletePdoWaitWake(
1056 IN PDEVICE_OBJECT FdoDevice);
1057
1058 VOID
1059 NTAPI
1060 USBPORT_DoSetPowerD0(
1061 IN PDEVICE_OBJECT FdoDevice);
1062
1063 VOID
1064 NTAPI
1065 USBPORT_HcWakeDpc(
1066 IN PRKDPC Dpc,
1067 IN PVOID DeferredContext,
1068 IN PVOID SystemArgument1,
1069 IN PVOID SystemArgument2);
1070
1071 VOID
1072 NTAPI
1073 USBPORT_HcQueueWakeDpc(
1074 IN PDEVICE_OBJECT FdoDevice);
1075
1076 /* queue.c */
1077 VOID
1078 NTAPI
1079 USBPORT_InsertIdleIrp(
1080 IN PIO_CSQ Csq,
1081 IN PIRP Irp);
1082
1083 VOID
1084 NTAPI
1085 USBPORT_RemoveIdleIrp(
1086 IN PIO_CSQ Csq,
1087 IN PIRP Irp);
1088
1089 PIRP
1090 NTAPI
1091 USBPORT_PeekNextIdleIrp(
1092 IN PIO_CSQ Csq,
1093 IN PIRP Irp,
1094 IN PVOID PeekContext);
1095
1096 VOID
1097 NTAPI
1098 USBPORT_AcquireIdleLock(
1099 IN PIO_CSQ Csq,
1100 IN PKIRQL Irql);
1101
1102 VOID
1103 NTAPI
1104 USBPORT_ReleaseIdleLock(
1105 IN PIO_CSQ Csq,
1106 IN KIRQL Irql);
1107
1108 VOID
1109 NTAPI
1110 USBPORT_CompleteCanceledIdleIrp(
1111 IN PIO_CSQ Csq,
1112 IN PIRP Irp);
1113
1114 VOID
1115 NTAPI
1116 USBPORT_InsertBadRequest(
1117 IN PIO_CSQ Csq,
1118 IN PIRP Irp);
1119
1120 VOID
1121 NTAPI
1122 USBPORT_RemoveBadRequest(
1123 IN PIO_CSQ Csq,
1124 IN PIRP Irp);
1125
1126 PIRP
1127 NTAPI
1128 USBPORT_PeekNextBadRequest(
1129 IN PIO_CSQ Csq,
1130 IN PIRP Irp,
1131 IN PVOID PeekContext);
1132
1133 VOID
1134 NTAPI
1135 USBPORT_AcquireBadRequestLock(
1136 IN PIO_CSQ Csq,
1137 IN PKIRQL Irql);
1138
1139 VOID
1140 NTAPI
1141 USBPORT_ReleaseBadRequestLock(
1142 IN PIO_CSQ Csq,
1143 IN KIRQL Irql);
1144
1145 VOID
1146 NTAPI
1147 USBPORT_CompleteCanceledBadRequest(
1148 IN PIO_CSQ Csq,
1149 IN PIRP Irp);
1150
1151 VOID
1152 NTAPI
1153 USBPORT_InsertIrpInTable(
1154 IN PUSBPORT_IRP_TABLE IrpTable,
1155 IN PIRP Irp);
1156
1157 PIRP
1158 NTAPI
1159 USBPORT_RemovePendingTransferIrp(
1160 IN PDEVICE_OBJECT FdoDevice,
1161 IN PIRP Irp);
1162
1163 PIRP
1164 NTAPI
1165 USBPORT_RemoveActiveTransferIrp(
1166 IN PDEVICE_OBJECT FdoDevice,
1167 IN PIRP Irp);
1168
1169 VOID
1170 NTAPI
1171 USBPORT_FindUrbInIrpTable(
1172 IN PUSBPORT_IRP_TABLE IrpTable,
1173 IN PURB Urb,
1174 IN PIRP Irp);
1175
1176 VOID
1177 NTAPI
1178 USBPORT_CancelActiveTransferIrp(
1179 IN PDEVICE_OBJECT DeviceObject,
1180 IN PIRP Irp);
1181
1182 VOID
1183 NTAPI
1184 USBPORT_FlushAbortList(
1185 IN PUSBPORT_ENDPOINT Endpoint);
1186
1187 VOID
1188 NTAPI
1189 USBPORT_FlushCancelList(
1190 IN PUSBPORT_ENDPOINT Endpoint);
1191
1192 VOID
1193 NTAPI
1194 USBPORT_QueueTransferUrb(
1195 IN PURB Urb);
1196
1197 VOID
1198 NTAPI
1199 USBPORT_FlushAllEndpoints(
1200 IN PDEVICE_OBJECT FdoDevice);
1201
1202 VOID
1203 NTAPI
1204 USBPORT_FlushPendingTransfers(
1205 IN PUSBPORT_ENDPOINT Endpoint);
1206
1207 BOOLEAN
1208 NTAPI
1209 USBPORT_QueueActiveUrbToEndpoint(
1210 IN PUSBPORT_ENDPOINT Endpoint,
1211 IN PURB Urb);
1212
1213 VOID
1214 NTAPI
1215 USBPORT_FlushController(
1216 IN PDEVICE_OBJECT FdoDevice);
1217
1218 VOID
1219 NTAPI
1220 USBPORT_BadRequestFlush(
1221 IN PDEVICE_OBJECT FdoDevice);
1222
1223 VOID
1224 NTAPI
1225 USBPORT_AbortEndpoint(
1226 IN PDEVICE_OBJECT FdoDevice,
1227 IN PUSBPORT_ENDPOINT Endpoint,
1228 IN PIRP Irp);
1229
1230 /* roothub.c */
1231 VOID
1232 NTAPI
1233 USBPORT_RootHubEndpointWorker(
1234 PUSBPORT_ENDPOINT Endpoint);
1235
1236 NTSTATUS
1237 NTAPI
1238 USBPORT_RootHubCreateDevice(
1239 IN PDEVICE_OBJECT FdoDevice,
1240 IN PDEVICE_OBJECT PdoDevice);
1241
1242 ULONG
1243 NTAPI
1244 USBPORT_InvalidateRootHub(
1245 PVOID MiniPortExtension);
1246
1247 VOID
1248 NTAPI
1249 USBPORT_RootHubPowerAndChirpAllCcPorts(
1250 IN PDEVICE_OBJECT FdoDevice);
1251
1252 /* trfsplit.c */
1253 VOID
1254 NTAPI
1255 USBPORT_SplitTransfer(
1256 IN PDEVICE_OBJECT FdoDevice,
1257 IN PUSBPORT_ENDPOINT Endpoint,
1258 IN PUSBPORT_TRANSFER Transfer,
1259 IN PLIST_ENTRY List);
1260
1261 VOID
1262 NTAPI
1263 USBPORT_DoneSplitTransfer(
1264 IN PUSBPORT_TRANSFER SplitTransfer);
1265
1266 VOID
1267 NTAPI
1268 USBPORT_CancelSplitTransfer(
1269 IN PUSBPORT_TRANSFER SplitTransfer);
1270
1271 /* urb.c */
1272 NTSTATUS
1273 NTAPI
1274 USBPORT_HandleSubmitURB(
1275 IN PDEVICE_OBJECT PdoDevice,
1276 IN PIRP Irp,
1277 IN PURB Urb);
1278
1279 /* usb2.c */
1280 BOOLEAN
1281 NTAPI
1282 USBPORT_AllocateBandwidthUSB2(
1283 IN PDEVICE_OBJECT FdoDevice,
1284 IN PUSBPORT_ENDPOINT Endpoint);
1285
1286 VOID
1287 NTAPI
1288 USBPORT_FreeBandwidthUSB2(
1289 IN PDEVICE_OBJECT FdoDevice,
1290 IN PUSBPORT_ENDPOINT Endpoint);
1291
1292 #endif /* USBPORT_H__ */