次の方法で共有


SRIOV_SET_POWER_STATE コールバック関数 (pcivirt.h)

指定した PCI Express SR-IOV 仮想関数 (VF) の電源状態を設定します。

構文

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 の 0 から始まるインデックス。

[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