функция обратного вызова 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 |