@@ -8,7 +8,7 @@ use crate::{Error, Result};
88use alloc:: { vec, vec:: Vec } ;
99use bitflags:: bitflags;
1010use core:: { convert:: TryInto , mem:: size_of} ;
11- use log:: { debug, info , warn} ;
11+ use log:: { debug, warn} ;
1212use zerocopy:: { AsBytes , FromBytes } ;
1313
1414const MAX_BUFFER_LEN : usize = 65535 ;
@@ -112,12 +112,7 @@ pub struct VirtIONet<H: Hal, T: Transport, const QUEUE_SIZE: usize> {
112112impl < H : Hal , T : Transport , const QUEUE_SIZE : usize > VirtIONet < H , T , QUEUE_SIZE > {
113113 /// Create a new VirtIO-Net driver.
114114 pub fn new ( mut transport : T , buf_len : usize ) -> Result < Self > {
115- transport. begin_init ( |features| {
116- let features = Features :: from_bits_truncate ( features) ;
117- info ! ( "Device features {:?}" , features) ;
118- let supported_features = Features :: MAC | Features :: STATUS ;
119- ( features & supported_features) . bits ( )
120- } ) ;
115+ let negotiated_features = transport. begin_init ( SUPPORTED_FEATURES ) ;
121116 // read configuration space
122117 let config = transport. config_space :: < Config > ( ) ?;
123118 let mac;
@@ -139,8 +134,18 @@ impl<H: Hal, T: Transport, const QUEUE_SIZE: usize> VirtIONet<H, T, QUEUE_SIZE>
139134 return Err ( Error :: InvalidParam ) ;
140135 }
141136
142- let send_queue = VirtQueue :: new ( & mut transport, QUEUE_TRANSMIT , false ) ?;
143- let mut recv_queue = VirtQueue :: new ( & mut transport, QUEUE_RECEIVE , false ) ?;
137+ let send_queue = VirtQueue :: new (
138+ & mut transport,
139+ QUEUE_TRANSMIT ,
140+ false ,
141+ negotiated_features. contains ( Features :: RING_EVENT_IDX ) ,
142+ ) ?;
143+ let mut recv_queue = VirtQueue :: new (
144+ & mut transport,
145+ QUEUE_RECEIVE ,
146+ false ,
147+ negotiated_features. contains ( Features :: RING_EVENT_IDX ) ,
148+ ) ?;
144149
145150 const NONE_BUF : Option < RxBuffer > = None ;
146151 let mut rx_buffers = [ NONE_BUF ; QUEUE_SIZE ] ;
@@ -403,3 +408,6 @@ impl GsoType {
403408
404409const QUEUE_RECEIVE : u16 = 0 ;
405410const QUEUE_TRANSMIT : u16 = 1 ;
411+ const SUPPORTED_FEATURES : Features = Features :: MAC
412+ . union ( Features :: STATUS )
413+ . union ( Features :: RING_EVENT_IDX ) ;
0 commit comments