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>
15 #include <ntstrsafe.h>
21 #include <drivers/usbport/usbmport.h>
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
28 #ifdef USBD_TRANSFER_DIRECTION // due hubbusif.h included usbdi.h (Which overwrites...)
29 #undef USBD_TRANSFER_DIRECTION
30 #define USBD_TRANSFER_DIRECTION 0x00000001
33 #define USBPORT_RECIPIENT_HUB BMREQUEST_TO_DEVICE
34 #define USBPORT_RECIPIENT_PORT BMREQUEST_TO_OTHER
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
41 #define USBPORT_DMA_DIRECTION_FROM_DEVICE 1
42 #define USBPORT_DMA_DIRECTION_TO_DEVICE 2
44 #define USB_PORT_TAG 'pbsu'
45 #define URB_FUNCTION_MAX 0x31
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
61 /* Hub Class Feature Selectors (Recipient - Hub) */
62 #define FEATURE_C_HUB_LOCAL_POWER 0
63 #define FEATURE_C_HUB_OVER_CURRENT 1
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
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
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
101 #define USBPORT_MPFLAG_INTERRUPTS_ENABLED 0x00000001
102 #define USBPORT_MPFLAG_SUSPENDED 0x00000002
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_USB2HUB 0x00000010
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
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
124 /* Pipe handle Flags (USBPORT_PIPE_HANDLE) */
125 #define PIPE_HANDLE_FLAG_CLOSED 0x00000001
126 #define PIPE_HANDLE_FLAG_NULL_PACKET_SIZE 0x00000002
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
140 extern KSPIN_LOCK USBPORT_SpinLock
;
141 extern LIST_ENTRY USBPORT_MiniPortDrivers
;
143 typedef USBD_STATUS
* PUSBD_STATUS
;
145 typedef struct _USBPORT_COMMON_BUFFER_HEADER
{
148 PHYSICAL_ADDRESS LogicalAddress
;
150 ULONG_PTR VirtualAddress
;
151 ULONG PhysicalAddress
;
152 } USBPORT_COMMON_BUFFER_HEADER
, *PUSBPORT_COMMON_BUFFER_HEADER
;
154 typedef struct _USBPORT_ENDPOINT
*PUSBPORT_ENDPOINT
;
156 typedef struct _USB2_HC_EXTENSION
*PUSB2_HC_EXTENSION
;
157 typedef struct _USB2_TT_EXTENSION
*PUSB2_TT_EXTENSION
;
158 typedef struct _USB2_TT
*PUSB2_TT
;
159 typedef struct _USB2_TT_ENDPOINT
*PUSB2_TT_ENDPOINT
;
161 typedef struct _USBPORT_PIPE_HANDLE
{
164 USB_ENDPOINT_DESCRIPTOR EndpointDescriptor
;
166 PUSBPORT_ENDPOINT Endpoint
;
168 } USBPORT_PIPE_HANDLE
, *PUSBPORT_PIPE_HANDLE
;
170 typedef struct _USBPORT_CONFIGURATION_HANDLE
{
171 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
;
172 LIST_ENTRY InterfaceHandleList
;
173 //USB_CONFIGURATION_DESCRIPTOR CfgDescriptor; // Body.
174 } USBPORT_CONFIGURATION_HANDLE
, *PUSBPORT_CONFIGURATION_HANDLE
;
176 typedef struct _USBPORT_INTERFACE_HANDLE
{
177 LIST_ENTRY InterfaceLink
;
178 UCHAR AlternateSetting
;
180 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
182 USBPORT_PIPE_HANDLE PipeHandle
[1];
183 } USBPORT_INTERFACE_HANDLE
, *PUSBPORT_INTERFACE_HANDLE
;
185 typedef struct _USBPORT_DEVICE_HANDLE
{
187 USHORT DeviceAddress
;
189 USBPORT_PIPE_HANDLE PipeHandle
;
192 LIST_ENTRY PipeHandleList
;
193 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle
;
194 struct _USBPORT_DEVICE_HANDLE
*HubDeviceHandle
;
195 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
196 LIST_ENTRY DeviceHandleLink
;
197 LONG DeviceHandleLock
;
199 PUSB2_TT_EXTENSION TtExtension
; // Transaction Translator
201 } USBPORT_DEVICE_HANDLE
, *PUSBPORT_DEVICE_HANDLE
;
203 typedef struct _USBPORT_ENDPOINT
{
205 PDEVICE_OBJECT FdoDevice
;
206 PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
;
207 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
208 PUSB2_TT_EXTENSION TtExtension
; // Transaction Translator
209 PUSB2_TT_ENDPOINT TtEndpoint
;
210 USBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
211 ULONG EndpointWorker
;
214 KSPIN_LOCK EndpointSpinLock
;
215 KIRQL EndpointOldIrql
;
216 KIRQL EndpointStateOldIrql
;
219 LONG FlushPendingLock
;
223 LIST_ENTRY StateChangeLink
;
224 KSPIN_LOCK StateChangeSpinLock
;
226 LIST_ENTRY PendingTransferList
;
227 LIST_ENTRY TransferList
;
228 LIST_ENTRY CancelList
;
229 LIST_ENTRY AbortList
;
231 LIST_ENTRY EndpointLink
;
232 LIST_ENTRY WorkerLink
;
233 LIST_ENTRY CloseLink
;
234 LIST_ENTRY DispatchLink
;
235 LIST_ENTRY FlushLink
;
236 LIST_ENTRY FlushControllerLink
;
237 LIST_ENTRY FlushAbortLink
;
239 LIST_ENTRY RebalanceLink
;
240 } USBPORT_ENDPOINT
, *PUSBPORT_ENDPOINT
;
242 typedef struct _USBPORT_ISO_BLOCK
*PUSBPORT_ISO_BLOCK
;
244 typedef struct _USBPORT_TRANSFER
{
249 PVOID MiniportTransfer
;
250 SIZE_T PortTransferLength
; // Only port part
251 SIZE_T FullTransferLength
; // Port + miniport
252 PUSBPORT_ENDPOINT Endpoint
;
253 USBPORT_TRANSFER_PARAMETERS TransferParameters
;
254 PMDL TransferBufferMDL
;
256 LIST_ENTRY TransferLink
;
257 USBD_STATUS USBDStatus
;
258 ULONG CompletedTransferLen
;
259 ULONG NumberOfMapRegisters
;
260 PVOID MapRegisterBase
;
263 struct _USBPORT_TRANSFER
* ParentTransfer
;
264 KSPIN_LOCK TransferSpinLock
;
265 LIST_ENTRY SplitTransfersList
; // for parent transfers
266 LIST_ENTRY SplitLink
; // for splitted transfers
268 PUSBPORT_ISO_BLOCK IsoBlockPtr
; // pointer on IsoBlock
269 // SgList should be LAST field
270 USBPORT_SCATTER_GATHER_LIST SgList
; // variable length
271 //USBPORT_ISO_BLOCK IsoBlock; // variable length
272 } USBPORT_TRANSFER
, *PUSBPORT_TRANSFER
;
274 typedef struct _USBPORT_IRP_TABLE
{
275 struct _USBPORT_IRP_TABLE
* LinkNextTable
;
277 } USBPORT_IRP_TABLE
, *PUSBPORT_IRP_TABLE
;
279 typedef struct _USBPORT_COMMON_DEVICE_EXTENSION
{
280 PDEVICE_OBJECT SelfDevice
;
281 PDEVICE_OBJECT LowerPdoDevice
; // PhysicalDeviceObject
282 PDEVICE_OBJECT LowerDevice
; // TopOfStackDeviceObject
284 UNICODE_STRING SymbolicLinkName
;
285 BOOL IsInterfaceEnabled
;
286 DEVICE_POWER_STATE DevicePowerState
;
288 } USBPORT_COMMON_DEVICE_EXTENSION
, *PUSBPORT_COMMON_DEVICE_EXTENSION
;
290 typedef struct _USBPORT_DEVICE_EXTENSION
{
291 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
293 PDEVICE_OBJECT RootHubPdo
; // RootHubDeviceObject
294 KSPIN_LOCK RootHubCallbackSpinLock
;
295 LONG RHInitCallBackLock
;
296 LONG ChirpRootPortLock
;
297 KSEMAPHORE ControllerSemaphore
;
299 UNICODE_STRING DosDeviceSymbolicName
;
301 LIST_ENTRY ControllerLink
;
302 ULONG CommonBufferLimit
;
306 PUSBPORT_MINIPORT_INTERFACE MiniPortInterface
;
307 USBPORT_RESOURCES UsbPortResources
;
308 PUSBPORT_COMMON_BUFFER_HEADER MiniPortCommonBuffer
;
309 KSPIN_LOCK MiniportSpinLock
;
311 BUS_INTERFACE_STANDARD BusInterface
;
319 PDMA_ADAPTER DmaAdapter
;
322 PKINTERRUPT InterruptObject
;
325 LONG IsrDpcHandlerCounter
;
326 KSPIN_LOCK MiniportInterruptsSpinLock
;
327 KTIMER TimerSoftInterrupt
;
328 KDPC SoftInterruptDpc
;
330 ULONG PeriodicEndpoints
;
331 LIST_ENTRY EndpointList
;
332 KSPIN_LOCK EndpointListSpinLock
;
333 LIST_ENTRY EpStateChangeList
;
334 KSPIN_LOCK EpStateChangeSpinLock
;
335 LIST_ENTRY EndpointClosedList
;
336 KSPIN_LOCK EndpointClosedSpinLock
;
337 LIST_ENTRY WorkerList
;
339 LIST_ENTRY MapTransferList
;
340 KSPIN_LOCK MapTransferSpinLock
;
341 LIST_ENTRY DoneTransferList
;
342 KSPIN_LOCK DoneTransferSpinLock
;
343 KDPC TransferFlushDpc
;
344 KSPIN_LOCK FlushTransferSpinLock
;
345 KSPIN_LOCK FlushPendingTransferSpinLock
;
347 ULONG TimerValue
; // Timer period (500) msec. default
351 KSPIN_LOCK TimerFlagsSpinLock
;
353 PRKTHREAD WorkerThread
;
354 HANDLE WorkerThreadHandle
;
355 KEVENT WorkerThreadEvent
;
356 KSPIN_LOCK WorkerThreadEventSpinLock
;
358 ULONG UsbAddressBitMap
[4];
359 LIST_ENTRY DeviceHandleList
;
360 KSPIN_LOCK DeviceHandleSpinLock
;
361 KSEMAPHORE DeviceSemaphore
;
362 /* Device Capabilities */
363 DEVICE_CAPABILITIES Capabilities
;
365 ULONG PciDeviceNumber
;
366 ULONG PciFunctionNumber
;
367 ULONG TotalBusBandwidth
;
369 LARGE_INTEGER IdleTime
;
371 KSPIN_LOCK IdleIoCsqSpinLock
;
372 LIST_ENTRY IdleIrpList
;
373 LONG IdleLockCounter
;
375 IO_CSQ BadRequestIoCsq
;
376 KSPIN_LOCK BadRequestIoCsqSpinLock
;
377 LIST_ENTRY BadRequestList
;
378 LONG BadRequestLockCounter
;
380 PUSBPORT_IRP_TABLE PendingIrpTable
;
381 PUSBPORT_IRP_TABLE ActiveIrpTable
;
383 LONG SetPowerLockCounter
;
384 KSPIN_LOCK PowerWakeSpinLock
;
385 KSPIN_LOCK SetPowerD0SpinLock
;
386 KDPC WorkerRequestDpc
;
388 /* Usb 2.0 HC Extension */
389 PUSB2_HC_EXTENSION Usb2Extension
;
391 KSPIN_LOCK TtSpinLock
;
393 /* Miniport extension should be aligned on 0x100 */
400 } USBPORT_DEVICE_EXTENSION
, *PUSBPORT_DEVICE_EXTENSION
;
403 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION
) == 0x500);
405 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION
) == 0x700);
408 typedef struct _USBPORT_RH_DESCRIPTORS
{
409 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
410 USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
;
411 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
412 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor
;
413 USB_HUB_DESCRIPTOR Descriptor
; // Size may be: 7 + 2[1..32] (7 + 2..64)
414 } USBPORT_RH_DESCRIPTORS
, *PUSBPORT_RH_DESCRIPTORS
;
416 typedef struct _USBPORT_RHDEVICE_EXTENSION
{
417 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
419 PDEVICE_OBJECT FdoDevice
;
421 USBPORT_DEVICE_HANDLE DeviceHandle
;
422 PUSBPORT_RH_DESCRIPTORS RootHubDescriptors
;
423 PUSBPORT_ENDPOINT Endpoint
;
424 ULONG ConfigurationValue
;
425 PRH_INIT_CALLBACK RootHubInitCallback
;
426 PVOID RootHubInitContext
;
427 DEVICE_CAPABILITIES Capabilities
;
429 } USBPORT_RHDEVICE_EXTENSION
, *PUSBPORT_RHDEVICE_EXTENSION
;
431 typedef struct _USBPORT_ASYNC_CALLBACK_DATA
{
433 PDEVICE_OBJECT FdoDevice
;
436 ASYNC_TIMER_CALLBACK
*CallbackFunction
;
437 ULONG CallbackContext
;
438 } USBPORT_ASYNC_CALLBACK_DATA
, *PUSBPORT_ASYNC_CALLBACK_DATA
;
440 C_ASSERT(sizeof(USBPORT_ASYNC_CALLBACK_DATA
) == 16 + 18 * sizeof(PVOID
));
442 typedef struct _TIMER_WORK_QUEUE_ITEM
{
443 WORK_QUEUE_ITEM WqItem
;
444 PDEVICE_OBJECT FdoDevice
;
446 } TIMER_WORK_QUEUE_ITEM
, *PTIMER_WORK_QUEUE_ITEM
;
448 /* Transaction Translator */
449 /* See Chapter 5 - USB Data Flow Model and Chapter 11 - Hub Specification */
451 #define USB2_FRAMES 32
452 #define USB2_MICROFRAMES 8
453 #define USB2_MAX_MICROFRAMES (USB2_FRAMES * USB2_MICROFRAMES)
454 #define USB2_PREV_MICROFRAME 0xFF
456 #define USB2_MAX_MICROFRAME_ALLOCATION 7000 // bytes
457 #define USB2_CONTROLLER_DELAY 100
458 #define USB2_FS_MAX_PERIODIC_ALLOCATION 1157 // ((12000 / 8 bits) * 0.9) / (7/6) - 90% max, and bits stuffing
459 #define USB2_FS_SOF_TIME 6
460 #define USB2_HUB_DELAY 30
461 #define USB2_MAX_FS_LS_TRANSACTIONS_IN_UFRAME 16
462 #define USB2_FS_RAW_BYTES_IN_MICROFRAME 188 // (12000 / 8 bits / USB2_MICROFRAMES) = 187,5. But we use "best case budget"
465 #define USB2_LS_INTERRUPT_OVERHEAD 117 // FS-bytes
466 #define USB2_FS_INTERRUPT_OVERHEAD 13
467 #define USB2_HS_INTERRUPT_OUT_OVERHEAD 45
468 #define USB2_HS_INTERRUPT_IN_OVERHEAD 25
469 #define USB2_FS_ISOCHRONOUS_OVERHEAD 9
470 #define USB2_HS_ISOCHRONOUS_OUT_OVERHEAD 38
471 #define USB2_HS_ISOCHRONOUS_IN_OVERHEAD 18
473 #define USB2_HS_SS_INTERRUPT_OUT_OVERHEAD 58
474 #define USB2_HS_CS_INTERRUPT_OUT_OVERHEAD 36
475 #define USB2_HS_SS_INTERRUPT_IN_OVERHEAD 39
476 #define USB2_HS_CS_INTERRUPT_IN_OVERHEAD 38
478 #define USB2_HS_SS_ISOCHRONOUS_OUT_OVERHEAD 58
479 #define USB2_HS_SS_ISOCHRONOUS_IN_OVERHEAD 39
480 #define USB2_HS_CS_ISOCHRONOUS_IN_OVERHEAD 38
482 #define USB2_BIT_STUFFING_OVERHEAD (8 * (7/6)) // 7.1.9 Bit Stuffing
484 typedef union _USB2_TT_ENDPOINT_PARAMS
{
486 ULONG TransferType
: 4;
488 USB_DEVICE_SPEED DeviceSpeed
: 2;
489 BOOL EndpointMoved
: 1;
493 } USB2_TT_ENDPOINT_PARAMS
;
495 C_ASSERT(sizeof(USB2_TT_ENDPOINT_PARAMS
) == sizeof(ULONG
));
497 typedef union _USB2_TT_ENDPOINT_NUMS
{
500 ULONG NumCompletes
: 4;
504 } USB2_TT_ENDPOINT_NUMS
;
506 C_ASSERT(sizeof(USB2_TT_ENDPOINT_NUMS
) == sizeof(ULONG
));
508 typedef struct _USB2_TT_ENDPOINT
{
510 PUSBPORT_ENDPOINT Endpoint
;
511 struct _USB2_TT_ENDPOINT
* NextTtEndpoint
;
512 USB2_TT_ENDPOINT_PARAMS TtEndpointParams
;
513 USB2_TT_ENDPOINT_NUMS Nums
;
515 USHORT MaxPacketSize
;
516 USHORT PreviosPeriod
;
523 UCHAR StartMicroframe
;
524 } USB2_TT_ENDPOINT
, *PUSB2_TT_ENDPOINT
;
526 typedef struct _USB2_FRAME_BUDGET
{
527 PUSB2_TT_ENDPOINT IsoEndpoint
;
528 PUSB2_TT_ENDPOINT IntEndpoint
;
529 PUSB2_TT_ENDPOINT AltEndpoint
;
532 } USB2_FRAME_BUDGET
, *PUSB2_FRAME_BUDGET
;
534 typedef struct _USB2_TT
{
535 PUSB2_HC_EXTENSION HcExtension
;
538 USB2_TT_ENDPOINT IntEndpoint
[USB2_FRAMES
];
539 USB2_TT_ENDPOINT IsoEndpoint
[USB2_FRAMES
];
540 USB2_FRAME_BUDGET FrameBudget
[USB2_FRAMES
];
541 ULONG NumStartSplits
[USB2_FRAMES
][USB2_MICROFRAMES
];
542 ULONG TimeCS
[USB2_FRAMES
][USB2_MICROFRAMES
];
543 } USB2_TT
, *PUSB2_TT
;
545 #define USB2_TT_EXTENSION_FLAG_DELETED 1
547 typedef struct _USB2_TT_EXTENSION
{
548 PDEVICE_OBJECT RootHubPdo
;
551 ULONG Bandwidth
[USB2_FRAMES
];
554 USHORT DeviceAddress
;
556 LIST_ENTRY EndpointList
;
559 } USB2_TT_EXTENSION
, *PUSB2_TT_EXTENSION
;
561 typedef struct _USB2_HC_EXTENSION
{
562 ULONG MaxHsBusAllocation
;
564 ULONG TimeUsed
[USB2_FRAMES
][USB2_MICROFRAMES
];
566 } USB2_HC_EXTENSION
, *PUSB2_HC_EXTENSION
;
568 typedef struct _USB2_REBALANCE
{
569 PUSB2_TT_ENDPOINT RebalanceEndpoint
[USB2_FRAMES
- 2];
570 } USB2_REBALANCE
, *PUSB2_REBALANCE
;
575 USBPORT_USBDStatusToNtStatus(
577 IN USBD_STATUS USBDStatus
);
582 IN PVOID MiniPortExtension
,
583 IN ULONG Milliseconds
);
587 USBPORT_TransferFlushDpc(
589 IN PVOID DeferredContext
,
590 IN PVOID SystemArgument1
,
591 IN PVOID SystemArgument2
);
595 USBPORT_CreateWorkerThread(
596 IN PDEVICE_OBJECT FdoDevice
);
601 IN PDEVICE_OBJECT FdoDevice
,
604 PUSBPORT_COMMON_BUFFER_HEADER
606 USBPORT_AllocateCommonBuffer(
607 IN PDEVICE_OBJECT FdoDevice
,
608 IN SIZE_T BufferLength
);
612 USBPORT_FreeCommonBuffer(
613 IN PDEVICE_OBJECT FdoDevice
,
614 IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
);
618 USBPORT_AllocateTransfer(
619 IN PDEVICE_OBJECT FdoDevice
,
621 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
627 USBPORT_FlushMapTransfers(
628 IN PDEVICE_OBJECT FdoDevice
);
634 IN PVOID DeferredContext
,
635 IN PVOID SystemArgument1
,
636 IN PVOID SystemArgument2
);
640 USBPORT_InterruptService(
641 IN PKINTERRUPT Interrupt
,
642 IN PVOID ServiceContext
);
646 USBPORT_SignalWorkerThread(
647 IN PDEVICE_OBJECT FdoDevice
);
651 USBPORT_CompleteTransfer(
653 IN USBD_STATUS TransferStatus
);
658 IN PDEVICE_OBJECT FdoDevice
);
662 USBPORT_WorkerRequestDpc(
664 IN PVOID DeferredContext
,
665 IN PVOID SystemArgument1
,
666 IN PVOID SystemArgument2
);
670 USBPORT_QueueDoneTransfer(
671 IN PUSBPORT_TRANSFER Transfer
,
672 IN USBD_STATUS USBDStatus
);
676 USBPORT_MiniportInterrupts(
677 IN PDEVICE_OBJECT FdoDevice
,
678 IN BOOLEAN IsEnable
);
682 USBPORT_SetRegistryKeyValue(
683 IN PDEVICE_OBJECT DeviceObject
,
684 IN BOOL UseDriverKey
,
686 IN PCWSTR ValueNameString
,
692 USBPORT_GetRegistryKeyValueFullInfo(
693 IN PDEVICE_OBJECT FdoDevice
,
694 IN PDEVICE_OBJECT PdoDevice
,
695 IN BOOL UseDriverKey
,
696 IN PCWSTR SourceString
,
699 IN ULONG NumberOfBytes
);
704 IN PDEVICE_OBJECT FdoDevice
);
709 IN PDEVICE_OBJECT FdoDevice
);
713 USBPORT_RemoveUSBxFdo(
714 IN PDEVICE_OBJECT FdoDevice
);
718 USBPORT_FindUSB2Controller(
719 IN PDEVICE_OBJECT FdoDevice
);
723 USBPORT_FindCompanionControllers(
724 IN PDEVICE_OBJECT USB2FdoDevice
,
725 IN BOOLEAN IsObRefer
,
726 IN BOOLEAN IsFDOsReturned
);
730 USBPORT_InvalidateControllerHandler(
731 IN PDEVICE_OBJECT FdoDevice
,
736 USBPORT_DoneTransfer(
737 IN PUSBPORT_TRANSFER Transfer
);
743 IN PVOID MiniPortExtension
,
750 USBPORT_TestDebugBreak(
751 IN PVOID MiniPortExtension
);
755 USBPORT_AssertFailure(
756 PVOID MiniPortExtension
,
757 PVOID FailedAssertion
,
765 IN PVOID MiniPortExtension
);
770 IN PVOID MiniPortExtension
,
779 USBPORT_DumpingDeviceDescriptor(
780 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
784 USBPORT_DumpingConfiguration(
785 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
);
789 USBPORT_DumpingCapabilities(
790 IN PDEVICE_CAPABILITIES Capabilities
);
794 USBPORT_DumpingSetupPacket(
795 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
);
810 USBPORT_HandleSelectConfiguration(
811 IN PDEVICE_OBJECT FdoDevice
,
817 USBPORT_AddDeviceHandle(
818 IN PDEVICE_OBJECT FdoDevice
,
819 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
823 USBPORT_RemoveDeviceHandle(
824 IN PDEVICE_OBJECT FdoDevice
,
825 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
829 USBPORT_ValidateDeviceHandle(
830 IN PDEVICE_OBJECT FdoDevice
,
831 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
835 USBPORT_CreateDevice(
836 IN OUT PUSB_DEVICE_HANDLE
*pUsbdDeviceHandle
,
837 IN PDEVICE_OBJECT FdoDevice
,
838 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
839 IN USHORT PortStatus
,
844 USBPORT_InitializeDevice(
845 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
846 IN PDEVICE_OBJECT FdoDevice
);
850 USBPORT_GetUsbDescriptor(
851 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
852 IN PDEVICE_OBJECT FdoDevice
,
854 IN PUCHAR ConfigDesc
,
855 IN PULONG ConfigDescSize
);
859 USBPORT_HandleSelectInterface(
860 IN PDEVICE_OBJECT FdoDevice
,
866 USBPORT_RemoveDevice(
867 IN PDEVICE_OBJECT FdoDevice
,
868 IN OUT PUSBPORT_DEVICE_HANDLE DeviceHandle
,
873 USBPORT_SendSetupPacket(
874 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
875 IN PDEVICE_OBJECT FdoDevice
,
876 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
,
879 IN OUT PULONG TransferedLen
,
880 IN OUT PUSBD_STATUS pUSBDStatus
);
884 USBPORT_RestoreDevice(
885 IN PDEVICE_OBJECT FdoDevice
,
886 IN OUT PUSBPORT_DEVICE_HANDLE OldDeviceHandle
,
887 IN OUT PUSBPORT_DEVICE_HANDLE NewDeviceHandle
);
891 USBPORT_Initialize20Hub(
892 IN PDEVICE_OBJECT FdoDevice
,
893 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
900 IN PDEVICE_OBJECT FdoDevice
,
901 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
902 IN PUSBPORT_PIPE_HANDLE PipeHandle
,
903 IN PUSBD_STATUS UsbdStatus
);
907 MiniportOpenEndpoint(
908 IN PDEVICE_OBJECT FdoDevice
,
909 IN PUSBPORT_ENDPOINT Endpoint
);
914 IN PDEVICE_OBJECT FdoDevice
,
915 IN PUSBPORT_ENDPOINT Endpoint
);
920 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
921 IN PDEVICE_OBJECT FdoDevice
,
922 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
926 MiniportCloseEndpoint(
927 IN PDEVICE_OBJECT FdoDevice
,
928 IN PUSBPORT_ENDPOINT Endpoint
);
932 USBPORT_AddPipeHandle(
933 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
934 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
938 USBPORT_RemovePipeHandle(
939 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
940 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
944 USBPORT_ValidatePipeHandle(
945 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
946 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
950 USBPORT_FlushClosedEndpointList(
951 IN PDEVICE_OBJECT FdoDevice
);
955 USBPORT_SetEndpointState(
956 IN PUSBPORT_ENDPOINT Endpoint
,
961 USBPORT_GetEndpointState(
962 IN PUSBPORT_ENDPOINT Endpoint
);
966 USBPORT_InvalidateEndpointHandler(
967 IN PDEVICE_OBJECT FdoDevice
,
968 IN PUSBPORT_ENDPOINT Endpoint
,
973 USBPORT_EndpointWorker(
974 IN PUSBPORT_ENDPOINT Endpoint
,
979 USBPORT_NukeAllEndpoints(
980 IN PDEVICE_OBJECT FdoDevice
);
984 USBPORT_EndpointHasQueuedTransfers(
985 IN PDEVICE_OBJECT FdoDevice
,
986 IN PUSBPORT_ENDPOINT Endpoint
,
987 IN PULONG TransferCount
);
992 USBPORT_PdoQueryInterface(
993 IN PDEVICE_OBJECT FdoDevice
,
994 IN PDEVICE_OBJECT PdoDevice
,
1000 USBPORT_PdoDeviceControl(
1001 PDEVICE_OBJECT PdoDevice
,
1006 USBPORT_FdoDeviceControl(
1007 PDEVICE_OBJECT FdoDevice
,
1012 USBPORT_FdoInternalDeviceControl(
1013 IN PDEVICE_OBJECT FdoDevice
,
1018 USBPORT_PdoInternalDeviceControl(
1019 IN PDEVICE_OBJECT FdoDevice
,
1024 USBPORT_GetSymbolicName(
1025 IN PDEVICE_OBJECT RootHubPdo
,
1026 IN PUNICODE_STRING DestinationString
);
1031 USBPORT_InitializeIsoTransfer(
1032 IN PDEVICE_OBJECT FdoDevice
,
1033 IN
struct _URB_ISOCH_TRANSFER
* Urb
,
1034 IN PUSBPORT_TRANSFER Transfer
);
1038 USBPORT_CompleteIsoTransfer(
1039 IN PVOID MiniPortExtension
,
1040 IN PVOID MiniPortEndpoint
,
1041 IN PVOID TransferParameters
,
1042 IN ULONG TransferLength
);
1048 IN PDEVICE_OBJECT FdoDevice
,
1054 IN PDEVICE_OBJECT FdoDevice
,
1061 IN PDEVICE_OBJECT PdoDevice
,
1067 IN PDEVICE_OBJECT FdoDevice
,
1072 USBPORT_IdleNotification(
1073 IN PDEVICE_OBJECT PdoDevice
,
1078 USBPORT_AdjustDeviceCapabilities(
1079 IN PDEVICE_OBJECT FdoDevice
,
1080 IN PDEVICE_OBJECT PdoDevice
);
1084 USBPORT_DoIdleNotificationCallback(
1089 USBPORT_CompletePdoWaitWake(
1090 IN PDEVICE_OBJECT FdoDevice
);
1094 USBPORT_DoSetPowerD0(
1095 IN PDEVICE_OBJECT FdoDevice
);
1101 IN PVOID DeferredContext
,
1102 IN PVOID SystemArgument1
,
1103 IN PVOID SystemArgument2
);
1107 USBPORT_HcQueueWakeDpc(
1108 IN PDEVICE_OBJECT FdoDevice
);
1113 USBPORT_InsertIdleIrp(
1119 USBPORT_RemoveIdleIrp(
1125 USBPORT_PeekNextIdleIrp(
1128 IN PVOID PeekContext
);
1132 USBPORT_AcquireIdleLock(
1138 USBPORT_ReleaseIdleLock(
1144 USBPORT_CompleteCanceledIdleIrp(
1150 USBPORT_InsertBadRequest(
1156 USBPORT_RemoveBadRequest(
1162 USBPORT_PeekNextBadRequest(
1165 IN PVOID PeekContext
);
1169 USBPORT_AcquireBadRequestLock(
1175 USBPORT_ReleaseBadRequestLock(
1181 USBPORT_CompleteCanceledBadRequest(
1187 USBPORT_InsertIrpInTable(
1188 IN PUSBPORT_IRP_TABLE IrpTable
,
1193 USBPORT_RemovePendingTransferIrp(
1194 IN PDEVICE_OBJECT FdoDevice
,
1199 USBPORT_RemoveActiveTransferIrp(
1200 IN PDEVICE_OBJECT FdoDevice
,
1205 USBPORT_FindUrbInIrpTable(
1206 IN PUSBPORT_IRP_TABLE IrpTable
,
1212 USBPORT_CancelActiveTransferIrp(
1213 IN PDEVICE_OBJECT DeviceObject
,
1218 USBPORT_FlushAbortList(
1219 IN PUSBPORT_ENDPOINT Endpoint
);
1223 USBPORT_FlushCancelList(
1224 IN PUSBPORT_ENDPOINT Endpoint
);
1228 USBPORT_QueueTransferUrb(
1233 USBPORT_FlushAllEndpoints(
1234 IN PDEVICE_OBJECT FdoDevice
);
1238 USBPORT_FlushPendingTransfers(
1239 IN PUSBPORT_ENDPOINT Endpoint
);
1243 USBPORT_QueueActiveUrbToEndpoint(
1244 IN PUSBPORT_ENDPOINT Endpoint
,
1249 USBPORT_FlushController(
1250 IN PDEVICE_OBJECT FdoDevice
);
1254 USBPORT_BadRequestFlush(
1255 IN PDEVICE_OBJECT FdoDevice
);
1259 USBPORT_AbortEndpoint(
1260 IN PDEVICE_OBJECT FdoDevice
,
1261 IN PUSBPORT_ENDPOINT Endpoint
,
1267 USBPORT_RootHubEndpointWorker(
1268 PUSBPORT_ENDPOINT Endpoint
);
1272 USBPORT_RootHubCreateDevice(
1273 IN PDEVICE_OBJECT FdoDevice
,
1274 IN PDEVICE_OBJECT PdoDevice
);
1278 USBPORT_InvalidateRootHub(
1279 PVOID MiniPortExtension
);
1283 USBPORT_RootHubPowerAndChirpAllCcPorts(
1284 IN PDEVICE_OBJECT FdoDevice
);
1289 USBPORT_SplitTransfer(
1290 IN PDEVICE_OBJECT FdoDevice
,
1291 IN PUSBPORT_ENDPOINT Endpoint
,
1292 IN PUSBPORT_TRANSFER Transfer
,
1293 IN PLIST_ENTRY List
);
1297 USBPORT_DoneSplitTransfer(
1298 IN PUSBPORT_TRANSFER SplitTransfer
);
1302 USBPORT_CancelSplitTransfer(
1303 IN PUSBPORT_TRANSFER SplitTransfer
);
1308 USBPORT_HandleSubmitURB(
1309 IN PDEVICE_OBJECT PdoDevice
,
1316 USBPORT_AllocateBandwidthUSB2(
1317 IN PDEVICE_OBJECT FdoDevice
,
1318 IN PUSBPORT_ENDPOINT Endpoint
);
1322 USBPORT_FreeBandwidthUSB2(
1323 IN PDEVICE_OBJECT FdoDevice
,
1324 IN PUSBPORT_ENDPOINT Endpoint
);
1328 USBPORT_UpdateAllocatedBwTt(
1329 IN PUSB2_TT_EXTENSION TtExtension
);
1334 IN PUSB2_HC_EXTENSION HcExtension
,
1339 USB2_InitController(
1340 IN PUSB2_HC_EXTENSION HcExtension
);
1344 USBPORT_DumpingEndpointProperties(
1345 IN PUSBPORT_ENDPOINT_PROPERTIES EndpointProperties
);
1349 USBPORT_DumpingTtEndpoint(
1350 IN PUSB2_TT_ENDPOINT TtEndpoint
);
1352 #endif /* USBPORT_H__ */