[BOOTLIB]
[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
359 /* Miniport extension should be aligned on 0x100 */
360 #if !defined(_M_X64)
361 ULONG Padded[34];
362 #else
363 ULONG Padded[0];
364 #endif
365
366 } USBPORT_DEVICE_EXTENSION, *PUSBPORT_DEVICE_EXTENSION;
367
368 #if !defined(_M_X64)
369 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x400);
370 #else
371 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION) == 0x600);
372 #endif
373
374 typedef struct _USBPORT_RH_DESCRIPTORS {
375 USB_DEVICE_DESCRIPTOR DeviceDescriptor;
376 USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor;
377 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
378 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
379 USB_HUB_DESCRIPTOR Descriptor; // Size may be: 7 + 2[1..32] (7 + 2..64)
380 } USBPORT_RH_DESCRIPTORS, *PUSBPORT_RH_DESCRIPTORS;
381
382 typedef struct _USBPORT_RHDEVICE_EXTENSION {
383 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension;
384 ULONG Flags;
385 PDEVICE_OBJECT FdoDevice;
386 ULONG PdoNameNumber;
387 USBPORT_DEVICE_HANDLE DeviceHandle;
388 PUSBPORT_RH_DESCRIPTORS RootHubDescriptors;
389 PUSBPORT_ENDPOINT Endpoint;
390 ULONG ConfigurationValue;
391 PRH_INIT_CALLBACK RootHubInitCallback;
392 PVOID RootHubInitContext;
393 DEVICE_CAPABILITIES Capabilities;
394 PIRP WakeIrp;
395 } USBPORT_RHDEVICE_EXTENSION, *PUSBPORT_RHDEVICE_EXTENSION;
396
397 typedef struct _USBPORT_ASYNC_CALLBACK_DATA {
398 ULONG Reserved;
399 PDEVICE_OBJECT FdoDevice;
400 KTIMER AsyncTimer;
401 KDPC AsyncTimerDpc;
402 ASYNC_TIMER_CALLBACK *CallbackFunction;
403 ULONG CallbackContext;
404 } USBPORT_ASYNC_CALLBACK_DATA, *PUSBPORT_ASYNC_CALLBACK_DATA;
405
406 C_ASSERT(sizeof(USBPORT_ASYNC_CALLBACK_DATA) == 16 + 18 * sizeof(PVOID));
407
408 typedef struct _TIMER_WORK_QUEUE_ITEM {
409 WORK_QUEUE_ITEM WqItem;
410 PDEVICE_OBJECT FdoDevice;
411 ULONG Context;
412 } TIMER_WORK_QUEUE_ITEM, *PTIMER_WORK_QUEUE_ITEM;
413
414 /* usbport.c */
415 NTSTATUS
416 NTAPI
417 USBPORT_USBDStatusToNtStatus(
418 IN PURB Urb,
419 IN USBD_STATUS USBDStatus);
420
421 NTSTATUS
422 NTAPI
423 USBPORT_Wait(
424 IN PVOID MiniPortExtension,
425 IN ULONG Milliseconds);
426
427 VOID
428 NTAPI
429 USBPORT_TransferFlushDpc(
430 IN PRKDPC Dpc,
431 IN PVOID DeferredContext,
432 IN PVOID SystemArgument1,
433 IN PVOID SystemArgument2);
434
435 NTSTATUS
436 NTAPI
437 USBPORT_CreateWorkerThread(
438 IN PDEVICE_OBJECT FdoDevice);
439
440 BOOLEAN
441 NTAPI
442 USBPORT_StartTimer(
443 IN PDEVICE_OBJECT FdoDevice,
444 IN ULONG Time);
445
446 PUSBPORT_COMMON_BUFFER_HEADER
447 NTAPI
448 USBPORT_AllocateCommonBuffer(
449 IN PDEVICE_OBJECT FdoDevice,
450 IN SIZE_T BufferLength);
451
452 VOID
453 NTAPI
454 USBPORT_FreeCommonBuffer(
455 IN PDEVICE_OBJECT FdoDevice,
456 IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer);
457
458 USBD_STATUS
459 NTAPI
460 USBPORT_AllocateTransfer(
461 IN PDEVICE_OBJECT FdoDevice,
462 IN PURB Urb,
463 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
464 IN PIRP Irp,
465 IN PRKEVENT Event);
466
467 VOID
468 NTAPI
469 USBPORT_FlushMapTransfers(
470 IN PDEVICE_OBJECT FdoDevice);
471
472 VOID
473 NTAPI
474 USBPORT_IsrDpc(
475 IN PRKDPC Dpc,
476 IN PVOID DeferredContext,
477 IN PVOID SystemArgument1,
478 IN PVOID SystemArgument2);
479
480 BOOLEAN
481 NTAPI
482 USBPORT_InterruptService(
483 IN PKINTERRUPT Interrupt,
484 IN PVOID ServiceContext);
485
486 VOID
487 NTAPI
488 USBPORT_SignalWorkerThread(
489 IN PDEVICE_OBJECT FdoDevice);
490
491 VOID
492 NTAPI
493 USBPORT_CompleteTransfer(
494 IN PURB Urb,
495 IN USBD_STATUS TransferStatus);
496
497 VOID
498 NTAPI
499 USBPORT_DpcHandler(
500 IN PDEVICE_OBJECT FdoDevice);
501
502 VOID
503 NTAPI
504 USBPORT_WorkerRequestDpc(
505 IN PRKDPC Dpc,
506 IN PVOID DeferredContext,
507 IN PVOID SystemArgument1,
508 IN PVOID SystemArgument2);
509
510 BOOLEAN
511 NTAPI
512 USBPORT_QueueDoneTransfer(
513 IN PUSBPORT_TRANSFER Transfer,
514 IN USBD_STATUS USBDStatus);
515
516 VOID
517 NTAPI
518 USBPORT_MiniportInterrupts(
519 IN PDEVICE_OBJECT FdoDevice,
520 IN BOOLEAN IsEnable);
521
522 NTSTATUS
523 NTAPI
524 USBPORT_SetRegistryKeyValue(
525 IN PDEVICE_OBJECT DeviceObject,
526 IN BOOL UseDriverKey,
527 IN ULONG Type,
528 IN PCWSTR ValueNameString,
529 IN PVOID Data,
530 IN ULONG DataSize);
531
532 NTSTATUS
533 NTAPI
534 USBPORT_GetRegistryKeyValueFullInfo(
535 IN PDEVICE_OBJECT FdoDevice,
536 IN PDEVICE_OBJECT PdoDevice,
537 IN BOOL UseDriverKey,
538 IN PCWSTR SourceString,
539 IN ULONG LengthStr,
540 IN PVOID Buffer,
541 IN ULONG NumberOfBytes);
542
543 VOID
544 NTAPI
545 USBPORT_AddUSB1Fdo(
546 IN PDEVICE_OBJECT FdoDevice);
547
548 VOID
549 NTAPI
550 USBPORT_AddUSB2Fdo(
551 IN PDEVICE_OBJECT FdoDevice);
552
553 VOID
554 NTAPI
555 USBPORT_RemoveUSBxFdo(
556 IN PDEVICE_OBJECT FdoDevice);
557
558 PDEVICE_OBJECT
559 NTAPI
560 USBPORT_FindUSB2Controller(
561 IN PDEVICE_OBJECT FdoDevice);
562
563 PDEVICE_RELATIONS
564 NTAPI
565 USBPORT_FindCompanionControllers(
566 IN PDEVICE_OBJECT USB2FdoDevice,
567 IN BOOLEAN IsObRefer,
568 IN BOOLEAN IsFDOsReturned);
569
570 VOID
571 NTAPI
572 USBPORT_InvalidateControllerHandler(
573 IN PDEVICE_OBJECT FdoDevice,
574 IN ULONG Type);
575
576 /* debug.c */
577 ULONG
578 NTAPI
579 USBPORT_DbgPrint(
580 IN PVOID MiniPortExtension,
581 IN ULONG Level,
582 IN PCH Format,
583 ...);
584
585 ULONG
586 NTAPI
587 USBPORT_TestDebugBreak(
588 IN PVOID MiniPortExtension);
589
590 ULONG
591 NTAPI
592 USBPORT_AssertFailure(
593 PVOID MiniPortExtension,
594 PVOID FailedAssertion,
595 PVOID FileName,
596 ULONG LineNumber,
597 PCHAR Message);
598
599 VOID
600 NTAPI
601 USBPORT_BugCheck(
602 IN PVOID MiniPortExtension);
603
604 ULONG
605 NTAPI
606 USBPORT_LogEntry(
607 IN PVOID MiniPortExtension,
608 IN ULONG DriverTag,
609 IN ULONG EnumTag,
610 IN ULONG P1,
611 IN ULONG P2,
612 IN ULONG P3);
613
614 VOID
615 NTAPI
616 USBPORT_DumpingDeviceDescriptor(
617 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
618
619 VOID
620 NTAPI
621 USBPORT_DumpingConfiguration(
622 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor);
623
624 VOID
625 NTAPI
626 USBPORT_DumpingCapabilities(
627 IN PDEVICE_CAPABILITIES Capabilities);
628
629 VOID
630 NTAPI
631 USBPORT_DumpingSetupPacket(
632 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket);
633
634 VOID
635 NTAPI
636 USBPORT_DumpingURB(
637 IN PURB Urb);
638
639 VOID
640 NTAPI
641 USBPORT_DumpingIDs(
642 IN PVOID Buffer);
643
644 /* device.c */
645 NTSTATUS
646 NTAPI
647 USBPORT_HandleSelectConfiguration(
648 IN PDEVICE_OBJECT FdoDevice,
649 IN PIRP Irp,
650 IN PURB Urb);
651
652 VOID
653 NTAPI
654 USBPORT_AddDeviceHandle(
655 IN PDEVICE_OBJECT FdoDevice,
656 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
657
658 VOID
659 NTAPI
660 USBPORT_RemoveDeviceHandle(
661 IN PDEVICE_OBJECT FdoDevice,
662 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
663
664 BOOLEAN
665 NTAPI
666 USBPORT_ValidateDeviceHandle(
667 IN PDEVICE_OBJECT FdoDevice,
668 IN PUSBPORT_DEVICE_HANDLE DeviceHandle);
669
670 NTSTATUS
671 NTAPI
672 USBPORT_CreateDevice(
673 IN OUT PUSB_DEVICE_HANDLE *pUsbdDeviceHandle,
674 IN PDEVICE_OBJECT FdoDevice,
675 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
676 IN USHORT PortStatus,
677 IN USHORT Port);
678
679 NTSTATUS
680 NTAPI
681 USBPORT_InitializeDevice(
682 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
683 IN PDEVICE_OBJECT FdoDevice);
684
685 NTSTATUS
686 NTAPI
687 USBPORT_GetUsbDescriptor(
688 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
689 IN PDEVICE_OBJECT FdoDevice,
690 IN UCHAR Type,
691 IN PUCHAR ConfigDesc,
692 IN PULONG ConfigDescSize);
693
694 NTSTATUS
695 NTAPI
696 USBPORT_HandleSelectInterface(
697 IN PDEVICE_OBJECT FdoDevice,
698 IN PIRP Irp,
699 IN PURB Urb);
700
701 NTSTATUS
702 NTAPI
703 USBPORT_RemoveDevice(
704 IN PDEVICE_OBJECT FdoDevice,
705 IN OUT PUSBPORT_DEVICE_HANDLE DeviceHandle,
706 IN ULONG Flags);
707
708 NTSTATUS
709 NTAPI
710 USBPORT_SendSetupPacket(
711 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
712 IN PDEVICE_OBJECT FdoDevice,
713 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket,
714 IN PVOID Buffer,
715 IN ULONG Length,
716 IN OUT PULONG TransferedLen,
717 IN OUT PUSBD_STATUS pUSBDStatus);
718
719 NTSTATUS
720 NTAPI
721 USBPORT_RestoreDevice(
722 IN PDEVICE_OBJECT FdoDevice,
723 IN OUT PUSBPORT_DEVICE_HANDLE OldDeviceHandle,
724 IN OUT PUSBPORT_DEVICE_HANDLE NewDeviceHandle);
725
726 NTSTATUS
727 NTAPI
728 USBPORT_Initialize20Hub(
729 IN PDEVICE_OBJECT FdoDevice,
730 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle,
731 IN ULONG TtCount);
732
733 /* endpoint.c */
734 NTSTATUS
735 NTAPI
736 USBPORT_OpenPipe(
737 IN PDEVICE_OBJECT FdoDevice,
738 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
739 IN PUSBPORT_PIPE_HANDLE PipeHandle,
740 IN PUSBD_STATUS UsbdStatus);
741
742 MPSTATUS
743 NTAPI
744 MiniportOpenEndpoint(
745 IN PDEVICE_OBJECT FdoDevice,
746 IN PUSBPORT_ENDPOINT Endpoint);
747
748 NTSTATUS
749 NTAPI
750 USBPORT_ReopenPipe(
751 IN PDEVICE_OBJECT FdoDevice,
752 IN PUSBPORT_ENDPOINT Endpoint);
753
754 VOID
755 NTAPI
756 USBPORT_ClosePipe(
757 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
758 IN PDEVICE_OBJECT FdoDevice,
759 IN PUSBPORT_PIPE_HANDLE PipeHandle);
760
761 VOID
762 NTAPI
763 MiniportCloseEndpoint(
764 IN PDEVICE_OBJECT FdoDevice,
765 IN PUSBPORT_ENDPOINT Endpoint);
766
767 VOID
768 NTAPI
769 USBPORT_AddPipeHandle(
770 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
771 IN PUSBPORT_PIPE_HANDLE PipeHandle);
772
773 VOID
774 NTAPI
775 USBPORT_RemovePipeHandle(
776 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
777 IN PUSBPORT_PIPE_HANDLE PipeHandle);
778
779 BOOLEAN
780 NTAPI
781 USBPORT_ValidatePipeHandle(
782 IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
783 IN PUSBPORT_PIPE_HANDLE PipeHandle);
784
785 VOID
786 NTAPI
787 USBPORT_FlushClosedEndpointList(
788 IN PDEVICE_OBJECT FdoDevice);
789
790 VOID
791 NTAPI
792 USBPORT_SetEndpointState(
793 IN PUSBPORT_ENDPOINT Endpoint,
794 IN ULONG State);
795
796 ULONG
797 NTAPI
798 USBPORT_GetEndpointState(
799 IN PUSBPORT_ENDPOINT Endpoint);
800
801 VOID
802 NTAPI
803 USBPORT_InvalidateEndpointHandler(
804 IN PDEVICE_OBJECT FdoDevice,
805 IN PUSBPORT_ENDPOINT Endpoint,
806 IN ULONG Type);
807
808 BOOLEAN
809 NTAPI
810 USBPORT_EndpointWorker(
811 IN PUSBPORT_ENDPOINT Endpoint,
812 IN BOOLEAN Flag);
813
814 VOID
815 NTAPI
816 USBPORT_NukeAllEndpoints(
817 IN PDEVICE_OBJECT FdoDevice);
818
819 BOOLEAN
820 NTAPI
821 USBPORT_EndpointHasQueuedTransfers(
822 IN PDEVICE_OBJECT FdoDevice,
823 IN PUSBPORT_ENDPOINT Endpoint,
824 IN PULONG TransferCount);
825
826 /* iface.c */
827 NTSTATUS
828 NTAPI
829 USBPORT_PdoQueryInterface(
830 IN PDEVICE_OBJECT FdoDevice,
831 IN PDEVICE_OBJECT PdoDevice,
832 IN PIRP Irp);
833
834 /* ioctl.c */
835 NTSTATUS
836 NTAPI
837 USBPORT_PdoDeviceControl(
838 PDEVICE_OBJECT PdoDevice,
839 PIRP Irp);
840
841 NTSTATUS
842 NTAPI
843 USBPORT_FdoDeviceControl(
844 PDEVICE_OBJECT FdoDevice,
845 PIRP Irp);
846
847 NTSTATUS
848 NTAPI
849 USBPORT_FdoInternalDeviceControl(
850 IN PDEVICE_OBJECT FdoDevice,
851 IN PIRP Irp);
852
853 NTSTATUS
854 NTAPI
855 USBPORT_PdoInternalDeviceControl(
856 IN PDEVICE_OBJECT FdoDevice,
857 IN PIRP Irp);
858
859 NTSTATUS
860 NTAPI
861 USBPORT_GetSymbolicName(
862 IN PDEVICE_OBJECT RootHubPdo,
863 IN PUNICODE_STRING DestinationString);
864
865 /* pnp.c */
866 NTSTATUS
867 NTAPI
868 USBPORT_FdoPnP(
869 IN PDEVICE_OBJECT FdoDevice,
870 IN PIRP Irp);
871
872 NTSTATUS
873 NTAPI
874 USBPORT_PdoPnP(
875 IN PDEVICE_OBJECT FdoDevice,
876 IN PIRP Irp);
877
878 /* power.c */
879 NTSTATUS
880 NTAPI
881 USBPORT_PdoPower(
882 IN PDEVICE_OBJECT PdoDevice,
883 IN PIRP Irp);
884
885 NTSTATUS
886 NTAPI
887 USBPORT_FdoPower(
888 IN PDEVICE_OBJECT FdoDevice,
889 IN PIRP Irp);
890
891 NTSTATUS
892 NTAPI
893 USBPORT_IdleNotification(
894 IN PDEVICE_OBJECT PdoDevice,
895 IN PIRP Irp);
896
897 VOID
898 NTAPI
899 USBPORT_AdjustDeviceCapabilities(
900 IN PDEVICE_OBJECT FdoDevice,
901 IN PDEVICE_OBJECT PdoDevice);
902
903 VOID
904 NTAPI
905 USBPORT_DoIdleNotificationCallback(
906 IN PVOID Context);
907
908 VOID
909 NTAPI
910 USBPORT_CompletePdoWaitWake(
911 IN PDEVICE_OBJECT FdoDevice);
912
913 VOID
914 NTAPI
915 USBPORT_DoSetPowerD0(
916 IN PDEVICE_OBJECT FdoDevice);
917
918 VOID
919 NTAPI
920 USBPORT_HcWakeDpc(
921 IN PRKDPC Dpc,
922 IN PVOID DeferredContext,
923 IN PVOID SystemArgument1,
924 IN PVOID SystemArgument2);
925
926 VOID
927 NTAPI
928 USBPORT_HcQueueWakeDpc(
929 IN PDEVICE_OBJECT FdoDevice);
930
931 /* queue.c */
932 VOID
933 NTAPI
934 USBPORT_InsertIdleIrp(
935 IN PIO_CSQ Csq,
936 IN PIRP Irp);
937
938 VOID
939 NTAPI
940 USBPORT_RemoveIdleIrp(
941 IN PIO_CSQ Csq,
942 IN PIRP Irp);
943
944 PIRP
945 NTAPI
946 USBPORT_PeekNextIdleIrp(
947 IN PIO_CSQ Csq,
948 IN PIRP Irp,
949 IN PVOID PeekContext);
950
951 VOID
952 NTAPI
953 USBPORT_AcquireIdleLock(
954 IN PIO_CSQ Csq,
955 IN PKIRQL Irql);
956
957 VOID
958 NTAPI
959 USBPORT_ReleaseIdleLock(
960 IN PIO_CSQ Csq,
961 IN KIRQL Irql);
962
963 VOID
964 NTAPI
965 USBPORT_CompleteCanceledIdleIrp(
966 IN PIO_CSQ Csq,
967 IN PIRP Irp);
968
969 VOID
970 NTAPI
971 USBPORT_InsertBadRequest(
972 IN PIO_CSQ Csq,
973 IN PIRP Irp);
974
975 VOID
976 NTAPI
977 USBPORT_RemoveBadRequest(
978 IN PIO_CSQ Csq,
979 IN PIRP Irp);
980
981 PIRP
982 NTAPI
983 USBPORT_PeekNextBadRequest(
984 IN PIO_CSQ Csq,
985 IN PIRP Irp,
986 IN PVOID PeekContext);
987
988 VOID
989 NTAPI
990 USBPORT_AcquireBadRequestLock(
991 IN PIO_CSQ Csq,
992 IN PKIRQL Irql);
993
994 VOID
995 NTAPI
996 USBPORT_ReleaseBadRequestLock(
997 IN PIO_CSQ Csq,
998 IN KIRQL Irql);
999
1000 VOID
1001 NTAPI
1002 USBPORT_CompleteCanceledBadRequest(
1003 IN PIO_CSQ Csq,
1004 IN PIRP Irp);
1005
1006 VOID
1007 NTAPI
1008 USBPORT_InsertIrpInTable(
1009 IN PUSBPORT_IRP_TABLE IrpTable,
1010 IN PIRP Irp);
1011
1012 PIRP
1013 NTAPI
1014 USBPORT_RemovePendingTransferIrp(
1015 IN PDEVICE_OBJECT FdoDevice,
1016 IN PIRP Irp);
1017
1018 PIRP
1019 NTAPI
1020 USBPORT_RemoveActiveTransferIrp(
1021 IN PDEVICE_OBJECT FdoDevice,
1022 IN PIRP Irp);
1023
1024 VOID
1025 NTAPI
1026 USBPORT_FindUrbInIrpTable(
1027 IN PUSBPORT_IRP_TABLE IrpTable,
1028 IN PURB Urb,
1029 IN PIRP Irp);
1030
1031 VOID
1032 NTAPI
1033 USBPORT_CancelActiveTransferIrp(
1034 IN PDEVICE_OBJECT DeviceObject,
1035 IN PIRP Irp);
1036
1037 VOID
1038 NTAPI
1039 USBPORT_FlushAbortList(
1040 IN PUSBPORT_ENDPOINT Endpoint);
1041
1042 VOID
1043 NTAPI
1044 USBPORT_FlushCancelList(
1045 IN PUSBPORT_ENDPOINT Endpoint);
1046
1047 VOID
1048 NTAPI
1049 USBPORT_QueueTransferUrb(
1050 IN PURB Urb);
1051
1052 VOID
1053 NTAPI
1054 USBPORT_FlushAllEndpoints(
1055 IN PDEVICE_OBJECT FdoDevice);
1056
1057 VOID
1058 NTAPI
1059 USBPORT_FlushPendingTransfers(
1060 IN PUSBPORT_ENDPOINT Endpoint);
1061
1062 BOOLEAN
1063 NTAPI
1064 USBPORT_QueueActiveUrbToEndpoint(
1065 IN PUSBPORT_ENDPOINT Endpoint,
1066 IN PURB Urb);
1067
1068 VOID
1069 NTAPI
1070 USBPORT_FlushController(
1071 IN PDEVICE_OBJECT FdoDevice);
1072
1073 VOID
1074 NTAPI
1075 USBPORT_BadRequestFlush(
1076 IN PDEVICE_OBJECT FdoDevice);
1077
1078 VOID
1079 NTAPI
1080 USBPORT_AbortEndpoint(
1081 IN PDEVICE_OBJECT FdoDevice,
1082 IN PUSBPORT_ENDPOINT Endpoint,
1083 IN PIRP Irp);
1084
1085 /* roothub.c */
1086 VOID
1087 NTAPI
1088 USBPORT_RootHubEndpointWorker(
1089 PUSBPORT_ENDPOINT Endpoint);
1090
1091 NTSTATUS
1092 NTAPI
1093 USBPORT_RootHubCreateDevice(
1094 IN PDEVICE_OBJECT FdoDevice,
1095 IN PDEVICE_OBJECT PdoDevice);
1096
1097 ULONG
1098 NTAPI
1099 USBPORT_InvalidateRootHub(
1100 PVOID MiniPortExtension);
1101
1102 VOID
1103 NTAPI
1104 USBPORT_RootHubPowerAndChirpAllCcPorts(
1105 IN PDEVICE_OBJECT FdoDevice);
1106
1107 /* urb.c */
1108 NTSTATUS
1109 NTAPI
1110 USBPORT_HandleSubmitURB(
1111 IN PDEVICE_OBJECT PdoDevice,
1112 IN PIRP Irp,
1113 IN PURB Urb);
1114
1115 /* usb2.c */
1116 BOOLEAN
1117 NTAPI
1118 USBPORT_AllocateBandwidthUSB2(
1119 IN PDEVICE_OBJECT FdoDevice,
1120 IN PUSBPORT_ENDPOINT Endpoint);
1121
1122 VOID
1123 NTAPI
1124 USBPORT_FreeBandwidthUSB2(
1125 IN PDEVICE_OBJECT FdoDevice,
1126 IN PUSBPORT_ENDPOINT Endpoint);
1127
1128 #endif /* USBPORT_H__ */