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