Basic implementation of NVMe IRQ handler
This commit is contained in:
+2
-2
@@ -238,7 +238,7 @@ impl NvmeCompQueue {
|
||||
})
|
||||
}
|
||||
|
||||
fn complete(&mut self) -> Option<(usize, NvmeComp)> {
|
||||
pub (crate) fn complete(&mut self) -> Option<(usize, NvmeComp)> {
|
||||
let entry = unsafe {
|
||||
ptr::read_volatile(self.data.as_ptr().add(self.i))
|
||||
};
|
||||
@@ -274,7 +274,7 @@ pub struct NvmeNamespace {
|
||||
pub struct Nvme {
|
||||
regs: &'static mut NvmeRegs,
|
||||
submission_queues: [NvmeCmdQueue; 2],
|
||||
completion_queues: [NvmeCompQueue; 2],
|
||||
pub (crate) completion_queues: [NvmeCompQueue; 2],
|
||||
buffer: Dma<[u8; 512 * 4096]>, // 2MB of buffer
|
||||
buffer_prp: Dma<[u64; 512]>, // 4KB of PRP for the buffer
|
||||
}
|
||||
|
||||
+13
-2
@@ -37,8 +37,19 @@ impl DiskScheme {
|
||||
|
||||
impl DiskScheme {
|
||||
pub fn irq(&mut self) -> bool {
|
||||
// TODO: implement
|
||||
false
|
||||
let mut found_completion = false;
|
||||
|
||||
let nvme = &mut self.nvme;
|
||||
for qid in 0..nvme.completion_queues.len() {
|
||||
while let Some((head, entry)) = nvme.completion_queues[qid].complete() {
|
||||
found_completion = true;
|
||||
println!("nvmed: Unhandled completion {:?}", entry);
|
||||
//TODO: Handle errors
|
||||
unsafe { nvme.completion_queue_head(qid as u16, head as u16); }
|
||||
}
|
||||
}
|
||||
|
||||
found_completion
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user