SRIOV_SET_POWER_STATE Rückruffunktion (pcivirt.h)
Legt den Leistungszustand der angegebenen PCI Express SR-IOV Virtual Function (VF) fest.
Syntax
SRIOV_SET_POWER_STATE SriovSetPowerState;
NTSTATUS SriovSetPowerState(
[in] PVOID Context,
[in] USHORT VfIndex,
[in] DEVICE_POWER_STATE PowerState,
[in] BOOLEAN Wake
)
{...}
Parameter
[in] Context
Ein Zeiger auf einen vom Treiber definierten Kontext.
[in] VfIndex
Ein nullbasierter Index des VF, für den dieser Vorgang zum Festlegen des Energiezustands gilt.
[in] PowerState
Ein DEVICE_POWER_STATE-Typwert, der den festzulegenden Dx-Energiezustand angibt.
[in] Wake
Ein boolescher Wert, der angibt, ob das Gerät für ein Aktivierungssignal (PME für PCI-Express-Geräte) geschaltet werden soll, wenn es in den Zustand mit niedriger Leistung wechselt. TRUE gibt an, dass das Gerät bewaffnet ist. False andernfalls. Dieser Wert muss FALSE sein, wenn PowerStatePowerDeviceD0 ist.
Rückgabewert
Legen Sie auf STATUS_SUCCESS fest, wenn die Anforderung erfolgreich ist. Geben Sie andernfalls den entsprechenden NTSTATUS-Code zurück, um die Fehlerbedingung anzugeben.
Hinweise
Diese Rückruffunktion wird vom Treiber der physischen Funktion (PF) implementiert. Der Rückruf wird aufgerufen, wenn das System den Energiezustand einer virtuellen Funktion ändern möchte.
Der PF-Treiber registriert seine Implementierung, indem er den SetVfPowerState-Member des SRIOV_DEVICE_INTERFACE_STANDARD festlegt, eine WDF_QUERY_INTERFACE_CONFIG-Struktur konfiguriert und WdfDeviceAddQueryInterface aufruft.
Hier sehen Sie eine Beispielimplementierung dieser Rückruffunktion.
NTSTATUS
Virtualization_SetPowerState (
__inout PVOID Context,
USHORT VfIndex,
DEVICE_POWER_STATE PowerState,
BOOLEAN Wake
)
{
PDEVICE_CONTEXT deviceContext;
WDF_POWER_DEVICE_STATE wdfPowerState;
NTSTATUS status;
PAGED_CODE();
status = STATUS_SUCCESS;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INTERFACE,
"Virtualization_SetPowerState received with \
VFIndex = %d, PowerState = %d, Wake = %d\n",
VfIndex, PowerState, Wake);
deviceContext = (PDEVICE_CONTEXT) Context;
if (VfIndex >= deviceContext->NumVFs)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_INTERFACE,
"VfIndex specified: %d was out of bounds. NumVFs: %d\n",
VfIndex, deviceContext->NumVFs);
return STATUS_INVALID_PARAMETER;
}
switch (PowerState)
{
case PowerDeviceD0:
wdfPowerState = WdfPowerDeviceD0;
break;
case PowerDeviceD1:
wdfPowerState = WdfPowerDeviceD1;
break;
case PowerDeviceD2:
wdfPowerState = WdfPowerDeviceD2;
break;
case PowerDeviceD3:
wdfPowerState = WdfPowerDeviceD3;
break;
default:
return STATUS_INVALID_PARAMETER;
}
WdfWaitLockAcquire(deviceContext->PowerStateLock, NULL);
deviceContext->VfContext[VfIndex].VfPowerDeviceState = wdfPowerState;
deviceContext->VfContext[VfIndex].VfWake = Wake;
WdfWaitLockRelease(deviceContext->PowerStateLock);
return status;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 10 |
Unterstützte Mindestversion (Server) | Windows Server 2016 |
Zielplattform | Windows |
Kopfzeile | pcivirt.h |
IRQL | PASSIVE_LEVEL |