Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Запрос указывает, что стек виртуализации хочет получать уведомления при возникновении одного из событий, перечисленных в SRIOV_PF_EVENT.
Основной код
Входной буфер
Нет. Этот IOCTL не использует входной буфер.
Длина входного буфера
Ноль.
Выходной буфер
Буфер, содержащий значение типа SRIOV_PF_EVENT, заполненное драйвером физической функции (PF) при завершении запроса.
Длина выходного буфера
Указатель на переменную, содержащую количество байтов, записанных в выходной буфер при завершении запроса.
Буфер входных и выходных данных
Не используется с этой операцией; установите значение NULL.
Длина буфера ввода и вывода
Не используется с этой операцией; установите значение нулю.
Блок состояния
Irp->IoStatus.Status STATUS_SUCCESS, если запрос выполнен успешно. В противном случае для состояния задано соответствующее условие ошибки в виде кода NTSTATUS .
Замечания
Этот запрос IOCTL отправляется стеком виртуализации в драйвер SR-IOV физической функции (PF) PCI Express, который предоставляет GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.
Запрос IOCTL_SRIOV_NOTIFICATION хранится в очереди драйвером PF до тех пор, пока запрос не будет отменен отправителем или устройством выполняет одно из событий, перечисленных в SRIOV_PF_EVENT. Затем драйвер завершает ожидающий запрос.
Если драйвер PF получает этот запрос IOCTL при обработке события Plug and Play, для которого драйвер еще не завершил уведомление, он должен немедленно завершить запрос IOCTL с сведениями о событии в выходном буфере. В противном случае драйвер должен очередью запроса, пока не будет отменено или событие Plug and Play, требующее уведомления.
Стек виртуализации может отправлять запрос IOCTL_SRIOV_NOTIFICATION сразу после завершения предыдущего запроса IOCTL_SRIOV_NOTIFICATION. Драйвер PF должен отслеживать тот факт, что уведомление о событии доставлено и не должно выполнять два запроса IOCTL для одного и того же события дважды.
Он задается драйвером PF, пока он не будет отменен отправителем или пока драйвер PF не будет выполнен одним из нескольких событий PnP.
case IOCTL_SRIOV_NOTIFICATION:
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
"IOCTL_SRIOV_NOTIFICATION:\n");
status = WdfRequestForwardToIoQueue(Request,
fdoContext->NotificationQueue);
if (!NT_SUCCESS(status))
{
// not able to push it into manual queue, too bad.
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfRequestForwardToIoQueue failed status=%!STATUS!\n",
status);
break;
}
// Pnp might arrived before SRIOV_NOTIFICATION. Serve the new
// outstanding pnp if there is one.
CheckPendingNotifications(fdoContext);
status = STATUS_PENDING;
break;
VOID
CheckPendingNotifications(
__in PDEVICE_CONTEXT DeviceContext
)
/*
Routine Description:
This routine checks if there is a pending event and a pending request
for notification and if so completes the request.
Arguments:
DeviceContext - Pointer to the device context
Return Value:
None.
*/
{
PSRIOV_PF_EVENT notification;
WDFQUEUE queue;
WDFREQUEST request;
NTSTATUS status;
PAGED_CODE();
WdfWaitLockAcquire(DeviceContext->PnpStateLock, NULL);
queue = DeviceContext->NotificationQueue;
if (DeviceContext->PnpEventNew
&& NT_SUCCESS(WdfIoQueueRetrieveNextRequest(queue, &request)))
{
NT_ASSERT(DeviceContext->PnpEventPending != FALSE);
DeviceContext->PnpEventNew = FALSE;
status = WdfRequestRetrieveOutputBuffer(request,
sizeof(*notification),
¬ification,
NULL);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfRequestRetrieveOutputBuffer[SRIOV_NOTIFICATION] fail: %!STATUS!", status);
WdfRequestComplete(request, status);
}
else
{
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "Retrieved IoQueue request buffer (notification)\n");
*notification = DeviceContext->PnpEventCode;
WdfRequestCompleteWithInformation(request,
STATUS_SUCCESS,
sizeof(*notification));
}
}
WdfWaitLockRelease(DeviceContext->PnpStateLock);
return;
}
Требования
| Требование | Ценность |
|---|---|
| заголовка | pcivirt.h |
| IRQL | PASSIVE_LEVEL |