Поделиться через


функция обратного вызова 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, к которому применяется эта операция установки состояния питания.

[in] PowerState

Значение типа DEVICE_POWER_STATE, указывающее устанавливаемое состояние питания Dx .

[in] Wake

Логическое значение, указывающее, следует ли использовать устройство для сигнала пробуждения (PME для устройств PCI Express), так как оно переходит в состояние низкого энергопотребления. Значение TRUE указывает, что устройство вооружен; В противном случае — FALSE. Это значение должно быть FALSE, если PowerState имеет значение PowerDeviceD0.

Возвращаемое значение

Задайте значение STATUS_SUCCESS, если запрос выполнен успешно. В противном случае верните соответствующий код NTSTATUS , чтобы указать условие ошибки.

Комментарии

Эта функция обратного вызова реализуется драйвером физической функции (PF). Обратный вызов вызывается, когда система хочет изменить состояние управления виртуальной функцией.

Драйвер PF регистрирует свою реализацию, задавая член SetVfPowerState SRIOV_DEVICE_INTERFACE_STANDARD, настраивая структуру 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
Header pcivirt.h
IRQL PASSIVE_LEVEL