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

Go to the source code of this file.

Macros

#define NDEBUG
 
#define UCX_RECIPIENT(Type)   ((Type) & 0x03)
 
#define UCX_REQUEST_TYPE(Type)   (((Type) >> 5) & 0x03)
 
#define UCX_DIRECTION_IN(Type)   (((Type) & 0x80) != 0)
 
#define UCX_RECIPIENT_DEVICE   0
 
#define UCX_RECIPIENT_OTHER   3
 
#define UCX_TYPE_STANDARD   0
 
#define UCX_TYPE_CLASS   1
 

Functions

VOID NTAPI UcxEvtRootHubHeldTransferCancel (_In_ WDFREQUEST Request)
 
VOID NTAPI UcxEvtRootHubInterruptTransfer (_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode)
 
static BOOLEAN NTAPI UcxClassifyRootHubRequest (_In_ const UCX_ROOTHUB_CONFIG *Config, _In_ const USB_DEFAULT_PIPE_SETUP_PACKET *Setup, _Out_ PFN_UCX_ROOTHUB_CONTROL_URB *Callback)
 
VOID NTAPI UcxEvtRootHubControlTransfer (_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 10 of file rhub.cpp.

◆ UCX_DIRECTION_IN

#define UCX_DIRECTION_IN (   Type)    (((Type) & 0x80) != 0)

Definition at line 365 of file rhub.cpp.

◆ UCX_RECIPIENT

#define UCX_RECIPIENT (   Type)    ((Type) & 0x03)

Definition at line 363 of file rhub.cpp.

◆ UCX_RECIPIENT_DEVICE

#define UCX_RECIPIENT_DEVICE   0

Definition at line 367 of file rhub.cpp.

◆ UCX_RECIPIENT_OTHER

#define UCX_RECIPIENT_OTHER   3

Definition at line 368 of file rhub.cpp.

◆ UCX_REQUEST_TYPE

#define UCX_REQUEST_TYPE (   Type)    (((Type) >> 5) & 0x03)

Definition at line 364 of file rhub.cpp.

◆ UCX_TYPE_CLASS

#define UCX_TYPE_CLASS   1

Definition at line 370 of file rhub.cpp.

◆ UCX_TYPE_STANDARD

#define UCX_TYPE_STANDARD   0

Definition at line 369 of file rhub.cpp.

Function Documentation

◆ UcxClassifyRootHubRequest()

static BOOLEAN NTAPI UcxClassifyRootHubRequest ( _In_ const UCX_ROOTHUB_CONFIG *  Config,
_In_ const USB_DEFAULT_PIPE_SETUP_PACKET *  Setup,
_Out_ PFN_UCX_ROOTHUB_CONTROL_URB *  Callback 
)
static

TRUE for the seven hub requests with their own callback slot, even if empty.

Definition at line 376 of file rhub.cpp.

380{
381 UCHAR Recipient = UCX_RECIPIENT(Setup->bmRequestType.B);
382 UCHAR Type = UCX_REQUEST_TYPE(Setup->bmRequestType.B);
383 BOOLEAN In = UCX_DIRECTION_IN(Setup->bmRequestType.B);
384 BOOLEAN ToDevice = (Recipient == UCX_RECIPIENT_DEVICE);
385 BOOLEAN ToPort = (Recipient == UCX_RECIPIENT_OTHER);
386
387 *Callback = NULL;
388
389 if (Type == UCX_TYPE_CLASS && (ToDevice || ToPort))
390 {
391 switch (Setup->bRequest)
392 {
394 if (In)
395 break;
396 *Callback = ToDevice ? Config->EvtRootHubClearHubFeature
397 : Config->EvtRootHubClearPortFeature;
398 return TRUE;
399
401 if (!In)
402 break;
403 *Callback = ToDevice ? Config->EvtRootHubGetHubStatus
404 : Config->EvtRootHubGetPortStatus;
405 return TRUE;
406
408 if (In)
409 break;
410 *Callback = ToDevice ? Config->EvtRootHubSetHubFeature
411 : Config->EvtRootHubSetPortFeature;
412 return TRUE;
413 }
414 }
415
416 /* Matched as a standard device request, not the hub class form */
417 if (Type == UCX_TYPE_STANDARD && ToDevice && In &&
419 {
420 *Callback = Config->EvtRootHubGetPortErrorCount;
421 return TRUE;
422 }
423
424 return FALSE;
425}
Type
Definition: Type.h:7
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE ACPI_ADR_SPACE_HANDLER ACPI_ADR_SPACE_SETUP Setup
Definition: acpixf.h:834
unsigned char BOOLEAN
Definition: actypes.h:127
@ In
_In_ ULONG _In_ ULONG _In_opt_ DXGKCB_MIRACAST_SEND_MESSAGE_CALLBACK Callback
Definition: dispmprt.h:620
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define UCX_RECIPIENT(Type)
Definition: rhub.cpp:363
#define UCX_RECIPIENT_DEVICE
Definition: rhub.cpp:367
#define UCX_TYPE_CLASS
Definition: rhub.cpp:370
#define UCX_TYPE_STANDARD
Definition: rhub.cpp:369
#define UCX_REQUEST_TYPE(Type)
Definition: rhub.cpp:364
#define UCX_DIRECTION_IN(Type)
Definition: rhub.cpp:365
#define UCX_RECIPIENT_OTHER
Definition: rhub.cpp:368
unsigned char UCHAR
Definition: typedefs.h:53
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
#define USB_REQUEST_GET_STATUS
Definition: usb100.h:78
#define USB_REQUEST_SET_FEATURE
Definition: usb100.h:80
#define USB_REQUEST_CLEAR_FEATURE
Definition: usb100.h:79
#define USB_REQUEST_GET_PORT_ERR_COUNT
Definition: usb200.h:289

Referenced by UcxEvtRootHubControlTransfer().

◆ UcxEvtRootHubControlTransfer()

VOID NTAPI UcxEvtRootHubControlTransfer ( _In_ WDFQUEUE  Queue,
_In_ WDFREQUEST  Request,
_In_ size_t  OutputBufferLength,
_In_ size_t  InputBufferLength,
_In_ ULONG  IoControlCode 
)

Definition at line 429 of file rhub.cpp.

435{
436 UcxRootHub* RootHub = UcxGetControlQueueContext(Queue)->RootHub;
440
444
445 if (!RootHub->m_Controller->BlockReset())
446 {
447 DPRINT1("Root hub %p failing control transfer %p, controller resetting\n", RootHub, Request);
448 WdfRequestComplete(Request, STATUS_NO_SUCH_DEVICE);
449 return;
450 }
451
452 /* Same offset in the plain and the _EX control transfer URBs */
453 Setup = (PUSB_DEFAULT_PIPE_SETUP_PACKET)Urb->UrbControlTransfer.SetupPacket;
454
455 /* A recognized hub request with no callback is not offered to EvtRootHubControlUrb */
457 Callback = RootHub->m_Config.EvtRootHubControlUrb;
458
459 if (Callback != NULL)
460 Callback(RootHub->m_Handle, Request);
461
462 RootHub->m_Controller->UnblockReset();
463
464 if (Callback == NULL)
465 {
466 DPRINT1("Root hub %p has no callback for request 0x%x type 0x%x\n",
467 RootHub, Setup->bRequest, Setup->bmRequestType.B);
469 WdfRequestComplete(Request, STATUS_NOT_SUPPORTED);
470 }
471}
#define DPRINT1
Definition: precomp.h:8
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
if(dx< 0)
Definition: linetemp.h:194
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
static BOOLEAN NTAPI UcxClassifyRootHubRequest(_In_ const UCX_ROOTHUB_CONFIG *Config, _In_ const USB_DEFAULT_PIPE_SETUP_PACKET *Setup, _Out_ PFN_UCX_ROOTHUB_CONTROL_URB *Callback)
Definition: rhub.cpp:376
PVOID Arg1
Definition: ucxutil.h:103
Definition: usb.h:565
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
EVT_UCX_ROOTHUB_CONTROL_URB * PFN_UCX_ROOTHUB_CONTROL_URB
Definition: ucxroothub.h:151
_Must_inspect_result_ _In_ UCXCONTROLLER _In_ PUCX_ROOTHUB_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXROOTHUB * RootHub
Definition: ucxroothub.h:299
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
struct _USB_DEFAULT_PIPE_SETUP_PACKET * PUSB_DEFAULT_PIPE_SETUP_PACKET
struct _URB * PURB
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
#define NT_ASSERT
Definition: rtlfuncs.h:3334

◆ UcxEvtRootHubHeldTransferCancel()

VOID NTAPI UcxEvtRootHubHeldTransferCancel ( _In_ WDFREQUEST  Request)

Definition at line 281 of file rhub.cpp.

283{
284 UcxInterruptQueueState* State = UcxGetInterruptQueueState(WdfRequestGetIoQueue(Request));
285
286 {
287 SpinLockGuard Guard(&State->PortChangeLock);
288
289 State->HeldTransfer = NULL;
290 State->LastTransferCanceled = TRUE;
291 }
292
293 DPRINT("Held status change transfer %p canceled\n", Request);
294 WdfRequestComplete(Request, STATUS_CANCELLED);
295}
#define DPRINT
Definition: sndvol32.h:73
#define STATUS_CANCELLED
Definition: udferr_usr.h:170

◆ UcxEvtRootHubInterruptTransfer()

VOID NTAPI UcxEvtRootHubInterruptTransfer ( _In_ WDFQUEUE  Queue,
_In_ WDFREQUEST  Request,
_In_ size_t  OutputBufferLength,
_In_ size_t  InputBufferLength,
_In_ ULONG  IoControlCode 
)

Definition at line 300 of file rhub.cpp.

306{
307 UcxInterruptQueueState* State = UcxGetInterruptQueueState(Queue);
308 UcxRootHub* RootHub = State->RootHub;
310 NTSTATUS HoldStatus = STATUS_SUCCESS;
311 BOOLEAN Hold;
312
316
318
319 {
320 SpinLockGuard Guard(&State->PortChangeLock);
321
322 State->LastTransferCanceled = FALSE;
323
324 Hold = (Urb->UrbHeader.UsbdFlags & UCXHUB_URB_FLAG_PEND_INTERRUPT_TX) != 0 &&
325 State->PortChangeGeneration == State->PortChangeGenerationProcessed;
326
327 if (!Hold)
328 {
329 State->PortChangeGenerationProcessed = State->PortChangeGeneration;
330 }
331 else
332 {
333 HoldStatus = WdfRequestMarkCancelableEx(Request, UcxEvtRootHubHeldTransferCancel);
334 if (NT_SUCCESS(HoldStatus))
335 State->HeldTransfer = Request;
336 }
337 }
338
339 if (!NT_SUCCESS(HoldStatus))
340 {
341 DPRINT1("Root hub %p could not hold status change transfer %p 0x%lx\n", RootHub, Request, HoldStatus);
342 WdfRequestComplete(Request, HoldStatus);
343 return;
344 }
345
346 if (Hold)
347 return;
348
349 if (!RootHub->m_Controller->BlockReset())
350 {
351 DPRINT1("Root hub %p failing status change transfer %p, controller resetting\n", RootHub, Request);
352 WdfRequestComplete(Request, STATUS_NO_SUCH_DEVICE);
353 return;
354 }
355
356 RootHub->m_Config.EvtRootHubInterruptTx(RootHub->m_Handle, Request);
357 RootHub->m_Controller->UnblockReset();
358}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define UCXHUB_URB_FLAG_PEND_INTERRUPT_TX
Definition: hubucx.h:100
EVT_WDF_REQUEST_CANCEL UcxEvtRootHubHeldTransferCancel
Definition: rhub.h:175
#define STATUS_SUCCESS
Definition: shellext.h:65
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
Definition: usb.h:95