struktur IDE_REQUEST_BLOCK (irb.h)
Struktur IDE_REQUEST_BLOCK mendefinisikan blok permintaan IDE.
Sintaks
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;
Anggota
Function
Menentukan kategori tempat permintaan berada. Tabel di bawah ini menjelaskan klasifikasi permintaan I/O.
Fungsi | Sub-perintah | Deskripsi |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
Menunjukkan bahwa IRB berisi IdeTaskFile yang menjelaskan perintah ATA. Sub-perintah menunjukkan pengelompokan permintaan yang lebih baik untuk pencarian yang lebih cepat. |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | Menunjukkan bahwa IRB berisi CDB yang menjelaskan perintah 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 |
Menunjukkan bahwa IRB adalah untuk miniport. Adalah tanggung jawab miniport untuk menafsirkan perintah dengan tepat. |
IrbStatus
Miniport harus mengatur anggota ini untuk menunjukkan status operasi yang ditentukan. Tabel di bawah ini menjelaskan berbagai nilai IrbStatus dan maknanya.
Nilai | Makna |
IRB_STATUS_PENDING | Menunjukkan bahwa permintaan sedang berlangsung. Driver port menginisialisasi IrbStatus ke nilai ini. Driver miniport tidak boleh mengatur anggota IrbStatus ke nilai ini. |
IRB_STATUS_SUCCESS | Menunjukkan bahwa permintaan berhasil diselesaikan. |
IRB_STATUS_DATALENGTH_MISMATCH | Menunjukkan bahwa terjadi kesalahan underrun atau overrun data. Miniport harus memperbarui bidang DataTransferLength di IRB untuk menunjukkan jumlah data aktual yang ditransfer dalam kasus underrun. |
IRB_STATUS_DEVICE_ERROR | Menunjukkan bahwa perangkat mengembalikan kesalahan. Driver miniport harus memperbarui bidang AtaStatus dan AtaError di Irb ke konten status ATA perangkat dan register kesalahan pada penyelesaian perintah. |
IRB_STATUS_INVALID_REQUEST | Menunjukkan bahwa miniport tidak mendukung permintaan yang diberikan. |
IRB_STATUS_BUS_RESET | Menunjukkan bahwa reset bus terjadi saat memproses permintaan yang diberikan. |
IRB_STATUS_SELECTION_TIMEOUT | Menunjukkan bahwa perangkat tujuan tidak dapat dipilih. |
IRB_STATUS_BUSY | Menunjukkan bahwa perangkat sibuk. Driver port mencoba kembali permintaan apa pun yang diselesaikan dengan status ini. Permintaan yang diselesaikan dengan status sibuk hanya dicoba kembali sekali. Driver miniport bertanggung jawab untuk menjeda antrean permintaan menggunakan AtaPortDeviceBusy jika perangkat tidak dapat menangani permintaan untuk jangka waktu tertentu. |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID adalah bitmask yang menunjukkan data indera yang valid di anggota SenseInfoBuffer dari IRB. |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID adalah bitmask yang menunjukkan file tugas pengembalian yang valid di anggota SenseInfoBuffer dari IRB. |
AtaStatus
Menunjukkan status yang dikembalikan oleh perangkat dalam daftar statusnya. Driver miniport harus memperbarui bidang ini saat menyelesaikan IRB dengan IRB_STATUS_DEVICE_ERROR.
AtaError
Menunjukkan nilai kesalahan yang dikembalikan oleh perangkat dalam register kesalahannya. Driver miniport harus memperbarui bidang ini saat menyelesaikan IRB dengan IRB_STATUS_DEVICE_ERROR.
Channel
Menentukan nomor saluran.
TargetId
Menentukan ID target perangkat.
Lun
Menentukan nomor unit logis perangkat.
CdbLength
Menentukan panjang dalam byte buffer yang diacu oleh Cdb.
SenseInfoBufferLength
Menentukan panjang dalam byte buffer yang diacu oleh SenseInfoBuffer.
SenseInfoBufferType
Menentukan jenis struktur data yang dikembalikan di SenseInfoBuffer. Karena perintah ATA tidak memerlukan perintah request sense, perintah ATA_PASS_THROUGH menggunakan SenseInfoBuffer untuk mengembalikan informasi file tugas. Untuk perintah ATA_PASS_THROUGH, seperti yang diidentifikasi dalam anggota IrbFlags , ukuran TaskFile pengembalian yang sesuai harus dilaporkan sebagai SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE atau
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE.
QueueTag
Tag antrean untuk IRB ini. Driver port mengatur bidang ini ke 0.
ReservedAsUlong
Disiapkan untuk penggunaan masa mendatang.
IrbFlags
Memenuhi syarat permintaan dengan tindakan tertentu yang perlu dilakukan. Tabel di bawah ini menjelaskannya secara rinci.
Bendera | Deskripsi |
IRB_FLAGS_DRDY_REQUIRED | Menunjukkan bahwa driver miniport harus menunggu perangkat mengatur bit DRDY dalam register status ATA sebelum mengeluarkan perintah ini. |
IRB_FLAGS_USE_DMA | Menunjukkan bahwa permintaan memiliki daftar sebar/kumpulkan terkait dan driver miniport dapat menggunakan DMA untuk mentransfer data untuk permintaan ini. |
IRB_FLAGS_MAP_BUFFERS | Menunjukkan bahwa bidang DataBuffer di IRB dipetakan. Miniport dapat mengakses DataBuffer dengan aman saat bendera ini diatur. Driver miniport tidak boleh mengakses DataBuffer jika bendera tidak diatur. Driver miniport dapat meminta driver port untuk memetakan buffer data dengan mengatur bendera ini di IRB dalam rutinitas IdeHwBuildIo-nya . |
IRB_FLAGS_48BIT | Menunjukkan bahwa perintah ATA di IRB milik set fitur LBA 48 bit. Bidang Sebelumnya dalam struktur _IDE_TASK_FILE valid saat bendera ini diatur. |
IRB_FLAGS_PIO_MULTIPLE | Menunjukkan bahwa perintah ATA akan ditransfer menggunakan metode ATA PIO Multiple. |
IRB_FLAGS_RETURN_RESULTS | Menunjukkan bahwa file tugas pengembalian ATA akan disalin ke SenseInfoBuffer. |
IRB_FLAGS_DATA_IN | Menunjukkan bahwa data akan ditransfer dari perangkat ke sistem host (operasi baca). |
IRB_FLAGS_DATA_OUT | Menunjukkan bahwa data akan ditransfer ke perangkat dari sistem host (operasi tulis). |
IRB_FLAGS_DISCARDABLE | Menunjukkan bahwa perintah harus dilakukan dengan cara yang terbaik. (catatan: ini saat ini tidak digunakan oleh ATAport). |
IRB_FLAGS_HIGH_PRIORITY | Menunjukkan bahwa IRB ini akan diproses sesegera mungkin, sebelum IRB non-prioritas tinggi saat ini berada di miniport ATA. |
TimeOutValue
Menunjukkan waktu dalam detik setelah permintaan akan kehabisan waktu.
DataTransferLength
Berisi panjang byte buffer data yang berisi data yang akan ditransfer.
IrbExtension
Penunjuk ke ekstensi per permintaan yang dialokasikan oleh driver port.
DataBuffer
Arahkan ke buffer tempat data berada.
SenseInfoBuffer
Penunjuk ke buffer yang menyimpan data indra.
NextIrb
Arahkan ke IRB berikutnya yang akan diproses. Driver porta mengatur ini ke NULL. Driver miniport dapat menggunakan bidang ini untuk menautkan IRB bersama-sama.
Reserved
Disiapkan untuk penggunaan masa mendatang.
IdeTaskFile
Berisi struktur jenis IDE_TASK_FILE yang menyimpan file tugas IDE untuk pengontrol yang ditunjukkan. Anggota ini didefinisikan setiap kali hasil bitwise AND antara anggota Fungsi dan IRB_FUNCTION_ATA_COMMAND bukan nol.
Cdb[16]
Berisi blok deskriptor perintah (CDB). Anggota ini didefinisikan setiap kali hasil bitwise AND antara anggota Fungsi dan IRB_FUNCTION_ATAPI_COMMAND bukan nol.
PowerChange
Menunjukkan nilai enumerasi jenis POWER_CHANGE_INFO yang menentukan transisi status daya. Anggota ini didefinisikan setiap kali Fungsi sama dengan IRB_FUNCTION_POWER_CHANGE.
AsUChar[16]
Menyediakan sarana untuk mengakses anggota IdeTaskFile, PowerChange, dan Cdb sebagai data karakter yang tidak ditandatangani.
Keterangan
Struktur IDE_REQUEST_BLOCK menyediakan fungsionalitas yang mirip dengan SCSI_REQUEST_BLOCK tetapi dengan karakteristik yang lebih cocok untuk mengelola perangkat pada bus IDE.
Persyaratan
Persyaratan | Nilai |
---|---|
Header | irb.h (termasuk Irb.h) |