Función ScsiPortNotification (srb.h)
La rutina ScsiPortNotification informa al controlador de puerto específico del sistema operativo de determinados eventos, como cuando un controlador de miniporte completa una solicitud o está listo para iniciar otro SRB, así como cuando el adaptador de bus host (HBA) indica ciertas condiciones de error SCSI que se produjeron durante una operación.
Nota
Los modelos de controlador de puerto SCSI y de miniporte SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el del controlador storport de y modelos de controlador de storport.
Sintaxis
SCSIPORT_API VOID ScsiPortNotification(
SCSI_NOTIFICATION_TYPE NotificationType,
PVOID HwDeviceExtension,
...
);
Parámetros
NotificationType
Especifica el tipo de notificación. Vea comentarios.
HwDeviceExtension
Puntero a la extensión de dispositivo de hardware. Se trata de un área de almacenamiento por HBA que el controlador de puerto asigna e inicializa en nombre del controlador de miniport. Los controladores de miniportar suelen almacenar información específica de HBA en esta extensión, como el estado del HBA y los intervalos de acceso asignados del HBA. Esta área está disponible para el controlador de miniport en el DeviceExtension->HwDeviceExtension miembro del objeto de dispositivo del HBA inmediatamente después de que el controlador de miniport llame a ScsiPortInitialize. El controlador de puerto libera esta memoria cuando quita el dispositivo.
...
Argumentos variádicos para esta rutina. El número y el tipo de argumentos dependen de NotificationType. Vea comentarios.
Valor devuelto
Ninguno
Observaciones
La rutina ScsiPortNotification tiene un conjunto diferente de parámetros opcionales asociados a cada NotificationType. A continuación se muestra la lista de valores posibles para NotificationType, junto con descripciones para cada valor.
NotificationType = RequestComplete
Indica que el Srb especificado ha finalizado. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: la dirección del SRB. Después de esta notificación, el controlador de puerto específico del sistema operativo posee la solicitud. El controlador de miniporte no debe tener acceso al Srb dey no debe pasar el de Srb a otra rutina (como ScsiPortLogError).
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestComplete _In_ PVOID HwDeviceExtension, _In_opt_ PSCSI_REQUEST_BLOCK Srb );
NotificationType = NextRequest
Indica que el controlador de miniporte está listo para otra solicitud a un destino que no está ocupado actualmente. El controlador de miniporte debe enviar esta notificación tan pronto como el controlador esté listo para otra solicitud. Normalmente, esta notificación se envía desde la rutinadeHwScsiStartIo, pero, a veces, desde la rutinaHwScsiInterrupt de(o HwScsiEnableInterruptsCallback).
NotificationType = NextLuRequest
Indica que el HBA está listo para otra solicitud de la unidad lógica especificada. Si se establece este valor, ScsiPortNotification requiere tres parámetros adicionales: (1) el identificador de ruta de acceso, (2) el identificador de destino y (3) el número de unidad lógica. Este valor solo se debe usar si el HBA puede poner en cola varias solicitudes y admitir la detección de solicitudes automáticas o la puesta en cola etiquetada.
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // NextLuRequest _In_ PVOID HwDeviceExtension, _In_opt_ PathId, _In_opt_ TargetId, _In_opt_ Lun );
NotificationType = ResetDetected
Indica que el HBA ha detectado un restablecimiento en el bus SCSI. Después de esta notificación, el controlador de miniporte sigue siendo responsable de completar las solicitudes activas. El controlador de puerto SCSI administrará todos los retrasos de restablecimiento de bus necesarios.
NotificationType = CallEnableInterrupts
Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar a la rutina de HwScsiEnableInterruptsCall back del controlador de miniporte. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el punto de entrada del HwScsiEnableInterruptsCallback. La rutina de HwScsiInterrupt del controlador de miniporte realiza esta llamada después de deshabilitar las interrupciones en el HBA, para aplazar algún procesamiento de E/S controlado por interrupciones si el HBA requiere sondeos o detenciones en el ISR. Mientras se ejecuta la devolución de llamada, las interrupciones del sistema permanecen habilitadas, pero no se llamará a la rutina de del controlador de miniporte HwScsiInterrupt. El HwScsiEnableInterruptsCallback de es responsable de completar el procesamiento de E/S diferido y llamar a ScsiPortNotification de nuevo con CallDisableInterrupts y el punto de entrada del controlador de miniporte HwScsiDisableInterruptsCallback.
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallEnableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = CallDisableInterrupts
Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar a la rutina de HwScsiDisableInterruptsCall back del controlador de miniporte. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el punto de entrada del HwScsiDisableInterruptsCallback. Aunque esta devolución de llamada se ejecuta, no se puede reemplazar por una interrupción excepto desde un dispositivo con una interrupción de prioridad más alta que el HBA. En esta devolución de llamada, el controlador de miniporte vuelve a habilitar las interrupciones en el HBA.
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // CallDisableInterrupts _In_ PVOID HwDeviceExtension, _In_opt_ PHW_INTERRUPT HwScsiXxxInterruptsCallback );
NotificationType = RequestTimerCall
Indica que el controlador de miniporte requiere el controlador de puerto específico del sistema operativo para llamar al controlador de miniportar HwScsiTimer rutina en el número solicitado de microsegundos. Si se establece este valor, ScsiPortNotification requiere dos parámetros adicionales: (1) el punto de entrada del controlador de miniport rutina de HwScsiTimer y (2) un intervalo MiniportTimerValue, en microsegundos. Tenga en cuenta que la resolución del temporizador del sistema es de aproximadamente 10 milisegundos.
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // RequestTimerCall _In_ PVOID HwDeviceExtension, _In_opt_ PHW_TIMER HwScsiTimer, _In_opt_ ULONG MiniportTimerValue );
NotificationType = BusChangeDetected
Indica que es posible que se haya agregado o quitado un dispositivo de destino de un bus dinámico. Si se establece este valor, ScsiPortNotification requiere un parámetro adicional: el identificador de ruta de acceso del bus en el que se detectó el cambio. Después de esta notificación, el controlador de puerto vuelve a enumerar el bus mediante la emisión de comandos INQUIRY. La enumeración de bus consume mucho tiempo y enlaza el bus, por lo que un controlador de miniporte no debe enviar esta notificación innecesariamente.
Sintaxis:
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // BusChangeDetected _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId );
NotificationType = WMIEvent
Indica que el controlador de miniporte ha detectado un evento para el que se registran uno o varios consumidores de datos WMI. Si se establece este valor, ScsiPortNotification requiere al menos tres argumentos adicionales: (1) un puntero a una estructura de eventos WMI, (2) el tamaño de la estructura de eventos y (3) el identificador de ruta de acceso del dispositivo de destino si el evento se originó en un dispositivo o 0xFF si el evento se originó en el adaptador. Si (3) es un identificador de ruta de acceso, ScsiPortNotification requiere dos argumentos adicionales: (4) el identificador de destino y (5) el número de unidad lógica (LUN) del dispositivo de destino.
Sintaxis para PathId != 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
Sintaxis de PathId = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIEvent _In_ PVOID HwDeviceExtension, _In_opt_ PVOID WMIEvent, _In_opt_ UCHAR PathId // 0xFF );
NotificationType = WMIReregister
Indica que el controlador de miniport ha cambiado los elementos de datos o el número de instancias de un bloque de datos determinado registrado anteriormente llamando a IoWMIRegistrationControl. Si se establece WMIReregister, ScsiPortNotification requiere al menos dos argumentos adicionales: (1) el identificador de ruta de acceso del dispositivo de destino para volver a registrar ese dispositivo o 0xFF para volver a registrar el adaptador. Si (1) es un identificador de ruta de acceso, ScsiPortNotification requiere dos argumentos adicionales: (2) el identificador de destino y (3) el número de unidad lógica (LUN) del dispositivo de destino.
Sintaxis para PathId != 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId, // != 0xFF _In_opt_ UCHAR TargetId, _In_opt_ UCHAR Lun );
Sintaxis de PathId = 0xFF
VOID ScsiPortNotification( _In_ SCSI_NOTIFICATION_TYPE NotificationType, // WMIReregister _In_ PVOID HwDeviceExtension, _In_opt_ UCHAR PathId // 0xFF );
Cada controlador de miniport debe llamar a ScsiPortNotification dos veces para cada llamada al controlador de miniporte HwScsiStartIo rutina con un SRB que el controlador de miniporte se completa correctamente. En primer lugar, el controlador de miniport llama a ScsiPortNotification con el de notificationType de NextRequest o con NextLuRequest si el controlador de miniporte admite la puesta en cola etiquetada o varias solicitudes por LU. A continuación, el controlador de miniport llama ScsiPortNotification con el notificationType de de RequestComplete y la solicitud que acaba de satisfacer.
Es más probable que una rutina de HwScsiInterrup t del controlador de miniporte llame a ScsiPortNotification con el NotificationType de ResetDetected.
Si un HBA requiere que el controlador de miniporte use más de un milisegundo de procesamiento de operaciones de E/S controladas por interrupciones, su rutina de HwScsiInterrupt debe deshabilitar las interrupciones en el HBA y llamar a ScsiPortNotification con CallEnableInterrupts y una rutina de HwScsiEnableInterruptsCall back proporcionada por el controlador. Esta rutina, a su vez, llama a ScsiPortNotification con CallDisableInterrupts y el HwScsiDisableInterruptsCallback proporcionado por el controlador correspondiente.
Un controlador de miniporte registrado como proveedor de datos WMI puede llamar a ScsiPortNotification con WMIEvent para publicar un evento para el que ha recibido previamente una solicitud de habilitación. El controlador de puerto pone en cola el evento en el área de datos de interrupción de la extensión de dispositivo del controlador de miniporte para su posterior procesamiento en un IRQL inferior. Dado que solo se puede poner en cola un número limitado de eventos a la vez, el controlador de miniporte debe usar WMIEvent para indicar condiciones excepcionales en lugar de rutinas, y debe dar tiempo al controlador de puerto para volver a DISPATCH_LEVEL entre contabilizaciones, para evitar que se pierdan eventos.
Requisitos
Requisito | Valor |
---|---|
de la plataforma de destino de | Universal |
encabezado de | srb.h (include Miniport.h, Scsi.h) |
biblioteca de | Scsiport.lib; Storport.lib |
irQL | (Consulte la sección Comentarios) |
Consulte también
HwScsiDisableInterruptsCallback