estructura de IDE_REQUEST_BLOCK (irb.h)
La estructura IDE_REQUEST_BLOCK define un bloque de solicitud ide.
Sintaxis
typedef struct _IDE_REQUEST_BLOCK {
USHORT Function;
UCHAR IrbStatus;
UCHAR AtaStatus;
UCHAR AtaError;
UCHAR Channel;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
UCHAR SenseInfoBufferType;
UCHAR QueueTag;
ULONG ReservedAsUlong;
ULONG IrbFlags;
ULONG TimeOutValue;
ULONG DataTransferLength;
PVOID IrbExtension;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
PVOID NextIrb;
PVOID Reserved;
union {
IDE_TASK_FILE IdeTaskFile;
UCHAR Cdb[16];
IDE_POWER_INFO PowerChange;
UCHAR AsUChar[16];
};
} IDE_REQUEST_BLOCK, *PIDE_REQUEST_BLOCK;
Miembros
Function
Especifica la categoría a la que pertenece la solicitud. En la tabla siguiente se describe la clasificación de las solicitudes de E/S.
Function | Sub comandos | Descripción |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
Indica que el IRB contiene un IdeTaskFile que describe el comando ATA. Los sub comandos indican la agrupación más fina de la solicitud para una búsqueda más rápida. |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | Indica que el IRB contiene un CDB que describe el comando ATAPI. |
IRB_FUNCTION_MINIPORT_COMMAND |
IRB_FUNCTION_ADAPTER_FLUSH IRB_FUNCTION_SHUTDOWN IRB_FUNCTION_POWER_CHANGE IRB_FUNCTION_POWER_REBOOT IRB_FUNCTION_LUN_RESET IRB_FUNCTION_MINIPORT_IOCTL |
Indica que el IRB es para el miniporte. Es responsabilidad del miniporte interpretar el comando adecuadamente. |
IrbStatus
El miniport debe establecer este miembro para indicar el estado de la operación especificada. En la tabla siguiente se describen los distintos valores de IrbStatus y su significado.
Valor | Significado |
IRB_STATUS_PENDING | Indica que la solicitud está en curso. El controlador de puerto inicializa IrbStatus en este valor. Un controlador de minipuerto nunca debe establecer el miembro IrbStatus en este valor. |
IRB_STATUS_SUCCESS | Indica que la solicitud se completó correctamente. |
IRB_STATUS_DATALENGTH_MISMATCH | Indica que se ha producido un error de ejecución o saturación de datos. El minipuerto debe actualizar el campo DataTransferLength en el IRB para indicar la cantidad real de datos transferidos en el caso de una ejecución inferior. |
IRB_STATUS_DEVICE_ERROR | Indica que el dispositivo devolvió un error. El controlador de minipuerto debe actualizar los campos AtaStatus y AtaError del Irb al contenido del estado de ATA del dispositivo y registrar errores al finalizar el comando. |
IRB_STATUS_INVALID_REQUEST | Indica que el miniporte no admite la solicitud especificada. |
IRB_STATUS_BUS_RESET | Indica que se ha producido un restablecimiento de bus durante el procesamiento de la solicitud especificada. |
IRB_STATUS_SELECTION_TIMEOUT | Indica que no se pudo seleccionar el dispositivo de destino. |
IRB_STATUS_BUSY | Indica que el dispositivo está ocupado. El controlador de puerto reintenta cualquier solicitud completada con este estado. Una solicitud completada con el estado ocupado solo se reintenta una vez. Es responsabilidad del controlador de miniportar pausar la cola de solicitudes mediante AtaPortDeviceBusy si el dispositivo no puede controlar la solicitud durante un determinado período de tiempo. |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID es una máscara de bits que indica datos de sentido válidos en el miembro SenseInfoBuffer del IRB. |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID es una máscara de bits que indica un archivo de tarea de devolución válido en el miembro SenseInfoBuffer del IRB. |
AtaStatus
Indica el estado devuelto por el dispositivo en su registro de estado. El controlador de minipuerto debe actualizar este campo al completar un IRB con IRB_STATUS_DEVICE_ERROR.
AtaError
Indica el valor de error devuelto por el dispositivo en su registro de errores. El controlador de minipuerto debe actualizar este campo al completar un IRB con IRB_STATUS_DEVICE_ERROR.
Channel
Especifica el número de canal.
TargetId
Especifica el identificador de destino del dispositivo.
Lun
Especifica el número de unidad lógica del dispositivo.
CdbLength
Especifica la longitud en bytes del búfer al que apunta Cdb.
SenseInfoBufferLength
Especifica la longitud en bytes del búfer al que apunta SenseInfoBuffer.
SenseInfoBufferType
Especifica el tipo de estructura de datos devuelta en SenseInfoBuffer. Dado que los comandos de ATA no necesitan el comando request sense, ATA_PASS_THROUGH comandos usan SenseInfoBuffer para devolver información del archivo de tareas. Para ATA_PASS_THROUGH comandos, como se identifica en el miembro IrbFlags , se debe notificar el tamaño de taskFile de devolución adecuado como SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE o
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE.
QueueTag
Etiqueta de cola para este IRB. El controlador de puerto establece este campo en 0.
ReservedAsUlong
Reservado para uso futuro.
IrbFlags
Califica la solicitud con determinadas acciones que deben realizarse. En la tabla siguiente se describen con detalle.
Marca | Descripción |
IRB_FLAGS_DRDY_REQUIRED | Indica que el controlador de minipuerto debe esperar a que el dispositivo establezca el bit DRDY en el registro de estado de ATA antes de emitir este comando. |
IRB_FLAGS_USE_DMA | Indica que la solicitud tiene una lista de dispersión o recopilación asociada y el controlador de miniporte podría usar DMA para transferir datos para esta solicitud. |
IRB_FLAGS_MAP_BUFFERS | Indica que el campo DataBuffer del IRB está asignado. La minipuerto puede acceder de forma segura a DataBuffer cuando se establece esta marca. El controlador de minipuerto no debe tener acceso a DataBuffer si no se ha establecido la marca. El controlador de miniporte podría solicitar al controlador de puerto que asigne el búfer de datos estableciendo esta marca en el IRB en su rutina IdeHwBuildIo . |
IRB_FLAGS_48BIT | Indica que el comando ATA del IRB pertenece al conjunto de características LBA de 48 bits. El campo Anterior de la estructura _IDE_TASK_FILE es válido cuando se establece esta marca. |
IRB_FLAGS_PIO_MULTIPLE | Indica que el comando de ATA se va a transferir mediante el método ATA PIO Multiple. |
IRB_FLAGS_RETURN_RESULTS | Indica que el archivo de tarea de devolución de ATA se va a copiar en SenseInfoBuffer. |
IRB_FLAGS_DATA_IN | Indica que los datos se van a transferir desde el dispositivo al sistema host (una operación de lectura). |
IRB_FLAGS_DATA_OUT | Indica que los datos se van a transferir al dispositivo desde el sistema host (una operación de escritura). |
IRB_FLAGS_DISCARDABLE | Indica que el comando se realizará de la mejor manera. (Nota: actualmente no está empleado por ATAport). |
IRB_FLAGS_HIGH_PRIORITY | Indica que este IRB se va a procesar lo antes posible, antes de irB que no sean de alta prioridad actualmente en la miniporte de ATA. |
TimeOutValue
Indica el tiempo en segundos después del cual se agotará el tiempo de espera de la solicitud.
DataTransferLength
Contiene la longitud en bytes del búfer de datos que contiene los datos que se van a transferir.
IrbExtension
Puntero a la extensión por solicitud asignada por el controlador de puerto.
DataBuffer
Puntero al búfer donde residen los datos.
SenseInfoBuffer
Puntero al búfer que contiene los datos de sentido.
NextIrb
Puntero al siguiente IRB que se va a procesar. El controlador de puerto establece este valor en NULL. El controlador de minipuerto puede usar este campo para vincular los IRB juntos.
Reserved
Reservado para uso futuro.
IdeTaskFile
Contiene una estructura de tipo IDE_TASK_FILE que contiene el archivo de tarea IDE para el controlador indicado. Este miembro se define cada vez que el resultado de un AND bit a bit entre el miembro Function y IRB_FUNCTION_ATA_COMMAND es distinto de cero.
Cdb[16]
Contiene un bloque de descriptor de comandos (CDB). Este miembro se define cada vez que el resultado de un AND bit a bit entre el miembro Function y IRB_FUNCTION_ATAPI_COMMAND es distinto de cero.
PowerChange
Indica un valor de enumeración de tipo POWER_CHANGE_INFO que define una transición de estado de energía. Este miembro se define siempre que Function sea igual a IRB_FUNCTION_POWER_CHANGE.
AsUChar[16]
Proporciona un medio para acceder a los miembros IdeTaskFile, PowerChange y Cdb como datos de caracteres sin firmar.
Comentarios
La estructura IDE_REQUEST_BLOCK proporciona una funcionalidad similar a la SCSI_REQUEST_BLOCK , pero con características más adecuadas para administrar dispositivos en un bus IDE.
Requisitos
Requisito | Valor |
---|---|
Header | irb.h (incluya Irb.h) |