2
2
//!
3
3
//! The module contains ...
4
4
5
- use alloc:: boxed:: Box ;
6
- use alloc:: vec:: Vec ;
7
5
use core:: str:: FromStr ;
8
6
9
7
use smoltcp:: phy:: ChecksumCapabilities ;
10
8
use virtio:: mmio:: { DeviceRegisters , DeviceRegistersVolatileFieldAccess } ;
11
9
use volatile:: VolatileRef ;
12
10
13
11
use crate :: drivers:: InterruptLine ;
14
- use crate :: drivers:: net:: virtio:: { CtrlQueue , NetDevCfg , RxQueues , TxQueues , VirtioNetDriver } ;
12
+ use crate :: drivers:: net:: virtio:: { Init , NetDevCfg , Uninit , VirtioNetDriver } ;
15
13
use crate :: drivers:: virtio:: error:: { VirtioError , VirtioNetError } ;
16
14
use crate :: drivers:: virtio:: transport:: mmio:: { ComCfg , IsrStatus , NotifCfg } ;
17
- use crate :: drivers:: virtio:: virtqueue:: Virtq ;
18
15
19
16
// Backend-dependent interface for Virtio network driver
20
- impl VirtioNetDriver {
17
+ impl VirtioNetDriver < Uninit > {
21
18
pub fn new (
22
19
dev_id : u16 ,
23
20
mut registers : VolatileRef < ' static , DeviceRegisters > ,
@@ -48,30 +45,19 @@ impl VirtioNetDriver {
48
45
1514
49
46
} ;
50
47
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
48
Ok ( VirtioNetDriver {
54
49
dev_cfg,
55
50
com_cfg : ComCfg :: new ( registers, 1 ) ,
56
51
isr_stat,
57
52
notif_cfg,
58
- ctrl_vq : CtrlQueue :: new ( None ) ,
59
- recv_vqs,
60
- send_vqs,
53
+ inner : Uninit ,
61
54
num_vqs : 0 ,
62
55
mtu,
63
56
irq,
64
57
checksums : ChecksumCapabilities :: default ( ) ,
65
58
} )
66
59
}
67
60
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
61
/// Initializes virtio network device by mapping configuration layout to
76
62
/// respective structs (configuration structs are:
77
63
///
@@ -81,13 +67,13 @@ impl VirtioNetDriver {
81
67
dev_id : u16 ,
82
68
registers : VolatileRef < ' static , DeviceRegisters > ,
83
69
irq : InterruptLine ,
84
- ) -> Result < VirtioNetDriver , VirtioError > {
85
- if let Ok ( mut drv) = VirtioNetDriver :: new ( dev_id, registers, irq) {
70
+ ) -> Result < VirtioNetDriver < Init > , VirtioError > {
71
+ if let Ok ( drv) = VirtioNetDriver :: new ( dev_id, registers, irq) {
86
72
match drv. init_dev ( ) {
87
73
Err ( error_code) => Err ( VirtioError :: NetDriver ( error_code) ) ,
88
- _ => {
89
- drv . print_information ( ) ;
90
- Ok ( drv )
74
+ Ok ( mut initialized_drv ) => {
75
+ initialized_drv . print_information ( ) ;
76
+ Ok ( initialized_drv )
91
77
}
92
78
}
93
79
} else {
@@ -96,3 +82,12 @@ impl VirtioNetDriver {
96
82
}
97
83
}
98
84
}
85
+
86
+ impl VirtioNetDriver < Init > {
87
+ pub fn print_information ( & mut self ) {
88
+ self . com_cfg . print_information ( ) ;
89
+ if self . dev_status ( ) == virtio:: net:: S :: LINK_UP {
90
+ info ! ( "The link of the network device is up!" ) ;
91
+ }
92
+ }
93
+ }
0 commit comments