Freigeben über


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