IDE_REQUEST_BLOCK structure (irb.h)
La structure IDE_REQUEST_BLOCK définit un bloc de requête IDE.
Syntaxe
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;
Membres
Function
Spécifie la catégorie à laquelle appartient la requête. Le tableau ci-dessous décrit la classification des demandes d’E/S.
Fonction | Sous-commandes | Description |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
Indique que l’IRB contient un IdeTaskFile qui décrit la commande ATA. Les sous-commandes indiquent un regroupement plus fin de la demande pour une recherche plus rapide. |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | Indique que l’IRB contient une CDB qui décrit la commande 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 |
Indique que la CISR est destinée au miniport. Il incombe au miniport d’interpréter la commande de manière appropriée. |
IrbStatus
Le miniport doit définir ce membre sur indique le status de l’opération spécifiée. Le tableau ci-dessous décrit les différentes valeurs IrbStatus et leur signification.
Valeur | Signification |
IRB_STATUS_PENDING | Indique que la demande est en cours. Le pilote de port initialise IrbStatus à cette valeur. Un pilote miniport ne doit jamais définir le membre IrbStatus sur cette valeur. |
IRB_STATUS_SUCCESS | Indique que la demande a été effectuée avec succès. |
IRB_STATUS_DATALENGTH_MISMATCH | Indique qu’une erreur de sous-exécution ou de dépassement de données s’est produite. Le miniport doit mettre à jour le champ DataTransferLength dans l’IRB pour indiquer la quantité réelle de données transférées en cas de sous-exécution. |
IRB_STATUS_DEVICE_ERROR | Indique que l’appareil a retourné une erreur. Le pilote miniport doit mettre à jour les champs AtaStatus et AtaError dans l’Irb vers le contenu de l’appareil ATA status et le registre d’erreurs à l’achèvement de la commande. |
IRB_STATUS_INVALID_REQUEST | Indique que le miniport ne prend pas en charge la demande donnée. |
IRB_STATUS_BUS_RESET | Indique qu’une réinitialisation de bus s’est produite lors du traitement de la demande donnée. |
IRB_STATUS_SELECTION_TIMEOUT | Indique que l’appareil de destination n’a pas pu être sélectionné. |
IRB_STATUS_BUSY | Indique que l’appareil est occupé. Le pilote de port retente toute requête effectuée avec ce status. Une requête terminée avec des status occupés n’est retentée qu’une seule fois. Il incombe au pilote miniport de suspendre la file d’attente des requêtes à l’aide d’AtaPortDeviceBusy si l’appareil ne peut pas gérer la demande pendant une certaine période. |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID est un masque de bits qui indique des données de sens valides dans le membre SenseInfoBuffer de l’IRB. |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID est un masque de bits qui indique un fichier de tâche de retour valide dans le membre SenseInfoBuffer de l’IRB. |
AtaStatus
Indique le status retourné par l’appareil dans son status registre. Le pilote miniport doit mettre à jour ce champ lors de l’exécution d’une IRB avec IRB_STATUS_DEVICE_ERROR.
AtaError
Indique la valeur d’erreur retournée par l’appareil dans son registre d’erreurs. Le pilote miniport doit mettre à jour ce champ lors de l’exécution d’une IRB avec IRB_STATUS_DEVICE_ERROR.
Channel
Spécifie le numéro de canal.
TargetId
Spécifie l’ID cible de l’appareil.
Lun
Spécifie le numéro d’unité logique de l’appareil.
CdbLength
Spécifie la longueur en octets de la mémoire tampon pointée par Cdb.
SenseInfoBufferLength
Spécifie la longueur en octets de la mémoire tampon pointée par SenseInfoBuffer.
SenseInfoBufferType
Spécifie le type de structure de données retournée dans SenseInfoBuffer. Étant donné que les commandes ATA n’ont pas besoin de la commande request sense, ATA_PASS_THROUGH commandes utilisent SenseInfoBuffer pour renvoyer des informations sur le fichier de tâches. Pour ATA_PASS_THROUGH commandes, telles qu’identifiées dans le membre IrbFlags , la taille taskFile de retour appropriée doit être signalée comme SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE ou
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE.
QueueTag
Balise de file d’attente pour cette IRB. Le pilote de port définit ce champ sur 0.
ReservedAsUlong
Réservé pour un usage futur.
IrbFlags
Qualifie la demande avec certaines actions qui doivent être effectuées. Le tableau ci-dessous les décrit en détail.
Indicateur | Description |
IRB_FLAGS_DRDY_REQUIRED | Indique que le pilote miniport doit attendre que l’appareil définisse le bit DRDY dans le registre de status ATA avant d’émettre cette commande. |
IRB_FLAGS_USE_DMA | Indique que la requête a une liste de points/regroupements associée et que le pilote miniport peut utiliser DMA pour transférer des données pour cette requête. |
IRB_FLAGS_MAP_BUFFERS | Indique que le champ DataBuffer dans l’IRB est mappé. Le miniport peut accéder en toute sécurité à DataBuffer lorsque cet indicateur est défini. Le pilote miniport ne doit pas accéder à DataBuffer si l’indicateur n’est pas défini. Le pilote miniport peut demander au pilote de port de mapper la mémoire tampon de données en définissant cet indicateur dans l’IRB dans sa routine IdeHwBuildIo . |
IRB_FLAGS_48BIT | Indique que la commande ATA dans l’IRB appartient à l’ensemble de fonctionnalités LBA 48 bits. Le champ Précédent de la structure _IDE_TASK_FILE est valide lorsque cet indicateur est défini. |
IRB_FLAGS_PIO_MULTIPLE | Indique que la commande ATA doit être transférée à l’aide de la méthode ATA PIO Multiple. |
IRB_FLAGS_RETURN_RESULTS | Indique que le fichier de tâche de retour ATA doit être copié dans SenseInfoBuffer. |
IRB_FLAGS_DATA_IN | Indique que les données doivent être transférées de l’appareil vers le système hôte (opération de lecture). |
IRB_FLAGS_DATA_OUT | Indique que les données doivent être transférées vers l’appareil à partir du système hôte (une opération d’écriture). |
IRB_FLAGS_DISCARDABLE | Indique que la commande doit être effectuée dans les meilleurs efforts. (remarque : ce n’est pas actuellement employé par ATAport). |
IRB_FLAGS_HIGH_PRIORITY | Indique que cette CISR doit être traitée dès que possible, avant les IRB non prioritaires actuellement dans le miniport ATA. |
TimeOutValue
Indique le délai en secondes après lequel la requête expire.
DataTransferLength
Contient la longueur en octets de la mémoire tampon de données qui contient les données à transférer.
IrbExtension
Pointeur vers l’extension par requête allouée par le pilote de port.
DataBuffer
Pointeur vers la mémoire tampon où résident les données.
SenseInfoBuffer
Pointeur vers la mémoire tampon qui contient les données sense.
NextIrb
Pointeur vers l’IRB suivante à traiter. Le pilote de port définit cette valeur sur NULL. Le pilote miniport peut utiliser ce champ pour lier des IRB ensemble.
Reserved
Réservé pour un usage futur.
IdeTaskFile
Contient une structure de type IDE_TASK_FILE qui contient le fichier de tâches IDE pour le contrôleur indiqué. Ce membre est défini chaque fois que le résultat d’un AND au niveau du bit entre le membre Function et IRB_FUNCTION_ATA_COMMAND est différent de zéro.
Cdb[16]
Contient un bloc de descripteur de commande (CDB). Ce membre est défini chaque fois que le résultat d’un AND au niveau du bit entre le membre Function et IRB_FUNCTION_ATAPI_COMMAND est différent de zéro.
PowerChange
Indique une valeur d’énumération de type POWER_CHANGE_INFO qui définit une transition d’état d’alimentation. Ce membre est défini chaque fois que Function est égal à IRB_FUNCTION_POWER_CHANGE.
AsUChar[16]
Fournit un moyen d’accéder aux membres IdeTaskFile, PowerChange et Cdb en tant que données de caractères non signés.
Remarques
La structure IDE_REQUEST_BLOCK fournit une fonctionnalité similaire à la SCSI_REQUEST_BLOCK , mais avec des caractéristiques plus adaptées à la gestion des appareils sur un bus IDE.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | irb.h (include Irb.h) |