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_INITIALIZED 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_PTR PhysicalAddress
;
152 } USBPORT_COMMON_BUFFER_HEADER
, *PUSBPORT_COMMON_BUFFER_HEADER
;
154 typedef struct _USBPORT_ENDPOINT
*PUSBPORT_ENDPOINT
;
156 typedef struct _USBPORT_PIPE_HANDLE
{
159 USB_ENDPOINT_DESCRIPTOR EndpointDescriptor
;
161 PUSBPORT_ENDPOINT Endpoint
;
163 } USBPORT_PIPE_HANDLE
, *PUSBPORT_PIPE_HANDLE
;
165 typedef struct _USBPORT_CONFIGURATION_HANDLE
{
166 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
;
167 LIST_ENTRY InterfaceHandleList
;
168 //USB_CONFIGURATION_DESCRIPTOR CfgDescriptor; // Body.
169 } USBPORT_CONFIGURATION_HANDLE
, *PUSBPORT_CONFIGURATION_HANDLE
;
171 typedef struct _USBPORT_INTERFACE_HANDLE
{
172 LIST_ENTRY InterfaceLink
;
173 UCHAR AlternateSetting
;
175 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
177 USBPORT_PIPE_HANDLE PipeHandle
[1];
178 } USBPORT_INTERFACE_HANDLE
, *PUSBPORT_INTERFACE_HANDLE
;
180 typedef struct _USBPORT_DEVICE_HANDLE
{
182 USHORT DeviceAddress
;
184 USBPORT_PIPE_HANDLE PipeHandle
;
187 LIST_ENTRY PipeHandleList
;
188 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle
;
189 struct _USBPORT_DEVICE_HANDLE
*HubDeviceHandle
;
190 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
191 LIST_ENTRY DeviceHandleLink
;
192 LONG DeviceHandleLock
;
194 } USBPORT_DEVICE_HANDLE
, *PUSBPORT_DEVICE_HANDLE
;
196 typedef struct _USBPORT_ENDPOINT
{
198 PDEVICE_OBJECT FdoDevice
;
199 PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
;
200 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
201 USBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
202 ULONG EndpointWorker
;
205 KSPIN_LOCK EndpointSpinLock
;
206 KIRQL EndpointOldIrql
;
207 KIRQL EndpointStateOldIrql
;
210 LONG FlushPendingLock
;
214 LIST_ENTRY StateChangeLink
;
215 KSPIN_LOCK StateChangeSpinLock
;
217 LIST_ENTRY PendingTransferList
;
218 LIST_ENTRY TransferList
;
219 LIST_ENTRY CancelList
;
220 LIST_ENTRY AbortList
;
222 LIST_ENTRY EndpointLink
;
223 LIST_ENTRY WorkerLink
;
224 LIST_ENTRY CloseLink
;
225 LIST_ENTRY DispatchLink
;
226 LIST_ENTRY FlushLink
;
227 LIST_ENTRY FlushControllerLink
;
228 LIST_ENTRY FlushAbortLink
;
229 } USBPORT_ENDPOINT
, *PUSBPORT_ENDPOINT
;
231 typedef struct _USBPORT_ISO_BLOCK
*PUSBPORT_ISO_BLOCK
;
233 typedef struct _USBPORT_TRANSFER
{
238 PVOID MiniportTransfer
;
239 SIZE_T PortTransferLength
; // Only port part
240 SIZE_T FullTransferLength
; // Port + miniport
241 PUSBPORT_ENDPOINT Endpoint
;
242 USBPORT_TRANSFER_PARAMETERS TransferParameters
;
243 PMDL TransferBufferMDL
;
245 LIST_ENTRY TransferLink
;
246 USBD_STATUS USBDStatus
;
247 ULONG CompletedTransferLen
;
248 ULONG NumberOfMapRegisters
;
249 PVOID MapRegisterBase
;
252 struct _USBPORT_TRANSFER
* ParentTransfer
;
253 KSPIN_LOCK TransferSpinLock
;
254 LIST_ENTRY SplitTransfersList
; // for parent transfers
255 LIST_ENTRY SplitLink
; // for splitted transfers
257 PUSBPORT_ISO_BLOCK IsoBlockPtr
; // pointer on IsoBlock
258 // SgList should be LAST field
259 USBPORT_SCATTER_GATHER_LIST SgList
; // variable length
260 //USBPORT_ISO_BLOCK IsoBlock; // variable length
261 } USBPORT_TRANSFER
, *PUSBPORT_TRANSFER
;
263 typedef struct _USBPORT_IRP_TABLE
{
264 struct _USBPORT_IRP_TABLE
* LinkNextTable
;
266 } USBPORT_IRP_TABLE
, *PUSBPORT_IRP_TABLE
;
268 typedef struct _USBPORT_COMMON_DEVICE_EXTENSION
{
269 PDEVICE_OBJECT SelfDevice
;
270 PDEVICE_OBJECT LowerPdoDevice
; // PhysicalDeviceObject
271 PDEVICE_OBJECT LowerDevice
; // TopOfStackDeviceObject
273 UNICODE_STRING SymbolicLinkName
;
274 BOOL IsInterfaceEnabled
;
275 DEVICE_POWER_STATE DevicePowerState
;
277 } USBPORT_COMMON_DEVICE_EXTENSION
, *PUSBPORT_COMMON_DEVICE_EXTENSION
;
279 typedef struct _USBPORT_DEVICE_EXTENSION
{
280 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
282 PDEVICE_OBJECT RootHubPdo
; // RootHubDeviceObject
283 KSPIN_LOCK RootHubCallbackSpinLock
;
284 LONG RHInitCallBackLock
;
285 LONG ChirpRootPortLock
;
286 KSEMAPHORE ControllerSemaphore
;
288 UNICODE_STRING DosDeviceSymbolicName
;
290 LIST_ENTRY ControllerLink
;
291 ULONG CommonBufferLimit
;
295 PUSBPORT_MINIPORT_INTERFACE MiniPortInterface
;
296 USBPORT_RESOURCES UsbPortResources
;
297 PUSBPORT_COMMON_BUFFER_HEADER MiniPortCommonBuffer
;
298 KSPIN_LOCK MiniportSpinLock
;
300 BUS_INTERFACE_STANDARD BusInterface
;
308 PDMA_ADAPTER DmaAdapter
;
311 PKINTERRUPT InterruptObject
;
314 LONG IsrDpcHandlerCounter
;
315 KSPIN_LOCK MiniportInterruptsSpinLock
;
316 KTIMER TimerSoftInterrupt
;
317 KDPC SoftInterruptDpc
;
319 ULONG PeriodicEndpoints
;
320 LIST_ENTRY EndpointList
;
321 KSPIN_LOCK EndpointListSpinLock
;
322 LIST_ENTRY EpStateChangeList
;
323 KSPIN_LOCK EpStateChangeSpinLock
;
324 LIST_ENTRY EndpointClosedList
;
325 KSPIN_LOCK EndpointClosedSpinLock
;
326 LIST_ENTRY WorkerList
;
328 LIST_ENTRY MapTransferList
;
329 KSPIN_LOCK MapTransferSpinLock
;
330 LIST_ENTRY DoneTransferList
;
331 KSPIN_LOCK DoneTransferSpinLock
;
332 KDPC TransferFlushDpc
;
333 KSPIN_LOCK FlushTransferSpinLock
;
334 KSPIN_LOCK FlushPendingTransferSpinLock
;
336 ULONG TimerValue
; // Timer period (500) msec. default
340 KSPIN_LOCK TimerFlagsSpinLock
;
342 PRKTHREAD WorkerThread
;
343 HANDLE WorkerThreadHandle
;
344 KEVENT WorkerThreadEvent
;
345 KSPIN_LOCK WorkerThreadEventSpinLock
;
347 ULONG UsbAddressBitMap
[4];
348 LIST_ENTRY DeviceHandleList
;
349 KSPIN_LOCK DeviceHandleSpinLock
;
350 KSEMAPHORE DeviceSemaphore
;
351 /* Device Capabilities */
352 DEVICE_CAPABILITIES Capabilities
;
354 ULONG PciDeviceNumber
;
355 ULONG PciFunctionNumber
;
356 ULONG TotalBusBandwidth
;
358 LARGE_INTEGER IdleTime
;
360 KSPIN_LOCK IdleIoCsqSpinLock
;
361 LIST_ENTRY IdleIrpList
;
362 LONG IdleLockCounter
;
364 IO_CSQ BadRequestIoCsq
;
365 KSPIN_LOCK BadRequestIoCsqSpinLock
;
366 LIST_ENTRY BadRequestList
;
367 LONG BadRequestLockCounter
;
369 PUSBPORT_IRP_TABLE PendingIrpTable
;
370 PUSBPORT_IRP_TABLE ActiveIrpTable
;
372 LONG SetPowerLockCounter
;
373 KSPIN_LOCK PowerWakeSpinLock
;
374 KSPIN_LOCK SetPowerD0SpinLock
;
375 KDPC WorkerRequestDpc
;
378 /* Miniport extension should be aligned on 0x100 */
385 } USBPORT_DEVICE_EXTENSION
, *PUSBPORT_DEVICE_EXTENSION
;
388 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION
) == 0x400);
390 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION
) == 0x600);
393 typedef struct _USBPORT_RH_DESCRIPTORS
{
394 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
395 USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
;
396 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
397 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor
;
398 USB_HUB_DESCRIPTOR Descriptor
; // Size may be: 7 + 2[1..32] (7 + 2..64)
399 } USBPORT_RH_DESCRIPTORS
, *PUSBPORT_RH_DESCRIPTORS
;
401 typedef struct _USBPORT_RHDEVICE_EXTENSION
{
402 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
404 PDEVICE_OBJECT FdoDevice
;
406 USBPORT_DEVICE_HANDLE DeviceHandle
;
407 PUSBPORT_RH_DESCRIPTORS RootHubDescriptors
;
408 PUSBPORT_ENDPOINT Endpoint
;
409 ULONG ConfigurationValue
;
410 PRH_INIT_CALLBACK RootHubInitCallback
;
411 PVOID RootHubInitContext
;
412 DEVICE_CAPABILITIES Capabilities
;
414 } USBPORT_RHDEVICE_EXTENSION
, *PUSBPORT_RHDEVICE_EXTENSION
;
416 typedef struct _USBPORT_ASYNC_CALLBACK_DATA
{
418 PDEVICE_OBJECT FdoDevice
;
421 ASYNC_TIMER_CALLBACK
*CallbackFunction
;
422 ULONG CallbackContext
;
423 } USBPORT_ASYNC_CALLBACK_DATA
, *PUSBPORT_ASYNC_CALLBACK_DATA
;
425 C_ASSERT(sizeof(USBPORT_ASYNC_CALLBACK_DATA
) == 16 + 18 * sizeof(PVOID
));
427 typedef struct _TIMER_WORK_QUEUE_ITEM
{
428 WORK_QUEUE_ITEM WqItem
;
429 PDEVICE_OBJECT FdoDevice
;
431 } TIMER_WORK_QUEUE_ITEM
, *PTIMER_WORK_QUEUE_ITEM
;
433 /* Transaction Translator */
434 /* See Chapter 5 - USB Data Flow Model and Chapter 11 - Hub Specification */
436 #define USB2_FRAMES 32
437 #define USB2_MICROFRAMES 8
438 #define USB2_MAX_MICROFRAMES (USB2_FRAMES * USB2_MICROFRAMES)
440 #define USB2_MAX_MICROFRAME_ALLOCATION 7000 // bytes
441 #define USB2_CONTROLLER_DELAY 100
442 #define USB2_FS_MAX_PERIODIC_ALLOCATION 1157 // ((12000 / 8 bits) * 0.9) / (7/6) - 90% max, and bits stuffing
443 #define USB2_FS_SOF_TIME 6
444 #define USB2_HUB_DELAY 30
445 #define USB2_MAX_FS_LS_TRANSACTIONS_IN_UFRAME 16
446 #define USB2_FS_RAW_BYTES_IN_MICROFRAME 188 // (12000 / 8 bits / USB2_MICROFRAMES) = 187,5. But we use "best case budget"
449 #define USB2_LS_INTERRUPT_OVERHEAD 117 // FS-bytes
450 #define USB2_FS_INTERRUPT_OVERHEAD 13
451 #define USB2_HS_INTERRUPT_OUT_OVERHEAD 45
452 #define USB2_HS_INTERRUPT_IN_OVERHEAD 25
453 #define USB2_FS_ISOCHRONOUS_OVERHEAD 9
454 #define USB2_HS_ISOCHRONOUS_OUT_OVERHEAD 38
455 #define USB2_HS_ISOCHRONOUS_IN_OVERHEAD 18
457 typedef union _USB2_TT_ENDPOINT_PARAMS
{
459 ULONG TransferType
: 4;
461 USB_DEVICE_SPEED DeviceSpeed
: 2;
462 ULONG EndpointMoved
: 1;
466 } USB2_TT_ENDPOINT_PARAMS
;
468 C_ASSERT(sizeof(USB2_TT_ENDPOINT_PARAMS
) == sizeof(ULONG
));
470 typedef union _USB2_TT_ENDPOINT_NUMS
{
473 ULONG NumCompletes
: 4;
477 } USB2_TT_ENDPOINT_NUMS
;
479 C_ASSERT(sizeof(USB2_TT_ENDPOINT_NUMS
) == sizeof(ULONG
));
481 typedef struct _USB2_TT_ENDPOINT
{
483 PUSBPORT_ENDPOINT Endpoint
;
484 struct _USB2_TT_ENDPOINT
* NextTtEndpoint
;
485 USB2_TT_ENDPOINT_PARAMS TtEndpointParams
;
486 USB2_TT_ENDPOINT_NUMS Nums
;
487 USHORT MaxPacketSize
;
488 USHORT PreviosPeriod
;
495 UCHAR StartMicroframe
;
496 } USB2_TT_ENDPOINT
, *PUSB2_TT_ENDPOINT
;
498 typedef struct _USB2_FRAME_BUDGET
{
499 PUSB2_TT_ENDPOINT IsoEndpoint
;
500 PUSB2_TT_ENDPOINT IntEndpoint
;
501 PUSB2_TT_ENDPOINT AltEndpoint
;
504 } USB2_FRAME_BUDGET
, *PUSB2_FRAME_BUDGET
;
506 typedef struct _USB2_TT
{
507 PUSB2_HC_EXTENSION HcExtension
;
510 USB2_TT_ENDPOINT IntEndpoint
[USB2_FRAMES
];
511 USB2_TT_ENDPOINT IsoEndpoint
[USB2_FRAMES
];
512 USB2_FRAME_BUDGET FrameBudget
[USB2_FRAMES
];
513 ULONG NumStartSplits
[USB2_FRAMES
][USB2_MICROFRAMES
];
514 ULONG TimeCS
[USB2_FRAMES
][USB2_MICROFRAMES
];
515 } USB2_TT
, *PUSB2_TT
;
517 typedef struct _USB2_TT_EXTENSION
{
518 PDEVICE_OBJECT RootHubPdo
;
521 ULONG Bandwidth
[USB2_FRAMES
];
524 USHORT DeviceAddress
;
529 } USB2_TT_EXTENSION
, *PUSB2_TT_EXTENSION
;
531 typedef struct _USB2_HC_EXTENSION
{
532 ULONG MaxHsBusAllocation
;
534 ULONG TimeUsed
[USB2_FRAMES
][USB2_MICROFRAMES
];
536 } USB2_HC_EXTENSION
, *PUSB2_HC_EXTENSION
;
541 USBPORT_USBDStatusToNtStatus(
543 IN USBD_STATUS USBDStatus
);
548 IN PVOID MiniPortExtension
,
549 IN ULONG Milliseconds
);
553 USBPORT_TransferFlushDpc(
555 IN PVOID DeferredContext
,
556 IN PVOID SystemArgument1
,
557 IN PVOID SystemArgument2
);
561 USBPORT_CreateWorkerThread(
562 IN PDEVICE_OBJECT FdoDevice
);
567 IN PDEVICE_OBJECT FdoDevice
,
570 PUSBPORT_COMMON_BUFFER_HEADER
572 USBPORT_AllocateCommonBuffer(
573 IN PDEVICE_OBJECT FdoDevice
,
574 IN SIZE_T BufferLength
);
578 USBPORT_FreeCommonBuffer(
579 IN PDEVICE_OBJECT FdoDevice
,
580 IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
);
584 USBPORT_AllocateTransfer(
585 IN PDEVICE_OBJECT FdoDevice
,
587 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
593 USBPORT_FlushMapTransfers(
594 IN PDEVICE_OBJECT FdoDevice
);
600 IN PVOID DeferredContext
,
601 IN PVOID SystemArgument1
,
602 IN PVOID SystemArgument2
);
606 USBPORT_InterruptService(
607 IN PKINTERRUPT Interrupt
,
608 IN PVOID ServiceContext
);
612 USBPORT_SignalWorkerThread(
613 IN PDEVICE_OBJECT FdoDevice
);
617 USBPORT_CompleteTransfer(
619 IN USBD_STATUS TransferStatus
);
624 IN PDEVICE_OBJECT FdoDevice
);
628 USBPORT_WorkerRequestDpc(
630 IN PVOID DeferredContext
,
631 IN PVOID SystemArgument1
,
632 IN PVOID SystemArgument2
);
636 USBPORT_QueueDoneTransfer(
637 IN PUSBPORT_TRANSFER Transfer
,
638 IN USBD_STATUS USBDStatus
);
642 USBPORT_MiniportInterrupts(
643 IN PDEVICE_OBJECT FdoDevice
,
644 IN BOOLEAN IsEnable
);
648 USBPORT_SetRegistryKeyValue(
649 IN PDEVICE_OBJECT DeviceObject
,
650 IN BOOL UseDriverKey
,
652 IN PCWSTR ValueNameString
,
658 USBPORT_GetRegistryKeyValueFullInfo(
659 IN PDEVICE_OBJECT FdoDevice
,
660 IN PDEVICE_OBJECT PdoDevice
,
661 IN BOOL UseDriverKey
,
662 IN PCWSTR SourceString
,
665 IN ULONG NumberOfBytes
);
670 IN PDEVICE_OBJECT FdoDevice
);
675 IN PDEVICE_OBJECT FdoDevice
);
679 USBPORT_RemoveUSBxFdo(
680 IN PDEVICE_OBJECT FdoDevice
);
684 USBPORT_FindUSB2Controller(
685 IN PDEVICE_OBJECT FdoDevice
);
689 USBPORT_FindCompanionControllers(
690 IN PDEVICE_OBJECT USB2FdoDevice
,
691 IN BOOLEAN IsObRefer
,
692 IN BOOLEAN IsFDOsReturned
);
696 USBPORT_InvalidateControllerHandler(
697 IN PDEVICE_OBJECT FdoDevice
,
702 USBPORT_DoneTransfer(
703 IN PUSBPORT_TRANSFER Transfer
);
709 IN PVOID MiniPortExtension
,
716 USBPORT_TestDebugBreak(
717 IN PVOID MiniPortExtension
);
721 USBPORT_AssertFailure(
722 PVOID MiniPortExtension
,
723 PVOID FailedAssertion
,
731 IN PVOID MiniPortExtension
);
736 IN PVOID MiniPortExtension
,
745 USBPORT_DumpingDeviceDescriptor(
746 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
750 USBPORT_DumpingConfiguration(
751 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
);
755 USBPORT_DumpingCapabilities(
756 IN PDEVICE_CAPABILITIES Capabilities
);
760 USBPORT_DumpingSetupPacket(
761 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
);
776 USBPORT_HandleSelectConfiguration(
777 IN PDEVICE_OBJECT FdoDevice
,
783 USBPORT_AddDeviceHandle(
784 IN PDEVICE_OBJECT FdoDevice
,
785 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
789 USBPORT_RemoveDeviceHandle(
790 IN PDEVICE_OBJECT FdoDevice
,
791 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
795 USBPORT_ValidateDeviceHandle(
796 IN PDEVICE_OBJECT FdoDevice
,
797 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
801 USBPORT_CreateDevice(
802 IN OUT PUSB_DEVICE_HANDLE
*pUsbdDeviceHandle
,
803 IN PDEVICE_OBJECT FdoDevice
,
804 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
805 IN USHORT PortStatus
,
810 USBPORT_InitializeDevice(
811 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
812 IN PDEVICE_OBJECT FdoDevice
);
816 USBPORT_GetUsbDescriptor(
817 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
818 IN PDEVICE_OBJECT FdoDevice
,
820 IN PUCHAR ConfigDesc
,
821 IN PULONG ConfigDescSize
);
825 USBPORT_HandleSelectInterface(
826 IN PDEVICE_OBJECT FdoDevice
,
832 USBPORT_RemoveDevice(
833 IN PDEVICE_OBJECT FdoDevice
,
834 IN OUT PUSBPORT_DEVICE_HANDLE DeviceHandle
,
839 USBPORT_SendSetupPacket(
840 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
841 IN PDEVICE_OBJECT FdoDevice
,
842 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
,
845 IN OUT PULONG TransferedLen
,
846 IN OUT PUSBD_STATUS pUSBDStatus
);
850 USBPORT_RestoreDevice(
851 IN PDEVICE_OBJECT FdoDevice
,
852 IN OUT PUSBPORT_DEVICE_HANDLE OldDeviceHandle
,
853 IN OUT PUSBPORT_DEVICE_HANDLE NewDeviceHandle
);
857 USBPORT_Initialize20Hub(
858 IN PDEVICE_OBJECT FdoDevice
,
859 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
866 IN PDEVICE_OBJECT FdoDevice
,
867 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
868 IN PUSBPORT_PIPE_HANDLE PipeHandle
,
869 IN PUSBD_STATUS UsbdStatus
);
873 MiniportOpenEndpoint(
874 IN PDEVICE_OBJECT FdoDevice
,
875 IN PUSBPORT_ENDPOINT Endpoint
);
880 IN PDEVICE_OBJECT FdoDevice
,
881 IN PUSBPORT_ENDPOINT Endpoint
);
886 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
887 IN PDEVICE_OBJECT FdoDevice
,
888 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
892 MiniportCloseEndpoint(
893 IN PDEVICE_OBJECT FdoDevice
,
894 IN PUSBPORT_ENDPOINT Endpoint
);
898 USBPORT_AddPipeHandle(
899 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
900 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
904 USBPORT_RemovePipeHandle(
905 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
906 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
910 USBPORT_ValidatePipeHandle(
911 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
912 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
916 USBPORT_FlushClosedEndpointList(
917 IN PDEVICE_OBJECT FdoDevice
);
921 USBPORT_SetEndpointState(
922 IN PUSBPORT_ENDPOINT Endpoint
,
927 USBPORT_GetEndpointState(
928 IN PUSBPORT_ENDPOINT Endpoint
);
932 USBPORT_InvalidateEndpointHandler(
933 IN PDEVICE_OBJECT FdoDevice
,
934 IN PUSBPORT_ENDPOINT Endpoint
,
939 USBPORT_EndpointWorker(
940 IN PUSBPORT_ENDPOINT Endpoint
,
945 USBPORT_NukeAllEndpoints(
946 IN PDEVICE_OBJECT FdoDevice
);
950 USBPORT_EndpointHasQueuedTransfers(
951 IN PDEVICE_OBJECT FdoDevice
,
952 IN PUSBPORT_ENDPOINT Endpoint
,
953 IN PULONG TransferCount
);
958 USBPORT_PdoQueryInterface(
959 IN PDEVICE_OBJECT FdoDevice
,
960 IN PDEVICE_OBJECT PdoDevice
,
966 USBPORT_PdoDeviceControl(
967 PDEVICE_OBJECT PdoDevice
,
972 USBPORT_FdoDeviceControl(
973 PDEVICE_OBJECT FdoDevice
,
978 USBPORT_FdoInternalDeviceControl(
979 IN PDEVICE_OBJECT FdoDevice
,
984 USBPORT_PdoInternalDeviceControl(
985 IN PDEVICE_OBJECT FdoDevice
,
990 USBPORT_GetSymbolicName(
991 IN PDEVICE_OBJECT RootHubPdo
,
992 IN PUNICODE_STRING DestinationString
);
997 USBPORT_InitializeIsoTransfer(
998 IN PDEVICE_OBJECT FdoDevice
,
999 IN
struct _URB_ISOCH_TRANSFER
* Urb
,
1000 IN PUSBPORT_TRANSFER Transfer
);
1004 USBPORT_CompleteIsoTransfer(
1005 IN PVOID MiniPortExtension
,
1006 IN PVOID MiniPortEndpoint
,
1007 IN PVOID TransferParameters
,
1008 IN ULONG TransferLength
);
1014 IN PDEVICE_OBJECT FdoDevice
,
1020 IN PDEVICE_OBJECT FdoDevice
,
1027 IN PDEVICE_OBJECT PdoDevice
,
1033 IN PDEVICE_OBJECT FdoDevice
,
1038 USBPORT_IdleNotification(
1039 IN PDEVICE_OBJECT PdoDevice
,
1044 USBPORT_AdjustDeviceCapabilities(
1045 IN PDEVICE_OBJECT FdoDevice
,
1046 IN PDEVICE_OBJECT PdoDevice
);
1050 USBPORT_DoIdleNotificationCallback(
1055 USBPORT_CompletePdoWaitWake(
1056 IN PDEVICE_OBJECT FdoDevice
);
1060 USBPORT_DoSetPowerD0(
1061 IN PDEVICE_OBJECT FdoDevice
);
1067 IN PVOID DeferredContext
,
1068 IN PVOID SystemArgument1
,
1069 IN PVOID SystemArgument2
);
1073 USBPORT_HcQueueWakeDpc(
1074 IN PDEVICE_OBJECT FdoDevice
);
1079 USBPORT_InsertIdleIrp(
1085 USBPORT_RemoveIdleIrp(
1091 USBPORT_PeekNextIdleIrp(
1094 IN PVOID PeekContext
);
1098 USBPORT_AcquireIdleLock(
1104 USBPORT_ReleaseIdleLock(
1110 USBPORT_CompleteCanceledIdleIrp(
1116 USBPORT_InsertBadRequest(
1122 USBPORT_RemoveBadRequest(
1128 USBPORT_PeekNextBadRequest(
1131 IN PVOID PeekContext
);
1135 USBPORT_AcquireBadRequestLock(
1141 USBPORT_ReleaseBadRequestLock(
1147 USBPORT_CompleteCanceledBadRequest(
1153 USBPORT_InsertIrpInTable(
1154 IN PUSBPORT_IRP_TABLE IrpTable
,
1159 USBPORT_RemovePendingTransferIrp(
1160 IN PDEVICE_OBJECT FdoDevice
,
1165 USBPORT_RemoveActiveTransferIrp(
1166 IN PDEVICE_OBJECT FdoDevice
,
1171 USBPORT_FindUrbInIrpTable(
1172 IN PUSBPORT_IRP_TABLE IrpTable
,
1178 USBPORT_CancelActiveTransferIrp(
1179 IN PDEVICE_OBJECT DeviceObject
,
1184 USBPORT_FlushAbortList(
1185 IN PUSBPORT_ENDPOINT Endpoint
);
1189 USBPORT_FlushCancelList(
1190 IN PUSBPORT_ENDPOINT Endpoint
);
1194 USBPORT_QueueTransferUrb(
1199 USBPORT_FlushAllEndpoints(
1200 IN PDEVICE_OBJECT FdoDevice
);
1204 USBPORT_FlushPendingTransfers(
1205 IN PUSBPORT_ENDPOINT Endpoint
);
1209 USBPORT_QueueActiveUrbToEndpoint(
1210 IN PUSBPORT_ENDPOINT Endpoint
,
1215 USBPORT_FlushController(
1216 IN PDEVICE_OBJECT FdoDevice
);
1220 USBPORT_BadRequestFlush(
1221 IN PDEVICE_OBJECT FdoDevice
);
1225 USBPORT_AbortEndpoint(
1226 IN PDEVICE_OBJECT FdoDevice
,
1227 IN PUSBPORT_ENDPOINT Endpoint
,
1233 USBPORT_RootHubEndpointWorker(
1234 PUSBPORT_ENDPOINT Endpoint
);
1238 USBPORT_RootHubCreateDevice(
1239 IN PDEVICE_OBJECT FdoDevice
,
1240 IN PDEVICE_OBJECT PdoDevice
);
1244 USBPORT_InvalidateRootHub(
1245 PVOID MiniPortExtension
);
1249 USBPORT_RootHubPowerAndChirpAllCcPorts(
1250 IN PDEVICE_OBJECT FdoDevice
);
1255 USBPORT_SplitTransfer(
1256 IN PDEVICE_OBJECT FdoDevice
,
1257 IN PUSBPORT_ENDPOINT Endpoint
,
1258 IN PUSBPORT_TRANSFER Transfer
,
1259 IN PLIST_ENTRY List
);
1263 USBPORT_DoneSplitTransfer(
1264 IN PUSBPORT_TRANSFER SplitTransfer
);
1268 USBPORT_CancelSplitTransfer(
1269 IN PUSBPORT_TRANSFER SplitTransfer
);
1274 USBPORT_HandleSubmitURB(
1275 IN PDEVICE_OBJECT PdoDevice
,
1282 USBPORT_AllocateBandwidthUSB2(
1283 IN PDEVICE_OBJECT FdoDevice
,
1284 IN PUSBPORT_ENDPOINT Endpoint
);
1288 USBPORT_FreeBandwidthUSB2(
1289 IN PDEVICE_OBJECT FdoDevice
,
1290 IN PUSBPORT_ENDPOINT Endpoint
);
1292 #endif /* USBPORT_H__ */