14 #include <drivers/usbport/usbmport.h>
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
21 #ifdef USBD_TRANSFER_DIRECTION // due hubbusif.h included usbdi.h (Which overwrites...)
22 #undef USBD_TRANSFER_DIRECTION
23 #define USBD_TRANSFER_DIRECTION 0x00000001
26 #define USBPORT_RECIPIENT_ROOT_HUB BMREQUEST_TO_DEVICE
27 #define USBPORT_RECIPIENT_ROOT_PORT BMREQUEST_TO_OTHER
29 #define INVALIDATE_CONTROLLER_RESET 1
30 #define INVALIDATE_CONTROLLER_SURPRISE_REMOVE 2
31 #define INVALIDATE_CONTROLLER_SOFT_INTERRUPT 3
33 #define INVALIDATE_ENDPOINT_ONLY 0
34 #define INVALIDATE_ENDPOINT_WORKER_THREAD 1
35 #define INVALIDATE_ENDPOINT_WORKER_DPC 2
36 #define INVALIDATE_ENDPOINT_INT_NEXT_SOF 3
38 #define USBPORT_DMA_DIRECTION_FROM_DEVICE 1
39 #define USBPORT_DMA_DIRECTION_TO_DEVICE 2
41 #define USB_PORT_TAG 'pbsu'
42 #define URB_FUNCTION_MAX 0x31
44 /* Hub Class Feature Selectors (Recipient - Port) */
45 #define FEATURE_PORT_CONNECTION 0
46 #define FEATURE_PORT_ENABLE 1
47 #define FEATURE_PORT_SUSPEND 2
48 #define FEATURE_PORT_OVER_CURRENT 3
49 #define FEATURE_PORT_RESET 4
50 #define FEATURE_PORT_POWER 8
51 #define FEATURE_PORT_LOW_SPEED 9
52 #define FEATURE_C_PORT_CONNECTION 16
53 #define FEATURE_C_PORT_ENABLE 17
54 #define FEATURE_C_PORT_SUSPEND 18
55 #define FEATURE_C_PORT_OVER_CURRENT 19
56 #define FEATURE_C_PORT_RESET 20
58 /* Hub Class Feature Selectors (Recipient - Hub) */
59 #define FEATURE_C_HUB_LOCAL_POWER 0
60 #define FEATURE_C_HUB_OVER_CURRENT 1
63 #define USBPORT_FLAG_INT_CONNECTED 0x00000001
64 #define USBPORT_FLAG_HC_STARTED 0x00000002
65 #define USBPORT_FLAG_HC_POLLING 0x00000004
66 #define USBPORT_FLAG_WORKER_THREAD_ON 0x00000008
67 #define USBPORT_FLAG_HC_SUSPEND 0x00000100
68 #define USBPORT_FLAG_INTERRUPT_ENABLED 0x00000400
69 #define USBPORT_FLAG_SELECTIVE_SUSPEND 0x00000800
70 #define USBPORT_FLAG_DOS_SYMBOLIC_NAME 0x00010000
71 #define USBPORT_FLAG_LEGACY_SUPPORT 0x00080000
72 #define USBPORT_FLAG_HC_WAKE_SUPPORT 0x00200000
73 #define USBPORT_FLAG_DIAGNOSTIC_MODE 0x00800000 //IOCTL_USB_DIAGNOSTIC_MODE_ON
74 #define USBPORT_FLAG_COMPANION_HC 0x01000000
75 #define USBPORT_FLAG_REGISTERED_FDO 0x02000000
76 #define USBPORT_FLAG_NO_HACTION 0x04000000
77 #define USBPORT_FLAG_BIOS_DISABLE_SS 0x08000000 //Selective Suspend
78 #define USBPORT_FLAG_PWR_AND_CHIRP_LOCK 0x10000000
79 #define USBPORT_FLAG_POWER_AND_CHIRP_OK 0x40000000
80 #define USBPORT_FLAG_RH_INIT_CALLBACK 0x80000000
83 #define USBPORT_PNP_STATE_NOT_INIT 0x00000001
84 #define USBPORT_PNP_STATE_STARTED 0x00000002
85 #define USBPORT_PNP_STATE_FAILED 0x00000004
86 #define USBPORT_PNP_STATE_STOPPED 0x00000008
89 #define USBPORT_TMFLAG_TIMER_QUEUED 0x00000001
90 #define USBPORT_TMFLAG_HC_SUSPENDED 0x00000002
91 #define USBPORT_TMFLAG_HC_RESUME 0x00000004
92 #define USBPORT_TMFLAG_RH_SUSPENDED 0x00000008
93 #define USBPORT_TMFLAG_TIMER_STARTED 0x00000010
94 #define USBPORT_TMFLAG_WAKE 0x00000020
95 #define USBPORT_TMFLAG_IDLE_QUEUEITEM_ON 0x00000040
98 #define USBPORT_MPFLAG_INTERRUPTS_ENABLED 0x00000001
99 #define USBPORT_MPFLAG_SUSPENDED 0x00000002
101 /* Device handle Flags (USBPORT_DEVICE_HANDLE) */
102 #define DEVICE_HANDLE_FLAG_ROOTHUB 0x00000002
103 #define DEVICE_HANDLE_FLAG_REMOVED 0x00000008
104 #define DEVICE_HANDLE_FLAG_INITIALIZED 0x00000010
106 /* Endpoint Flags (USBPORT_ENDPOINT) */
107 #define ENDPOINT_FLAG_DMA_TYPE 0x00000001
108 #define ENDPOINT_FLAG_ROOTHUB_EP0 0x00000002
109 #define ENDPOINT_FLAG_NUKE 0x00000008
110 #define ENDPOINT_FLAG_QUEUENE_EMPTY 0x00000010
111 #define ENDPOINT_FLAG_ABORTING 0x00000020
112 #define ENDPOINT_FLAG_IDLE 0x00000100
113 #define ENDPOINT_FLAG_OPENED 0x00000200
114 #define ENDPOINT_FLAG_CLOSED 0x00000400
116 /* UsbdFlags Flags (URB) */
117 #define USBD_FLAG_ALLOCATED_MDL 0x00000002
118 #define USBD_FLAG_NOT_ISO_TRANSFER 0x00000010
119 #define USBD_FLAG_ALLOCATED_TRANSFER 0x00000020
121 /* Pipe handle Flags (USBPORT_PIPE_HANDLE) */
122 #define PIPE_HANDLE_FLAG_CLOSED 0x00000001
123 #define PIPE_HANDLE_FLAG_NULL_PACKET_SIZE 0x00000002
125 /* Transfer Flags (USBPORT_TRANSFER) */
126 #define TRANSFER_FLAG_CANCELED 0x00000001
127 #define TRANSFER_FLAG_DMA_MAPPED 0x00000002
128 #define TRANSFER_FLAG_SUBMITED 0x00000008
129 #define TRANSFER_FLAG_ABORTED 0x00000010
130 #define TRANSFER_FLAG_ISO 0x00000020
131 #define TRANSFER_FLAG_DEVICE_GONE 0x00000080
132 #define TRANSFER_FLAG_SPLITED 0x00000100
134 extern KSPIN_LOCK USBPORT_SpinLock
;
135 extern LIST_ENTRY USBPORT_MiniPortDrivers
;
137 typedef USBD_STATUS
* PUSBD_STATUS
;
139 typedef struct _USBPORT_COMMON_BUFFER_HEADER
{
142 PHYSICAL_ADDRESS LogicalAddress
;
144 ULONG_PTR VirtualAddress
;
145 ULONG_PTR PhysicalAddress
;
146 } USBPORT_COMMON_BUFFER_HEADER
, *PUSBPORT_COMMON_BUFFER_HEADER
;
148 typedef struct _USBPORT_ENDPOINT
*PUSBPORT_ENDPOINT
;
150 typedef struct _USBPORT_PIPE_HANDLE
{
153 USB_ENDPOINT_DESCRIPTOR EndpointDescriptor
;
155 PUSBPORT_ENDPOINT Endpoint
;
157 } USBPORT_PIPE_HANDLE
, *PUSBPORT_PIPE_HANDLE
;
159 typedef struct _USBPORT_CONFIGURATION_HANDLE
{
160 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
;
161 LIST_ENTRY InterfaceHandleList
;
162 //USB_CONFIGURATION_DESCRIPTOR CfgDescriptor; // Body.
163 } USBPORT_CONFIGURATION_HANDLE
, *PUSBPORT_CONFIGURATION_HANDLE
;
165 typedef struct _USBPORT_INTERFACE_HANDLE
{
166 LIST_ENTRY InterfaceLink
;
167 UCHAR AlternateSetting
;
169 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
171 USBPORT_PIPE_HANDLE PipeHandle
[1];
172 } USBPORT_INTERFACE_HANDLE
, *PUSBPORT_INTERFACE_HANDLE
;
174 typedef struct _USBPORT_DEVICE_HANDLE
{
176 USHORT DeviceAddress
;
178 USBPORT_PIPE_HANDLE PipeHandle
;
181 LIST_ENTRY PipeHandleList
;
182 PUSBPORT_CONFIGURATION_HANDLE ConfigHandle
;
183 struct _USBPORT_DEVICE_HANDLE
*HubDeviceHandle
;
184 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
185 LIST_ENTRY DeviceHandleLink
;
186 LONG DeviceHandleLock
;
188 } USBPORT_DEVICE_HANDLE
, *PUSBPORT_DEVICE_HANDLE
;
190 typedef struct _USBPORT_ENDPOINT
{
192 PDEVICE_OBJECT FdoDevice
;
193 PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
;
194 PUSBPORT_DEVICE_HANDLE DeviceHandle
;
195 USBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
196 ULONG EndpointWorker
;
199 KSPIN_LOCK EndpointSpinLock
;
200 KIRQL EndpointOldIrql
;
201 KIRQL EndpointStateOldIrql
;
204 LONG FlushPendingLock
;
208 LIST_ENTRY StateChangeLink
;
209 KSPIN_LOCK StateChangeSpinLock
;
211 LIST_ENTRY PendingTransferList
;
212 LIST_ENTRY TransferList
;
213 LIST_ENTRY CancelList
;
214 LIST_ENTRY AbortList
;
216 LIST_ENTRY EndpointLink
;
217 LIST_ENTRY WorkerLink
;
218 LIST_ENTRY CloseLink
;
219 LIST_ENTRY DispatchLink
;
220 LIST_ENTRY FlushLink
;
221 LIST_ENTRY FlushControllerLink
;
222 LIST_ENTRY FlushAbortLink
;
223 } USBPORT_ENDPOINT
, *PUSBPORT_ENDPOINT
;
225 typedef struct _USBPORT_TRANSFER
{
230 PVOID MiniportTransfer
;
231 SIZE_T PortTransferLength
; // Only port part
232 SIZE_T FullTransferLength
; // Port + miniport
233 PUSBPORT_ENDPOINT Endpoint
;
234 USBPORT_TRANSFER_PARAMETERS TransferParameters
;
235 PMDL TransferBufferMDL
;
237 LIST_ENTRY TransferLink
;
238 USBD_STATUS USBDStatus
;
239 ULONG CompletedTransferLen
;
240 ULONG NumberOfMapRegisters
;
241 PVOID MapRegisterBase
;
244 // SgList should be LAST field
245 USBPORT_SCATTER_GATHER_LIST SgList
; // Non IsoTransfer
246 } USBPORT_TRANSFER
, *PUSBPORT_TRANSFER
;
248 typedef struct _USBPORT_IRP_TABLE
{
249 struct _USBPORT_IRP_TABLE
* LinkNextTable
;
251 } USBPORT_IRP_TABLE
, *PUSBPORT_IRP_TABLE
;
253 typedef struct _USBPORT_COMMON_DEVICE_EXTENSION
{
254 PDEVICE_OBJECT SelfDevice
;
255 PDEVICE_OBJECT LowerPdoDevice
; // PhysicalDeviceObject
256 PDEVICE_OBJECT LowerDevice
; // TopOfStackDeviceObject
258 UNICODE_STRING SymbolicLinkName
;
259 BOOL IsInterfaceEnabled
;
260 DEVICE_POWER_STATE DevicePowerState
;
262 } USBPORT_COMMON_DEVICE_EXTENSION
, *PUSBPORT_COMMON_DEVICE_EXTENSION
;
264 typedef struct _USBPORT_DEVICE_EXTENSION
{
265 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
267 PDEVICE_OBJECT RootHubPdo
; // RootHubDeviceObject
268 KSPIN_LOCK RootHubCallbackSpinLock
;
269 LONG RHInitCallBackLock
;
270 LONG ChirpRootPortLock
;
271 KSEMAPHORE ControllerSemaphore
;
273 UNICODE_STRING DosDeviceSymbolicName
;
275 LIST_ENTRY ControllerLink
;
276 ULONG CommonBufferLimit
;
280 PUSBPORT_MINIPORT_INTERFACE MiniPortInterface
;
281 USBPORT_RESOURCES UsbPortResources
;
282 PUSBPORT_COMMON_BUFFER_HEADER MiniPortCommonBuffer
;
283 KSPIN_LOCK MiniportSpinLock
;
285 BUS_INTERFACE_STANDARD BusInterface
;
293 PDMA_ADAPTER DmaAdapter
;
296 PKINTERRUPT InterruptObject
;
299 LONG IsrDpcHandlerCounter
;
300 KSPIN_LOCK MiniportInterruptsSpinLock
;
301 KTIMER TimerSoftInterrupt
;
302 KDPC SoftInterruptDpc
;
304 ULONG PeriodicEndpoints
;
305 LIST_ENTRY EndpointList
;
306 KSPIN_LOCK EndpointListSpinLock
;
307 LIST_ENTRY EpStateChangeList
;
308 KSPIN_LOCK EpStateChangeSpinLock
;
309 LIST_ENTRY EndpointClosedList
;
310 KSPIN_LOCK EndpointClosedSpinLock
;
311 LIST_ENTRY WorkerList
;
313 LIST_ENTRY MapTransferList
;
314 KSPIN_LOCK MapTransferSpinLock
;
315 LIST_ENTRY DoneTransferList
;
316 KSPIN_LOCK DoneTransferSpinLock
;
317 KDPC TransferFlushDpc
;
318 KSPIN_LOCK FlushTransferSpinLock
;
319 KSPIN_LOCK FlushPendingTransferSpinLock
;
321 ULONG TimerValue
; // Timer period (500) msec. default
325 KSPIN_LOCK TimerFlagsSpinLock
;
327 PRKTHREAD WorkerThread
;
328 HANDLE WorkerThreadHandle
;
329 KEVENT WorkerThreadEvent
;
330 KSPIN_LOCK WorkerThreadEventSpinLock
;
332 ULONG UsbAddressBitMap
[4];
333 LIST_ENTRY DeviceHandleList
;
334 KSPIN_LOCK DeviceHandleSpinLock
;
335 KSEMAPHORE DeviceSemaphore
;
336 /* Device Capabilities */
337 DEVICE_CAPABILITIES Capabilities
;
339 ULONG PciDeviceNumber
;
340 ULONG PciFunctionNumber
;
341 ULONG TotalBusBandwidth
;
343 LARGE_INTEGER IdleTime
;
345 KSPIN_LOCK IdleIoCsqSpinLock
;
346 LIST_ENTRY IdleIrpList
;
347 LONG IdleLockCounter
;
349 IO_CSQ BadRequestIoCsq
;
350 KSPIN_LOCK BadRequestIoCsqSpinLock
;
351 LIST_ENTRY BadRequestList
;
352 LONG BadRequestLockCounter
;
354 PUSBPORT_IRP_TABLE PendingIrpTable
;
355 PUSBPORT_IRP_TABLE ActiveIrpTable
;
357 LONG SetPowerLockCounter
;
358 KSPIN_LOCK PowerWakeSpinLock
;
359 KSPIN_LOCK SetPowerD0SpinLock
;
360 KDPC WorkerRequestDpc
;
362 ULONG Padded
[34]; // Miniport extension should be aligned on 0x100
363 } USBPORT_DEVICE_EXTENSION
, *PUSBPORT_DEVICE_EXTENSION
;
365 C_ASSERT(sizeof(USBPORT_DEVICE_EXTENSION
) == 0x400);
367 typedef struct _USBPORT_RH_DESCRIPTORS
{
368 USB_DEVICE_DESCRIPTOR DeviceDescriptor
;
369 USB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
;
370 USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
371 USB_ENDPOINT_DESCRIPTOR EndPointDescriptor
;
372 USB_HUB_DESCRIPTOR Descriptor
; // Size may be: 7 + 2[1..32] (7 + 2..64)
373 } USBPORT_RH_DESCRIPTORS
, *PUSBPORT_RH_DESCRIPTORS
;
375 typedef struct _USBPORT_RHDEVICE_EXTENSION
{
376 USBPORT_COMMON_DEVICE_EXTENSION CommonExtension
;
378 PDEVICE_OBJECT FdoDevice
;
380 USBPORT_DEVICE_HANDLE DeviceHandle
;
381 PUSBPORT_RH_DESCRIPTORS RootHubDescriptors
;
382 PUSBPORT_ENDPOINT Endpoint
;
383 ULONG ConfigurationValue
;
384 PRH_INIT_CALLBACK RootHubInitCallback
;
385 PVOID RootHubInitContext
;
386 DEVICE_CAPABILITIES Capabilities
;
388 } USBPORT_RHDEVICE_EXTENSION
, *PUSBPORT_RHDEVICE_EXTENSION
;
390 typedef struct _USBPORT_ASYNC_CALLBACK_DATA
{
392 PDEVICE_OBJECT FdoDevice
;
395 ASYNC_TIMER_CALLBACK
*CallbackFunction
;
396 ULONG CallbackContext
;
397 } USBPORT_ASYNC_CALLBACK_DATA
, *PUSBPORT_ASYNC_CALLBACK_DATA
;
399 C_ASSERT(sizeof(USBPORT_ASYNC_CALLBACK_DATA
) == 88);
401 typedef struct _TIMER_WORK_QUEUE_ITEM
{
402 WORK_QUEUE_ITEM WqItem
;
403 PDEVICE_OBJECT FdoDevice
;
405 } TIMER_WORK_QUEUE_ITEM
, *PTIMER_WORK_QUEUE_ITEM
;
410 USBPORT_USBDStatusToNtStatus(
412 IN USBD_STATUS USBDStatus
);
418 IN ULONG Milliseconds
);
422 USBPORT_TransferFlushDpc(
424 IN PVOID DeferredContext
,
425 IN PVOID SystemArgument1
,
426 IN PVOID SystemArgument2
);
430 USBPORT_CreateWorkerThread(
431 IN PDEVICE_OBJECT FdoDevice
);
436 IN PDEVICE_OBJECT FdoDevice
,
439 PUSBPORT_COMMON_BUFFER_HEADER
441 USBPORT_AllocateCommonBuffer(
442 IN PDEVICE_OBJECT FdoDevice
,
443 IN SIZE_T BufferLength
);
447 USBPORT_FreeCommonBuffer(
448 IN PDEVICE_OBJECT FdoDevice
,
449 IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer
);
453 USBPORT_AllocateTransfer(
454 IN PDEVICE_OBJECT FdoDevice
,
456 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
462 USBPORT_FlushMapTransfers(
463 IN PDEVICE_OBJECT FdoDevice
);
469 IN PVOID DeferredContext
,
470 IN PVOID SystemArgument1
,
471 IN PVOID SystemArgument2
);
475 USBPORT_InterruptService(
476 IN PKINTERRUPT Interrupt
,
477 IN PVOID ServiceContext
);
481 USBPORT_SignalWorkerThread(
482 IN PDEVICE_OBJECT FdoDevice
);
486 USBPORT_CompleteTransfer(
488 IN USBD_STATUS TransferStatus
);
493 IN PDEVICE_OBJECT FdoDevice
);
497 USBPORT_WorkerRequestDpc(
499 IN PVOID DeferredContext
,
500 IN PVOID SystemArgument1
,
501 IN PVOID SystemArgument2
);
505 USBPORT_QueueDoneTransfer(
506 IN PUSBPORT_TRANSFER Transfer
,
507 IN USBD_STATUS USBDStatus
);
511 USBPORT_MiniportInterrupts(
512 IN PDEVICE_OBJECT FdoDevice
,
513 IN BOOLEAN IsEnable
);
517 USBPORT_SetRegistryKeyValue(
518 IN PDEVICE_OBJECT DeviceObject
,
519 IN BOOL UseDriverKey
,
521 IN PCWSTR ValueNameString
,
527 USBPORT_GetRegistryKeyValueFullInfo(
528 IN PDEVICE_OBJECT FdoDevice
,
529 IN PDEVICE_OBJECT PdoDevice
,
530 IN BOOL UseDriverKey
,
531 IN PCWSTR SourceString
,
534 IN ULONG NumberOfBytes
);
539 IN PDEVICE_OBJECT FdoDevice
);
544 IN PDEVICE_OBJECT FdoDevice
);
548 USBPORT_RemoveUSBxFdo(
549 IN PDEVICE_OBJECT FdoDevice
);
553 USBPORT_FindUSB2Controller(
554 IN PDEVICE_OBJECT FdoDevice
);
558 USBPORT_FindCompanionControllers(
559 IN PDEVICE_OBJECT USB2FdoDevice
,
560 IN BOOLEAN IsObRefer
,
561 IN BOOLEAN IsFDOsReturned
);
565 USBPORT_InvalidateControllerHandler(
566 IN PDEVICE_OBJECT FdoDevice
,
580 USBPORT_TestDebugBreak(
585 USBPORT_AssertFailure(
587 PVOID FailedAssertion
,
609 USBPORT_DumpingDeviceDescriptor(
610 IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
);
614 USBPORT_DumpingConfiguration(
615 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor
);
619 USBPORT_DumpingCapabilities(
620 IN PDEVICE_CAPABILITIES Capabilities
);
624 USBPORT_DumpingSetupPacket(
625 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
);
640 USBPORT_HandleSelectConfiguration(
641 IN PDEVICE_OBJECT FdoDevice
,
647 USBPORT_AddDeviceHandle(
648 IN PDEVICE_OBJECT FdoDevice
,
649 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
653 USBPORT_RemoveDeviceHandle(
654 IN PDEVICE_OBJECT FdoDevice
,
655 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
659 USBPORT_ValidateDeviceHandle(
660 IN PDEVICE_OBJECT FdoDevice
,
661 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
);
665 USBPORT_CreateDevice(
666 IN OUT PUSB_DEVICE_HANDLE
*pUsbdDeviceHandle
,
667 IN PDEVICE_OBJECT FdoDevice
,
668 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
669 IN USHORT PortStatus
,
674 USBPORT_InitializeDevice(
675 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
676 IN PDEVICE_OBJECT FdoDevice
);
680 USBPORT_GetUsbDescriptor(
681 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
682 IN PDEVICE_OBJECT FdoDevice
,
684 IN PUCHAR ConfigDesc
,
685 IN PULONG ConfigDescSize
);
689 USBPORT_HandleSelectInterface(
690 IN PDEVICE_OBJECT FdoDevice
,
696 USBPORT_RemoveDevice(
697 IN PDEVICE_OBJECT FdoDevice
,
698 IN OUT PUSBPORT_DEVICE_HANDLE DeviceHandle
,
703 USBPORT_SendSetupPacket(
704 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
705 IN PDEVICE_OBJECT FdoDevice
,
706 IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
,
709 IN OUT PULONG TransferedLen
,
710 IN OUT PUSBD_STATUS pUSBDStatus
);
714 USBPORT_RestoreDevice(
715 IN PDEVICE_OBJECT FdoDevice
,
716 IN OUT PUSBPORT_DEVICE_HANDLE OldDeviceHandle
,
717 IN OUT PUSBPORT_DEVICE_HANDLE NewDeviceHandle
);
721 USBPORT_Initialize20Hub(
722 IN PDEVICE_OBJECT FdoDevice
,
723 IN PUSBPORT_DEVICE_HANDLE HubDeviceHandle
,
730 IN PDEVICE_OBJECT FdoDevice
,
731 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
732 IN PUSBPORT_PIPE_HANDLE PipeHandle
,
733 IN PUSBD_STATUS UsbdStatus
);
737 MiniportOpenEndpoint(
738 IN PDEVICE_OBJECT FdoDevice
,
739 IN PUSBPORT_ENDPOINT Endpoint
);
744 IN PDEVICE_OBJECT FdoDevice
,
745 IN PUSBPORT_ENDPOINT Endpoint
);
750 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
751 IN PDEVICE_OBJECT FdoDevice
,
752 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
756 MiniportCloseEndpoint(
757 IN PDEVICE_OBJECT FdoDevice
,
758 IN PUSBPORT_ENDPOINT Endpoint
);
762 USBPORT_AddPipeHandle(
763 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
764 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
768 USBPORT_RemovePipeHandle(
769 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
770 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
774 USBPORT_ValidatePipeHandle(
775 IN PUSBPORT_DEVICE_HANDLE DeviceHandle
,
776 IN PUSBPORT_PIPE_HANDLE PipeHandle
);
780 USBPORT_FlushClosedEndpointList(
781 IN PDEVICE_OBJECT FdoDevice
);
785 USBPORT_SetEndpointState(
786 IN PUSBPORT_ENDPOINT Endpoint
,
791 USBPORT_GetEndpointState(
792 IN PUSBPORT_ENDPOINT Endpoint
);
796 USBPORT_InvalidateEndpointHandler(
797 IN PDEVICE_OBJECT FdoDevice
,
798 IN PUSBPORT_ENDPOINT Endpoint
,
803 USBPORT_EndpointWorker(
804 IN PUSBPORT_ENDPOINT Endpoint
,
809 USBPORT_NukeAllEndpoints(
810 IN PDEVICE_OBJECT FdoDevice
);
814 USBPORT_EndpointHasQueuedTransfers(
815 IN PDEVICE_OBJECT FdoDevice
,
816 IN PUSBPORT_ENDPOINT Endpoint
,
817 IN PULONG TransferCount
);
822 USBPORT_PdoQueryInterface(
823 IN PDEVICE_OBJECT FdoDevice
,
824 IN PDEVICE_OBJECT PdoDevice
,
830 USBPORT_PdoDeviceControl(
831 PDEVICE_OBJECT PdoDevice
,
836 USBPORT_FdoDeviceControl(
837 PDEVICE_OBJECT FdoDevice
,
842 USBPORT_FdoInternalDeviceControl(
843 IN PDEVICE_OBJECT FdoDevice
,
848 USBPORT_PdoInternalDeviceControl(
849 IN PDEVICE_OBJECT FdoDevice
,
854 USBPORT_GetSymbolicName(
855 IN PDEVICE_OBJECT RootHubPdo
,
856 IN PUNICODE_STRING DestinationString
);
862 IN PDEVICE_OBJECT FdoDevice
,
868 IN PDEVICE_OBJECT FdoDevice
,
875 IN PDEVICE_OBJECT PdoDevice
,
881 IN PDEVICE_OBJECT FdoDevice
,
886 USBPORT_IdleNotification(
887 IN PDEVICE_OBJECT PdoDevice
,
892 USBPORT_AdjustDeviceCapabilities(
893 IN PDEVICE_OBJECT FdoDevice
,
894 IN PDEVICE_OBJECT PdoDevice
);
898 USBPORT_DoIdleNotificationCallback(
903 USBPORT_CompletePdoWaitWake(
904 IN PDEVICE_OBJECT FdoDevice
);
908 USBPORT_DoSetPowerD0(
909 IN PDEVICE_OBJECT FdoDevice
);
915 IN PVOID DeferredContext
,
916 IN PVOID SystemArgument1
,
917 IN PVOID SystemArgument2
);
921 USBPORT_HcQueueWakeDpc(
922 IN PDEVICE_OBJECT FdoDevice
);
927 USBPORT_InsertIdleIrp(
933 USBPORT_RemoveIdleIrp(
939 USBPORT_PeekNextIdleIrp(
942 IN PVOID PeekContext
);
946 USBPORT_AcquireIdleLock(
952 USBPORT_ReleaseIdleLock(
958 USBPORT_CompleteCanceledIdleIrp(
964 USBPORT_InsertBadRequest(
970 USBPORT_RemoveBadRequest(
976 USBPORT_PeekNextBadRequest(
979 IN PVOID PeekContext
);
983 USBPORT_AcquireBadRequestLock(
989 USBPORT_ReleaseBadRequestLock(
995 USBPORT_CompleteCanceledBadRequest(
1001 USBPORT_InsertIrpInTable(
1002 IN PUSBPORT_IRP_TABLE IrpTable
,
1007 USBPORT_RemovePendingTransferIrp(
1008 IN PDEVICE_OBJECT FdoDevice
,
1013 USBPORT_RemoveActiveTransferIrp(
1014 IN PDEVICE_OBJECT FdoDevice
,
1019 USBPORT_FindUrbInIrpTable(
1020 IN PUSBPORT_IRP_TABLE IrpTable
,
1026 USBPORT_CancelActiveTransferIrp(
1027 IN PDEVICE_OBJECT DeviceObject
,
1032 USBPORT_FlushAbortList(
1033 IN PUSBPORT_ENDPOINT Endpoint
);
1037 USBPORT_FlushCancelList(
1038 IN PUSBPORT_ENDPOINT Endpoint
);
1042 USBPORT_QueueTransferUrb(
1047 USBPORT_FlushAllEndpoints(
1048 IN PDEVICE_OBJECT FdoDevice
);
1052 USBPORT_FlushPendingTransfers(
1053 IN PUSBPORT_ENDPOINT Endpoint
);
1057 USBPORT_QueueActiveUrbToEndpoint(
1058 IN PUSBPORT_ENDPOINT Endpoint
,
1063 USBPORT_FlushController(
1064 IN PDEVICE_OBJECT FdoDevice
);
1068 USBPORT_BadRequestFlush(
1069 IN PDEVICE_OBJECT FdoDevice
);
1073 USBPORT_AbortEndpoint(
1074 IN PDEVICE_OBJECT FdoDevice
,
1075 IN PUSBPORT_ENDPOINT Endpoint
,
1081 USBPORT_RootHubEndpointWorker(
1082 PUSBPORT_ENDPOINT Endpoint
);
1086 USBPORT_RootHubCreateDevice(
1087 IN PDEVICE_OBJECT FdoDevice
,
1088 IN PDEVICE_OBJECT PdoDevice
);
1092 USBPORT_InvalidateRootHub(
1097 USBPORT_RootHubPowerAndChirpAllCcPorts(
1098 IN PDEVICE_OBJECT FdoDevice
);
1103 USBPORT_HandleSubmitURB(
1104 IN PDEVICE_OBJECT PdoDevice
,
1111 USBPORT_AllocateBandwidthUSB2(
1112 IN PDEVICE_OBJECT FdoDevice
,
1113 IN PUSBPORT_ENDPOINT Endpoint
);
1117 USBPORT_FreeBandwidthUSB2(
1118 IN PDEVICE_OBJECT FdoDevice
,
1119 IN PUSBPORT_ENDPOINT Endpoint
);
1121 #endif /* USBPORT_H__ */