Skip to content

Commit f703954

Browse files
committed
refactor(virtio-net): avoid placefolder values in driver construction
1 parent 7e69055 commit f703954

File tree

3 files changed

+317
-407
lines changed

3 files changed

+317
-407
lines changed

src/drivers/net/virtio/mmio.rs

Lines changed: 22 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,33 @@
22
//!
33
//! The module contains ...
44
5-
use alloc::boxed::Box;
6-
use alloc::vec::Vec;
7-
use core::str::FromStr;
8-
9-
use smoltcp::phy::ChecksumCapabilities;
105
use virtio::mmio::{DeviceRegisters, DeviceRegistersVolatileFieldAccess};
116
use volatile::VolatileRef;
127

13-
use crate::drivers::net::virtio::{CtrlQueue, NetDevCfg, RxQueues, TxQueues, VirtioNetDriver};
14-
use crate::drivers::virtio::error::{VirtioError, VirtioNetError};
8+
use crate::drivers::net::virtio::{NetDevCfg, VirtioNetDriver};
9+
use crate::drivers::virtio::error::VirtioError;
1510
use crate::drivers::virtio::transport::mmio::{ComCfg, IsrStatus, NotifCfg};
16-
use crate::drivers::virtio::virtqueue::Virtq;
1711
use crate::drivers::InterruptLine;
1812

1913
// Backend-dependent interface for Virtio network driver
2014
impl VirtioNetDriver {
21-
pub fn new(
15+
pub fn print_information(&mut self) {
16+
self.com_cfg.print_information();
17+
if self.dev_status() == virtio::net::S::LINK_UP {
18+
info!("The link of the network device is up!");
19+
}
20+
}
21+
22+
/// Initializes virtio network device by mapping configuration layout to
23+
/// respective structs (configuration structs are:
24+
///
25+
/// Returns a driver instance of
26+
/// [VirtioNetDriver](structs.virtionetdriver.html) or an [VirtioError](enums.virtioerror.html).
27+
pub fn init(
2228
dev_id: u16,
2329
mut registers: VolatileRef<'static, DeviceRegisters>,
2430
irq: InterruptLine,
25-
) -> Result<Self, VirtioNetError> {
31+
) -> Result<VirtioNetDriver, VirtioError> {
2632
let dev_cfg_raw: &'static virtio::net::Config = unsafe {
2733
&*registers
2834
.borrow_mut()
@@ -41,58 +47,11 @@ impl VirtioNetDriver {
4147
let isr_stat = IsrStatus::new(registers.borrow_mut());
4248
let notif_cfg = NotifCfg::new(registers.borrow_mut());
4349

44-
let mtu = if let Some(my_mtu) = hermit_var!("HERMIT_MTU") {
45-
u16::from_str(&my_mtu).unwrap()
46-
} else {
47-
// fallback to the default MTU
48-
1514
49-
};
50-
51-
let send_vqs = TxQueues::new(Vec::<Box<dyn Virtq>>::new(), &dev_cfg);
52-
let recv_vqs = RxQueues::new(Vec::<Box<dyn Virtq>>::new(), &dev_cfg);
53-
Ok(VirtioNetDriver {
54-
dev_cfg,
55-
com_cfg: ComCfg::new(registers, 1),
56-
isr_stat,
57-
notif_cfg,
58-
ctrl_vq: CtrlQueue::new(None),
59-
recv_vqs,
60-
send_vqs,
61-
num_vqs: 0,
62-
mtu,
63-
irq,
64-
checksums: ChecksumCapabilities::default(),
65-
})
66-
}
67-
68-
pub fn print_information(&mut self) {
69-
self.com_cfg.print_information();
70-
if self.dev_status() == virtio::net::S::LINK_UP {
71-
info!("The link of the network device is up!");
72-
}
73-
}
74-
75-
/// Initializes virtio network device by mapping configuration layout to
76-
/// respective structs (configuration structs are:
77-
///
78-
/// Returns a driver instance of
79-
/// [VirtioNetDriver](structs.virtionetdriver.html) or an [VirtioError](enums.virtioerror.html).
80-
pub fn init(
81-
dev_id: u16,
82-
registers: VolatileRef<'static, DeviceRegisters>,
83-
irq: InterruptLine,
84-
) -> Result<VirtioNetDriver, VirtioError> {
85-
if let Ok(mut drv) = VirtioNetDriver::new(dev_id, registers, irq) {
86-
match drv.init_dev() {
87-
Err(error_code) => Err(VirtioError::NetDriver(error_code)),
88-
_ => {
89-
drv.print_information();
90-
Ok(drv)
91-
}
92-
}
93-
} else {
94-
error!("Unable to create Driver. Aborting!");
95-
Err(VirtioError::Unknown)
96-
}
50+
let mut drv =
51+
VirtioNetDriver::init_dev(ComCfg::new(registers, 1), notif_cfg, isr_stat, dev_cfg, irq)
52+
.map_err(VirtioError::NetDriver)
53+
.inspect_err(|_| error!("Unable to create Driver. Aborting!"))?;
54+
drv.print_information();
55+
Ok(drv)
9756
}
9857
}

0 commit comments

Comments
 (0)