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