IDE_REQUEST_BLOCK結構 (irb.h)
IDE_REQUEST_BLOCK 結構會定義IDE要求區塊。
語法
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;
成員
Function
指定要求所屬的類別。 下表描述 I/O 要求的分類。
函式 | 子命令 | 描述 |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
指出 IRB 包含描述 ATA 命令的 IdeTaskFile。 子命令表示要求更精細的群組,以加快查閱速度。 |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | 指出 IRB 包含描述 ATAPI 命令的 CDB。 |
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 |
指出 IRB 適用於迷你埠。 迷你埠負責適當地解譯命令。 |
IrbStatus
迷你埠必須設定這個成員,以指出指定作業的狀態。 下表描述各種 IrbStatus 值及其意義。
值 | 意義 |
IRB_STATUS_PENDING | 表示要求正在進行中。 埠驅動程式會將 IrbStatus 初始化為此值。 迷你埠驅動程序不應該將 IrbStatus 成員設定為此值。 |
IRB_STATUS_SUCCESS | 表示要求已順利完成。 |
IRB_STATUS_DATALENGTH_MISMATCH | 表示發生數據不足或滿溢錯誤。 迷你埠必須更新 IRB 中的 DataTransferLength 欄位,以指出在執行不足的情況下傳輸的實際數據量。 |
IRB_STATUS_DEVICE_ERROR | 指出裝置傳回錯誤。 迷你埠驅動程式必須在命令完成時,將 Irb 中的 AtaStatus 和 AtaError 欄位更新為裝置 ATA 狀態和錯誤緩存器的內容。 |
IRB_STATUS_INVALID_REQUEST | 表示迷你埠不支援指定的要求。 |
IRB_STATUS_BUS_RESET | 表示處理指定要求時發生總線重設。 |
IRB_STATUS_SELECTION_TIMEOUT | 表示無法選取目的地裝置。 |
IRB_STATUS_BUSY | 表示裝置忙碌中。 埠驅動程式會重試以這個狀態完成的任何要求。 完成且狀態忙碌狀態的要求只會重試一次。 如果裝置無法處理特定時段的要求,則迷你埠驅動程式有責任使用 AtaPortDeviceBusy 暫停要求佇列。 |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID是位掩碼,表示 IRB 成員 SenseInfoBuffer 中的有效感知數據。 |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID是位掩碼,表示 IRB SenseInfoBuffer 成員中有效的傳回工作檔案。 |
AtaStatus
指出裝置在其狀態緩存器中傳回的狀態。 使用 IRB_STATUS_DEVICE_ERROR完成 IRB 時,迷你埠驅動程式應該更新此欄位。
AtaError
指出裝置在其錯誤快取器中傳回的錯誤值。 使用 IRB_STATUS_DEVICE_ERROR完成 IRB 時,迷你埠驅動程式應該更新此欄位。
Channel
指定通道號碼。
TargetId
指定裝置的目標識別碼。
Lun
指定裝置的邏輯單元編號。
CdbLength
指定 cdb 所指向之緩衝區的位元組長度。
SenseInfoBufferLength
指定 SenseInfoBuffer所指向之緩衝區的位元組長度。
SenseInfoBufferType
指定在 SenseInfoBuffer 中傳回的數據結構類型。 由於 ATA 命令不需要要求感知命令,ATA_PASS_THROUGH命令會使用 SenseInfoBuffer 傳回工作檔案資訊。 針對ATA_PASS_THROUGH命令,如 IrbFlags 成員中所識別,應該將適當的傳回 TaskFile 大小回報為 SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE 或
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE。
QueueTag
這個 IRB 的佇列標記。 埠驅動程式會將此欄位設定為 0。
ReservedAsUlong
保留供日後使用。
IrbFlags
使用需要執行的特定動作來限定要求。 下表詳細說明它們。
旗標 | 描述 |
IRB_FLAGS_DRDY_REQUIRED | 表示迷你埠驅動程式必須在發出此命令之前,等待裝置在 ATA 狀態快取器中設定 DRDY 位。 |
IRB_FLAGS_USE_DMA | 表示要求具有相關聯的散佈/收集清單,而迷你埠驅動程式可以使用 DMA 來傳輸此要求的數據。 |
IRB_FLAGS_MAP_BUFFERS | 表示 IRB 中 DataBuffer 字段已對應。 設定此旗標時,迷你埠可以安全地存取 DataBuffer。 如果未設定旗標,迷你埠驅動程式不得存取 DataBuffer。 迷你埠驅動程式可以在 IRB 的 IdeHwBuildIo 例程中設定此旗標,以要求埠驅動程式對應數據緩衝區。 |
IRB_FLAGS_48BIT | 指出 IRB 中的 ATA 命令屬於 48 位 LBA 功能集。 設定此旗標時,_IDE_TASK_FILE 結構中的 Previous 欄位有效。 |
IRB_FLAGS_PIO_MULTIPLE | 表示 ATA 命令要使用 ATA PIO Multiple 方法傳輸。 |
IRB_FLAGS_RETURN_RESULTS | 表示 ATA 傳回工作檔案要複製到 SenseInfoBuffer。 |
IRB_FLAGS_DATA_IN | 表示數據要從裝置傳輸到主機系統(讀取作業)。 |
IRB_FLAGS_DATA_OUT | 表示數據要從主機系統傳輸至裝置(寫入作業)。 |
IRB_FLAGS_DISCARDABLE | 表示命令應盡最大努力完成。 (注意:ATAport目前未採用此專案)。 |
IRB_FLAGS_HIGH_PRIORITY | 表示在 ATA 迷你埠中目前非高優先順序 IRB 之前,此 IRB 會儘快進行處理。 |
TimeOutValue
指出要求逾時的時間,以秒為單位。
DataTransferLength
包含數據緩衝區的位元組長度,其中包含要傳輸的數據。
IrbExtension
埠驅動程式所配置之每個要求延伸模組的指標。
DataBuffer
數據所在緩衝區的指標。
SenseInfoBuffer
保留感知數據的緩衝區指標。
NextIrb
要處理的下一個 IRB 指標。 連接埠驅動程式會將此設定為 NULL。 迷你埠驅動程式可以使用此欄位將 IRB 連結在一起。
Reserved
保留供日後使用。
IdeTaskFile
包含類型為 IDE_TASK_FILE 的結構,此結構會保存所指示控制器的 IDE 工作檔案。 每當 函式 成員與IRB_FUNCTION_ATA_COMMAND之間的位 AND 結果為非零時,就會定義這個成員。
Cdb[16]
包含命令描述元區塊 (CDB)。 每當 函式 成員與IRB_FUNCTION_ATAPI_COMMAND之間的位 AND 結果為非零時,就會定義這個成員。
PowerChange
表示定義電源狀態轉換之類型 POWER_CHANGE_INFO 的列舉值。 每當 函式 等於IRB_FUNCTION_POWER_CHANGE時,就會定義這個成員。
AsUChar[16]
提供存取 IdeTaskFile 、PowerChange和 Cdb 做為無符號字元數據的成員存取方式。
言論
IDE_REQUEST_BLOCK結構提供類似 SCSI_REQUEST_BLOCK 的功能,但特性更適合用於管理 IDE 總線上的裝置。
要求
要求 | 價值 |
---|---|
標頭 | irb.h (包括 Irb.h) |