ReactOS 0.4.17-dev-1281-g065abb3
upstream.cpp File Reference
#include "usbhub3.h"
#include <debug.h>
Include dependency graph for upstream.cpp:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define HUB_CLASS_CODE   9
 
#define HUB_PROTOCOL_SINGLE_TT   1
 
#define HUB_PROTOCOL_MULTI_TT   2
 
#define HUB_PROTOCOL_ANY   (-1)
 
#define HUB_30_MAX_STATUS_PACKET   2
 

Functions

static BOOLEAN NTAPI HubSendToParent (_In_ HubFdo *Hub, _In_ WDFREQUEST Request, _In_ ULONG IoControlCode, _In_ PVOID Payload, _In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion, _In_ WDFCONTEXT Context)
 
static NTSTATUS NTAPI HubCreateParentRequest (_In_ HubFdo *Hub, _Out_ WDFREQUEST *Request)
 
static PUSB_INTERFACE_DESCRIPTOR NTAPI HubFindHubInterface (_In_ HubFdo *Hub)
 
static VOID NTAPI HubConfigurationComplete (_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context)
 
static VOID NTAPI HubPipeResetComplete (_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context)
 
static VOID NTAPI HubResetComplete (_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context)
 
static VOID NTAPI HubParentInfoComplete (_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context)
 

Variables

static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubConfigurationComplete
 
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubPipeResetComplete
 
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubResetComplete
 
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubParentInfoComplete
 

Macro Definition Documentation

◆ HUB_30_MAX_STATUS_PACKET

#define HUB_30_MAX_STATUS_PACKET   2

Definition at line 20 of file upstream.cpp.

◆ HUB_CLASS_CODE

#define HUB_CLASS_CODE   9

Definition at line 14 of file upstream.cpp.

◆ HUB_PROTOCOL_ANY

#define HUB_PROTOCOL_ANY   (-1)

Definition at line 17 of file upstream.cpp.

◆ HUB_PROTOCOL_MULTI_TT

#define HUB_PROTOCOL_MULTI_TT   2

Definition at line 16 of file upstream.cpp.

◆ HUB_PROTOCOL_SINGLE_TT

#define HUB_PROTOCOL_SINGLE_TT   1

Definition at line 15 of file upstream.cpp.

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file upstream.cpp.

Function Documentation

◆ HubConfigurationComplete()

static VOID NTAPI HubConfigurationComplete ( _In_ WDFREQUEST  Request,
_In_ WDFIOTARGET  Target,
_In_ PWDF_REQUEST_COMPLETION_PARAMS  Params,
_In_ WDFCONTEXT  Context 
)
static

Definition at line 176 of file upstream.cpp.

181{
182 PURB Urb = (PURB)Context;
183 HubFdo* Hub = HubFdo::FromDevice(WdfIoTargetGetDevice(Target));
184 NTSTATUS Status = Params->IoStatus.Status;
186
187 if (NT_SUCCESS(Status))
188 {
189 Pipe = &Urb->UrbSelectConfiguration.Interface.Pipes[0];
190
191 Hub->m_Interrupt.Pipe = Pipe->PipeHandle;
192 Hub->m_ConfigurationHandle = Urb->UrbSelectConfiguration.ConfigurationHandle;
193 Hub->m_InterruptMaxPacket = Pipe->MaximumPacketSize;
194
195 if (Hub->m_ParentInfo.DeviceDescriptor.bcdUSB >= 0x0300 &&
196 Pipe->MaximumPacketSize != HUB_30_MAX_STATUS_PACKET)
197 {
198 DPRINT1("Hub %p SuperSpeed status endpoint packet size %u\n", Hub, Pipe->MaximumPacketSize);
199 }
200
201 if (Hub->m_ParentInfo.DeviceDescriptor.bcdUSB >= 0x0300 &&
202 Pipe->MaximumPacketSize > HUB_30_MAX_STATUS_PACKET)
203 {
205 }
206 }
207
208 if (!NT_SUCCESS(Status))
209 {
210 DPRINT1("Hub %p set configuration failed 0x%lx, URB status 0x%lx\n",
211 Hub, Status, Urb->UrbHeader.Status);
212 }
213
216
218}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
HubFdo * Hub
Definition: bootdev.cpp:261
Definition: fdo.h:132
VOID Post(_In_ HubEvent Event)
Definition: fdo.h:194
HubInterruptRequest m_Interrupt
Definition: fdo.h:414
static HubFdo * FromDevice(_In_ WDFDEVICE Device)
Definition: fdo.cpp:37
USHORT m_InterruptMaxPacket
Definition: fdo.h:429
USBD_CONFIGURATION_HANDLE m_ConfigurationHandle
Definition: fdo.h:430
HubParentInfo m_ParentInfo
Definition: fdo.h:360
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
Status
Definition: gdiplustypes.h:24
@ ConfigurationSet
@ ConfigurationFailed
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define STATUS_INVALID_HW_PROFILE
Definition: ntstatus.h:855
USBD_PIPE_HANDLE Pipe
Definition: hubreq.h:72
USB_DEVICE_DESCRIPTOR DeviceDescriptor
Definition: fdo.h:89
Definition: usb.h:565
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define HUB_30_MAX_STATUS_PACKET
Definition: upstream.cpp:20
struct _URB * PURB
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
WdfObjectDelete(String)
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:308
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741

◆ HubCreateParentRequest()

static NTSTATUS NTAPI HubCreateParentRequest ( _In_ HubFdo *  Hub,
_Out_ WDFREQUEST *  Request 
)
static

Definition at line 64 of file upstream.cpp.

67{
70
72 Attributes.ParentObject = Hub->m_Device;
73
74 *Request = NULL;
75 Status = WdfRequestCreate(&Attributes, WdfDeviceGetIoTarget(Hub->m_Device), Request);
76 if (!NT_SUCCESS(Status))
77 DPRINT1("Hub %p parent request create failed 0x%lx\n", Hub, Status);
78
79 return Status;
80}
WDFDEVICE m_Device
Definition: fdo.h:349
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define NULL
Definition: types.h:112
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147

Referenced by HubMachine::GetParentInfo(), HubMachine::ResetHub(), and HubMachine::SelectHubConfiguration().

◆ HubFindHubInterface()

static PUSB_INTERFACE_DESCRIPTOR NTAPI HubFindHubInterface ( _In_ HubFdo *  Hub)
static

Definition at line 88 of file upstream.cpp.

90{
91 static const LONG HighSpeedOrder[] = { HUB_PROTOCOL_MULTI_TT, HUB_PROTOCOL_SINGLE_TT, 0, HUB_PROTOCOL_ANY };
92 static const LONG OtherOrder[] = { HUB_PROTOCOL_SINGLE_TT, 0, HUB_PROTOCOL_ANY };
95 const LONG* Order;
98
99 switch (Hub->m_Parent.HubSpeed)
100 {
101 case UsbHighSpeed:
102 Order = HighSpeedOrder;
103 Count = RTL_NUMBER_OF(HighSpeedOrder);
104 break;
105
106 case UsbFullSpeed:
107 case UsbSuperSpeed:
108 Order = OtherOrder;
109 Count = RTL_NUMBER_OF(OtherOrder);
110 break;
111
112 default:
113 return NULL;
114 }
115
116 for (Index = 0; Index < Count; Index++)
117 {
119 if (Interface != NULL)
120 return Interface;
121 }
122
123 return NULL;
124}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
PUSB_CONFIGURATION_DESCRIPTOR m_ConfigDescriptor
Definition: fdo.h:425
UCXHUB_PARENT_INTERFACE m_Parent
Definition: fdo.h:355
long LONG
Definition: pedump.c:60
USB_DEVICE_SPEED HubSpeed
Definition: hubucx.h:504
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
#define HUB_CLASS_CODE
Definition: upstream.cpp:14
#define HUB_PROTOCOL_ANY
Definition: upstream.cpp:17
#define HUB_PROTOCOL_MULTI_TT
Definition: upstream.cpp:16
#define HUB_PROTOCOL_SINGLE_TT
Definition: upstream.cpp:15
@ UsbSuperSpeed
Definition: usb200.h:45
@ UsbHighSpeed
Definition: usb200.h:44
@ UsbFullSpeed
Definition: usb200.h:43
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
Definition: usbd.c:478
USHORT Count
Definition: userreq.cpp:200
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by HubMachine::SelectHubConfiguration().

◆ HubParentInfoComplete()

static VOID NTAPI HubParentInfoComplete ( _In_ WDFREQUEST  Request,
_In_ WDFIOTARGET  Target,
_In_ PWDF_REQUEST_COMPLETION_PARAMS  Params,
_In_ WDFCONTEXT  Context 
)
static

Definition at line 327 of file upstream.cpp.

332{
334 NTSTATUS Status = Params->IoStatus.Status;
336 WDFIOTARGET RootTarget;
337
339
340 if (!NT_SUCCESS(Status))
341 {
342 DPRINT1("Hub %p parent hub info failed 0x%lx\n", Hub, Status);
343 }
344 else
345 {
346 Status = WdfIoTargetCreate(Hub->m_Device, WDF_NO_OBJECT_ATTRIBUTES, &RootTarget);
347 if (!NT_SUCCESS(Status))
348 DPRINT1("Hub %p root hub target create failed 0x%lx\n", Hub, Status);
349 }
350
351 if (NT_SUCCESS(Status))
352 {
354
355 Status = WdfIoTargetOpen(RootTarget, &Open);
356 if (!NT_SUCCESS(Status))
357 {
358 DPRINT1("Hub %p root hub target open on %p failed 0x%lx\n",
360 WdfObjectDelete(RootTarget);
361 }
362 else
363 {
364 if (Hub->m_RootHubTarget != NULL)
366 Hub->m_RootHubTarget = RootTarget;
367 }
368 }
369
372
375}
VOID SetFlag(_In_ HubFlag Flag)
Definition: fdo.h:160
WDFIOTARGET m_RootHubTarget
Definition: fdo.h:368
#define Open
Definition: syshdrs.h:62
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
PDEVICE_OBJECT RootHubPdo
Definition: fdo.h:88
ULONG Flags
Definition: fdo.h:100
#define HUB_PARENT_DISABLE_LPM
Definition: fdo.h:106
FORCEINLINE VOID WDF_IO_TARGET_OPEN_PARAMS_INIT_EXISTING_DEVICE(_Out_ PWDF_IO_TARGET_OPEN_PARAMS Params, _In_ PDEVICE_OBJECT DeviceObject)
Definition: wdfiotarget.h:287
#define WDF_NO_OBJECT_ATTRIBUTES
Definition: wdftypes.h:105

◆ HubPipeResetComplete()

static VOID NTAPI HubPipeResetComplete ( _In_ WDFREQUEST  Request,
_In_ WDFIOTARGET  Target,
_In_ PWDF_REQUEST_COMPLETION_PARAMS  Params,
_In_ WDFCONTEXT  Context 
)
static

Definition at line 225 of file upstream.cpp.

230{
232
235
236 if (!NT_SUCCESS(Params->IoStatus.Status))
237 {
238 DPRINT1("Hub %p status change pipe reset failed 0x%lx, URB status 0x%lx\n",
239 Hub, Params->IoStatus.Status, Hub->m_PipeUrb.Hdr.Status);
240 }
241
244}
HubControlRequest m_Control
Definition: fdo.h:413
struct _URB_PIPE_REQUEST m_PipeUrb
Definition: fdo.h:365
@ PipeResetFailed

◆ HubResetComplete()

static VOID NTAPI HubResetComplete ( _In_ WDFREQUEST  Request,
_In_ WDFIOTARGET  Target,
_In_ PWDF_REQUEST_COMPLETION_PARAMS  Params,
_In_ WDFCONTEXT  Context 
)
static

Definition at line 269 of file upstream.cpp.

274{
276 NTSTATUS Status = Params->IoStatus.Status;
278
280
281 if (NT_SUCCESS(Status))
282 DPRINT("Hub %p reset by parent, flags 0x%lx\n", Hub, Hub->m_ResetFlags);
283 else
284 DPRINT1("Hub %p reset by parent failed 0x%lx\n", Hub, Status);
285
286 Flags.AsUlong = Hub->m_ResetFlags;
287 if (NT_SUCCESS(Status) && Flags.HostContextLost)
289
291
292 if (NT_SUCCESS(Status))
294 else if (Status == STATUS_NO_SUCH_DEVICE)
296 else
298}
VOID MarkDevicesProgrammingLost()
Definition: fanout.cpp:840
ULONG m_ResetFlags
Definition: fdo.h:364
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
@ ResetFailedOnRemoval
#define DPRINT
Definition: sndvol32.h:73
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136

◆ HubSendToParent()

static BOOLEAN NTAPI HubSendToParent ( _In_ HubFdo *  Hub,
_In_ WDFREQUEST  Request,
_In_ ULONG  IoControlCode,
_In_ PVOID  Payload,
_In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE  Completion,
_In_ WDFCONTEXT  Context 
)
static

Internal IOCTL to the hub's parent with Argument1 = Payload. FALSE when refused.

Definition at line 31 of file upstream.cpp.

38{
41
42 RtlZeroMemory(&Stack, sizeof(Stack));
44 Stack.Parameters.DeviceIoControl.IoControlCode = IoControlCode;
45 Stack.Parameters.Others.Argument1 = Payload;
46 WdfRequestWdmFormatUsingStackLocation(Request, &Stack);
47
48 WdfRequestSetCompletionRoutine(Request, Completion, Context);
49
50 if (WdfRequestSend(Request, WdfDeviceGetIoTarget(Hub->m_Device), WDF_NO_SEND_OPTIONS))
51 return TRUE;
52
53 /* A refusal with a success status leaves nothing to report */
54 Status = WdfRequestGetStatus(Request);
55 if (!NT_SUCCESS(Status))
56 DPRINT1("Hub %p parent request 0x%lx not sent 0x%lx\n", Hub, IoControlCode, Status);
57
58 return NT_SUCCESS(Status);
59}
#define TRUE
Definition: types.h:120
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
Definition: wdfrequest.h:677
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define WDF_NO_SEND_OPTIONS
Definition: wdftypes.h:109
#define IRP_MJ_INTERNAL_DEVICE_CONTROL

Referenced by HubMachine::GetParentInfo(), HubMachine::ResetHub(), HubMachine::ResetStatusChangePipe(), and HubMachine::SelectHubConfiguration().

Variable Documentation

◆ HubConfigurationComplete

EVT_WDF_REQUEST_COMPLETION_ROUTINE HubConfigurationComplete
static

Definition at line 22 of file upstream.cpp.

Referenced by HubMachine::SelectHubConfiguration().

◆ HubParentInfoComplete

EVT_WDF_REQUEST_COMPLETION_ROUTINE HubParentInfoComplete
static

Definition at line 25 of file upstream.cpp.

Referenced by HubMachine::GetParentInfo().

◆ HubPipeResetComplete

EVT_WDF_REQUEST_COMPLETION_ROUTINE HubPipeResetComplete
static

Definition at line 23 of file upstream.cpp.

Referenced by HubMachine::ResetStatusChangePipe().

◆ HubResetComplete

EVT_WDF_REQUEST_COMPLETION_ROUTINE HubResetComplete
static

Definition at line 24 of file upstream.cpp.

Referenced by HubMachine::ResetHub().