nvme/ds/queue/
comentry.rs1#![allow(dead_code)]
2
3use modular_bitfield::prelude::*;
4
5use super::{CommandId, QueueId};
6
7#[derive(Debug, Clone, Copy)]
10#[repr(C)]
11pub struct CommonCompletion {
12 dw0: u32,
13 dw1: u32,
14 sqinfo: SqInfo,
15 status: CompletionStatus,
16}
17
18impl Default for CommonCompletion {
19 fn default() -> Self {
20 Self {
21 dw0: Default::default(),
22 dw1: Default::default(),
23 sqinfo: SqInfo::new(),
24 status: CompletionStatus::new(),
25 }
26 }
27}
28
29#[bitfield(bits = 32)]
30#[derive(Debug, Clone, Copy)]
31struct CompletionStatus {
32 cid: B16,
33 phase: bool,
34 status: StatusField,
35}
36
37#[bitfield(bits = 32)]
38#[derive(Debug, Clone, Copy)]
39struct SqInfo {
40 head: B16,
41 sqid: B16,
42}
43
44#[bitfield(bits = 15)]
45#[derive(BitfieldSpecifier, Debug, Clone, Copy)]
46pub struct StatusField {
47 code: B8,
48 code_type: B3,
49 retry_delay: B2,
50 more: B1,
51 do_not_retry: B1,
52}
53
54impl StatusField {
55 pub fn is_error(&self) -> bool {
56 self.code() != 0
57 }
58}
59
60impl CommonCompletion {
61 pub fn phase(&self) -> bool {
62 self.status.phase()
63 }
64
65 pub fn new_sq_head(&self) -> u16 {
66 self.sqinfo.head()
67 }
68
69 pub fn sq_id(&self) -> QueueId {
70 QueueId::new().with_0(self.sqinfo.sqid())
71 }
72
73 pub fn status(&self) -> StatusField {
74 self.status.status()
75 }
76
77 pub fn command_id(&self) -> CommandId {
78 CommandId::new().with_0(self.status.cid())
79 }
80}