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 |