diff --git a/Cargo.lock b/Cargo.lock index c46545bf26..e68857c1cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -736,6 +736,7 @@ dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "block-io-wrapper 0.1.0", "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "partitionlib 0.1.0 (git+https://gitlab.redox-os.org/redox-os/partitionlib.git)", "pcid 0.1.0", diff --git a/nvmed/Cargo.toml b/nvmed/Cargo.toml index 002d88c6e4..dca9a5dee1 100644 --- a/nvmed/Cargo.toml +++ b/nvmed/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" arrayvec = "0.5" bitflags = "0.7" crossbeam-channel = "0.4" +futures = "0.3" log = "0.4" redox-log = { git = "https://gitlab.redox-os.org/redox-os/redox-log.git", tag = "v0.1.0" } redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git" } diff --git a/nvmed/src/nvme/mod.rs b/nvmed/src/nvme/mod.rs index 2bff2f2cf2..6dc5b47274 100644 --- a/nvmed/src/nvme/mod.rs +++ b/nvmed/src/nvme/mod.rs @@ -586,55 +586,45 @@ impl Nvme { // println!(" - Dumping namespace ID list"); data.iter().copied().take_while(|&nsid| nsid != 0).collect() } + pub async fn identify_namespace(&self, nsid: u32) -> NvmeNamespace { + //TODO: Use buffer + let data: Dma<[u8; 4096]> = Dma::zeroed().unwrap(); + + // println!(" - Attempting to identify namespace {}", nsid); + let cmd_id = self.submit_admin_command(|cid| NvmeCmd::identify_namespace( + cid, data.physical(), nsid + )); + + // println!(" - Waiting to identify namespace {}", nsid); + let comp = self.admin_queue_completion(cmd_id).await; + + // println!(" - Dumping identify namespace"); + + let size = *(data.as_ptr().offset(0) as *const u64); + let capacity = *(data.as_ptr().offset(8) as *const u64); + println!( + " - ID: {} Size: {} Capacity: {}", + nsid, + size, + capacity + ); + + //TODO: Read block size + + NvmeNamespace { + id: nsid, + blocks: size, + block_size: 512, // TODO + } + } pub async fn init_with_queues(&self) -> BTreeMap { - self.identify_controller().await; - let nsids = self.identify_namespace_list(0).await; + let ((), nsids) = futures::join!(self.identify_controller(), self.identify_namespace_list(0)); let mut namespaces = BTreeMap::new(); - for &nsid in nsids.iter() { - //TODO: Use buffer - let data: Dma<[u8; 4096]> = Dma::zeroed().unwrap(); - // println!(" - Attempting to identify namespace {}", nsid); - { - let qid = 0; - let queue = &mut self.submission_queues[qid]; - let cid = queue.i as u16; - let entry = NvmeCmd::identify_namespace( - cid, data.physical(), nsid - ); - let tail = queue.submit(entry); - self.submission_queue_tail(qid as u16, tail as u16); - } - - // println!(" - Waiting to identify namespace {}", nsid); - { - let qid = 0; - let queue = &mut self.completion_queues[qid]; - let (head, entry) = queue.complete_spin(); - self.completion_queue_head(qid as u16, head as u16); - } - - // println!(" - Dumping identify namespace"); - - - let size = *(data.as_ptr().offset(0) as *const u64); - let capacity = *(data.as_ptr().offset(8) as *const u64); - println!( - " - ID: {} Size: {} Capacity: {}", - nsid, - size, - capacity - ); - - //TODO: Read block size - - namespaces.insert(nsid, NvmeNamespace { - id: nsid, - blocks: size, - block_size: 512, // TODO - }); + for nsid in nsids.iter().copied() { + namespaces.insert(nsid, self.identify_namespace(nsid).await); } for io_qid in 1..self.completion_queues.len() {