1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
UcmCallbacks.cpp
Abstract:
Interface for callbacks from UcmCx.
Environment:
Kernel-mode only.
--*/
#include "Pch.h"
#include "UcmCallbacks.tmh"
#pragma alloc_text(PAGE, Ucm_EvtConnectorSetDataRole)
#pragma alloc_text(PAGE, Ucm_EvtConnectorSetPowerRole)
NTSTATUS
Ucm_EvtConnectorSetDataRole(
_In_ UCMCONNECTOR Connector,
_In_ UCM_DATA_ROLE DataRole
)
/*++
Routine Description:
Set the power role on a given connector. This may require performing
a data role swap.
Arguments:
Connector - The connector on which to set the power role.
DataRole - The data role to set on the connector.
Returns:
NTSTATUS
--*/
{
NTSTATUS status;
WDFDEVICE device;
PPPM_CONNECTOR connector;
PPPM_CONTEXT ppmCtx;
UCSI_USB_OPERATION_ROLE role;
UCSI_CONTROL cmd;
PAGED_CODE();
TRACE_FUNC_ENTRY(TRACE_FLAG_UCMCALLBACKS);
connector = PpmUcmConnector_GetContext(Connector)->PpmConnector;
device = connector->WdfDevice;
ppmCtx = &Fdo_GetContext(device)->PpmCtx;
TRACE_INFO(TRACE_FLAG_UCMCALLBACKS, "[Device: 0x%p] Data role change to %!UCM_DATA_ROLE! requested", device, DataRole);
if (!Convert(DataRole, role))
{
status = STATUS_INVALID_PARAMETER;
TRACE_ERROR(TRACE_FLAG_UCMCALLBACKS, "[Device: 0x%p] Invalid data role requested %!UCM_DATA_ROLE!", device, DataRole);
goto Exit;
}
cmd.AsUInt64 = 0;
cmd.Command = UcsiCommandSetUor;
cmd.SetUor.ConnectorNumber = connector->Index;
cmd.SetUor.UsbOperationRole = role;
status = Ppm_SendCommand(ppmCtx, cmd, Ucm_EvtSetDataRoleCompleted, ppmCtx);
if (!NT_SUCCESS(status))
{
goto Exit;
}
Exit:
TRACE_FUNC_EXIT(TRACE_FLAG_UCMCALLBACKS);
return status;
}
NTSTATUS
Ucm_EvtConnectorSetPowerRole(
_In_ UCMCONNECTOR Connector,
_In_ UCM_POWER_ROLE PowerRole
)
/*++
Routine Description:
Set the power role on a given connector. This may require performing
a power role swap.
Arguments:
Connector - The connector on which to set the power role.
PowerRole - The power role to set on the connector.
Returns:
NTSTATUS
--*/
{
NTSTATUS status;
WDFDEVICE device;
PPPM_CONNECTOR connector;
PPPM_CONTEXT ppmCtx;
UCSI_POWER_DIRECTION_ROLE role;
UCSI_CONTROL cmd;
PAGED_CODE();
TRACE_FUNC_ENTRY(TRACE_FLAG_UCMCALLBACKS);
connector = PpmUcmConnector_GetContext(Connector)->PpmConnector;
device = connector->WdfDevice;
ppmCtx = &Fdo_GetContext(device)->PpmCtx;
TRACE_INFO(TRACE_FLAG_UCMCALLBACKS, "[Device: 0x%p] Power role change to %!UCM_POWER_ROLE! requested", device, PowerRole);
if (!Convert(PowerRole, role))
{
status = STATUS_INVALID_PARAMETER;
TRACE_ERROR(TRACE_FLAG_UCMCALLBACKS, "[Device: 0x%p] Invalid power role requested %!UCM_POWER_ROLE!", device, PowerRole);
goto Exit;
}
cmd.AsUInt64 = 0;
cmd.Command = UcsiCommandSetPdr;
cmd.SetPdr.ConnectorNumber = connector->Index;
cmd.SetPdr.PowerDirectionRole = role;
status = Ppm_SendCommand(ppmCtx, cmd, Ucm_EvtSetPowerRoleCompleted, ppmCtx);
if (!NT_SUCCESS(status))
{
goto Exit;
}
Exit:
TRACE_FUNC_EXIT(TRACE_FLAG_UCMCALLBACKS);
return status;
}
|