Filtrado de recursos MSI-X
Los controladores de minipuerto deben registrar una función de filtro de requisitos de recursos si admiten MSI-X y cambiarán la afinidad de interrupción para cada mensaje MSI-X o quitarán los recursos de interrupción del mensaje.
NDIS llama a la función MiniportFilterResourceRequirements después de que NDIS reciba el IRP_MN_FILTER_RESOURCE_REQUIREMENTS paquete de solicitud de E/S (IRP) para una tarjeta de interfaz de red (NIC). NDIS llama a MiniportFilterResourceRequirements después de que los controladores de función subyacentes de la pila de dispositivos hayan completado el IRP.
NDIS llamará a MiniportFilterResourceRequirements después de que la función MiniportAddDevice devuelva NDIS_STATUS_SUCCESS. NDIS puede llamar a MiniportFilterResourceRequirements de nuevo en cualquier momento antes de llamar a MiniportRemoveDevice. NDIS puede llamar a MiniportFilterResourceRequirements mientras se ejecuta el miniporte. Aunque el minipuerto puede modificar la lista de recursos como se describe a continuación, el miniporte no debe intentar usar inmediatamente los nuevos recursos. Finalmente, el NDIS se detendrá y volverá a inicializar el miniporte con los nuevos recursos; solo entonces el miniporte intenta usar los nuevos recursos.
IRP_MN_FILTER_RESOURCE_REQUIREMENTS proporciona una lista de recursos como una estructura de IO_RESOURCE_REQUIREMENTS_LIST en Irp-IoStatus.Information>. Los recursos de la lista se describen mediante estructuras IO_RESOURCE_DESCRIPTOR .
Un controlador de minipuerto puede modificar la directiva de afinidad de interrupción para cada recurso de tipo CmResourceTypeInterrupt que describe un mensaje MSI-X. Si una directiva de afinidad solicita el destino de un conjunto específico de procesadores, el controlador de minipuerto también establece una máscara KAFFINITY en Interrupt.TargetedProcessors en la estructura IO_RESOURCE_DESCRIPTOR.
Un controlador de minipuerto puede quitar todos los recursos de tipo CmResourceTypeInterrupt que son recursos de interrupción de mensajes. A continuación, el controlador puede registrarse para interrupciones basadas en línea en la función MiniportInitializeEx . Si el controlador de minipuerto no quita estos recursos de interrupción de mensajes, se producirá un error en el sistema operativo si el controlador intenta registrar interrupciones basadas en línea en MiniportInitializeEx.
Un controlador de minipuerto NDIS 6.1 o posterior puede agregar recursos de interrupción de mensajes a la lista de recursos. Por ejemplo, en un equipo con ocho CPU, si la NIC puede generar cuatro mensajes MSI-X y si el sistema operativo habilita las cuatro interrupciones de mensajes, el sistema operativo inicializa cuatro entradas de tabla de mensajes en el espacio de configuración MSI-X del dispositivo y coloca cuatro recursos de interrupción de mensajes en la lista de recursos. En este caso, dado que el controlador de minipuerto requiere más recursos de interrupción de mensajes, puede asignar cuatro recursos de interrupción de mensajes más a la lista de recursos y establecer la afinidad de cada mensaje MSI-X en una CPU. Si el sistema operativo puede proporcionar más recursos de interrupción de mensajes, el adaptador de miniporte recibe ocho recursos de interrupción de mensajes cuando se inicia. En este caso, los mensajes tienen números de 0 a 7.
A cada recurso de interrupción de mensaje de la lista se le asigna un número de mensaje más adelante que corresponde al orden en que se muestra en la lista. Por ejemplo, los primeros recursos de interrupción del mensaje de la lista se asignan al mensaje 0, el segundo se asigna al mensaje 1, etc.
Para asignar una entrada de tabla MSI-X a una CPU en tiempo de ejecución, el controlador de minipuerto puede llamar a la función NdisMConfigMSIXTableEntry , que asigna una entrada de tabla a un mensaje MSI-X que ya tiene la afinidad establecida en la CPU. Para obtener más información sobre las operaciones de configuración para las entradas de tabla MSI-X, consulte Cambio de la afinidad de CPU de las entradas de tabla MSI-X.
Para asignar memoria para una nueva lista de requisitos de recursos, use la función NdisAllocateMemoryWithTagPriority . Puede liberar la memoria de la lista de requisitos de recursos antiguos con la función NdisFreeMemory .
Los controladores de minipuerto no deben modificar otros recursos, como los recursos CmResourceTypeMemory y CmResourceTypePort . Los controladores de minipuerto deben evitar agregar un nuevo recurso a la lista de recursos. Sin embargo, los controladores de minipuerto NDIS 6.1 y versiones posteriores pueden agregar más recursos de interrupción de mensajes. Si el controlador de minipuerto agrega más recursos de interrupción de mensajes, no debe quitarlos de la función MiniportStartDevice .
Para obtener más información sobre cómo agregar y quitar recursos, consulte IRP_MN_FILTER_RESOURCE_REQUIREMENTS.