pcivirt.h) (SRIOV_SET_POWER_STATE回调函数

(VF) 设置指定的 PCI Express SR-IOV 虚拟函数的电源状态。

语法

SRIOV_SET_POWER_STATE SriovSetPowerState;

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

参数

[in] Context

指向驱动程序定义的上下文的指针。

[in] VfIndex

此电源状态集操作应用到的 VF 的从零开始的索引。

[in] PowerState

指示要设置的 Dx 电源状态的DEVICE_POWER_STATE类型值。

[in] Wake

一个布尔值,指示在进入低功耗状态时,是否为唤醒信号 (适用于 PCI Express 设备的 PME 配置设备) 。 TRUE 表示设备已武装;否则为 FALSE。 如果 PowerStatePowerDeviceD0,则此值必须为 FALSE。

返回值

如果请求成功,则设置为 STATUS_SUCCESS。 否则,返回相应的 NTSTATUS 代码以指示错误条件。

注解

此回调函数由 PF) 驱动程序 (物理函数实现。 当系统想要更改虚拟函数的电源状态时,将调用回调。

PF 驱动程序通过设置SRIOV_DEVICE_INTERFACE_STANDARD的 SetVfPowerState 成员、配置 WDF_QUERY_INTERFACE_CONFIG 结构以及调用 WdfDeviceAddQueryInterface 来注册其实现。

下面是此回调函数的示例实现。


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

要求

要求
最低受支持的客户端 Windows 10
最低受支持的服务器 Windows Server 2016
目标平台 Windows
标头 pcivirt.h
IRQL PASSIVE_LEVEL