2
2
//!
3
3
//! The module contains ...
4
4
5
- use alloc:: boxed:: Box ;
6
- use alloc:: vec:: Vec ;
7
- use core:: str:: FromStr ;
8
-
9
- use smoltcp:: phy:: ChecksumCapabilities ;
10
5
use virtio:: mmio:: { DeviceRegisters , DeviceRegistersVolatileFieldAccess } ;
11
6
use volatile:: VolatileRef ;
12
7
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 ;
15
10
use crate :: drivers:: virtio:: transport:: mmio:: { ComCfg , IsrStatus , NotifCfg } ;
16
- use crate :: drivers:: virtio:: virtqueue:: Virtq ;
17
11
use crate :: drivers:: InterruptLine ;
18
12
19
13
// Backend-dependent interface for Virtio network driver
20
14
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 (
22
28
dev_id : u16 ,
23
29
mut registers : VolatileRef < ' static , DeviceRegisters > ,
24
30
irq : InterruptLine ,
25
- ) -> Result < Self , VirtioNetError > {
31
+ ) -> Result < VirtioNetDriver , VirtioError > {
26
32
let dev_cfg_raw: & ' static virtio:: net:: Config = unsafe {
27
33
& * registers
28
34
. borrow_mut ( )
@@ -41,58 +47,11 @@ impl VirtioNetDriver {
41
47
let isr_stat = IsrStatus :: new ( registers. borrow_mut ( ) ) ;
42
48
let notif_cfg = NotifCfg :: new ( registers. borrow_mut ( ) ) ;
43
49
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)
97
56
}
98
57
}
0 commit comments