nvme/ds/queue/
comentry.rs

1#![allow(dead_code)]
2
3use modular_bitfield::prelude::*;
4
5use super::{CommandId, QueueId};
6
7// 2b::3.3.3.2
8
9#[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}