Compartir a través de


SRIOV_SET_POWER_STATE función de devolución de llamada (pcivirt.h)

Establece el estado de potencia de la función virtual PCI Express SR-IOV (VF) especificada.

Sintaxis

SRIOV_SET_POWER_STATE SriovSetPowerState;

NTSTATUS SriovSetPowerState(
  [in] PVOID Context,
  [in] USHORT VfIndex,
  [in] DEVICE_POWER_STATE PowerState,
  [in] BOOLEAN Wake
)
{...}

Parámetros

[in] Context

Puntero a un contexto definido por el controlador.

[in] VfIndex

Índice de base cero del VF al que se aplica esta operación de conjunto de estado de energía.

[in] PowerState

Valor de tipo DEVICE_POWER_STATE que indica el estado de energía Dx que se va a establecer.

[in] Wake

Valor booleano que indica si se armó el dispositivo para una señal de reactivación (PME para dispositivos PCI Express), ya que entra en el estado de baja potencia. TRUE indica que el dispositivo está armado; False en caso contrario. Este valor debe ser FALSE si PowerState es PowerDeviceD0.

Valor devuelto

Establezca en STATUS_SUCCESS si la solicitud se realiza correctamente. De lo contrario, devuelva un código NTSTATUS adecuado para indicar la condición de error.

Comentarios

Este controlador de función física (PF) implementa esta función de devolución de llamada. La devolución de llamada se invoca cuando el sistema quiere cambiar el estado de energía de una función virtual.

El controlador PF registra su implementación estableciendo el miembro SetVfPowerState del SRIOV_DEVICE_INTERFACE_STANDARD, configurando una estructura de WDF_QUERY_INTERFACE_CONFIG y llamando a WdfDeviceAddQueryInterface.

Esta es una implementación de ejemplo de esta función de devolución de llamada.


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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows 10
Servidor mínimo compatible Windows Server 2016
Plataforma de destino Windows
Encabezado pcivirt.h
IRQL PASSIVE_LEVEL