11#![ no_std]
22
3- use virtio:: { VirtQueue , VirtioDevice } ;
3+ use virtio:: { DescChain , VirtQueue , VirtioDevice } ;
44use zinnia:: {
55 alloc:: { boxed:: Box , sync:: Arc , vec:: Vec } ,
66 arch,
@@ -40,17 +40,17 @@ struct Controller {
4040}
4141
4242struct TxBuffer {
43- desc_id : u32 ,
43+ chain : DescChain ,
4444 _buffer : OwnedPhysPages ,
4545}
4646
4747impl Controller {
4848 fn reap_tx ( & self , queue : & mut VirtQueue ) {
49- while let Some ( ( desc_id , _ ) ) = queue. get_used ( ) {
50- queue. release_used_chain ( desc_id ) ;
49+ while let Some ( used ) = queue. get_used ( ) {
50+ queue. release_used_chain ( used . chain ) ;
5151
5252 let mut buffers = self . tx_buffers . lock ( ) ;
53- if let Some ( pos) = buffers. iter ( ) . position ( |buf| buf. desc_id == desc_id ) {
53+ if let Some ( pos) = buffers. iter ( ) . position ( |buf| buf. chain == used . chain ) {
5454 buffers. swap_remove ( pos) ;
5555 }
5656 }
@@ -66,7 +66,7 @@ impl NicDevice for Controller {
6666 // Block on rx_event until the IRQ wakes us with a used entry to claim.
6767 // The guard()-then-check pattern avoids missing an already-completed
6868 // descriptor before we put the task to sleep.
69- let ( desc_id , len ) = loop {
69+ let used = loop {
7070 let guard = self . rx_event . guard ( ) ;
7171 {
7272 let mut queue = self . recv_queue . lock ( ) ;
@@ -77,12 +77,12 @@ impl NicDevice for Controller {
7777 guard. wait ( ) ;
7878 } ;
7979
80- debug_assert ! ( ( desc_id as usize ) < self . rx_buffers . len ( ) ) ;
81- let slot = desc_id as usize ;
82- let buf = & self . rx_buffers [ slot] ;
80+ let slot = used . chain . head ( ) as usize ;
81+ debug_assert ! ( slot < self . rx_buffers . len ( ) ) ;
82+ let buf = self . rx_buffers . get ( slot) . ok_or ( Errno :: EIO ) ? ;
8383
8484 // The first VIRTIO_NET_HDR_LEN bytes are the virtio-net header; skip them.
85- let total = ( len as usize ) . min ( self . page_size ) ;
85+ let total = ( used . len as usize ) . min ( self . page_size ) ;
8686 let payload_len = total. saturating_sub ( VIRTIO_NET_HDR_LEN ) ;
8787 let n = payload_len. min ( frame. len ( ) ) ;
8888
@@ -94,9 +94,9 @@ impl NicDevice for Controller {
9494
9595 // Re-add the same physical buffer so the queue stays full.
9696 let mut queue = self . recv_queue . lock ( ) ;
97- queue. release_used_chain ( desc_id ) ;
97+ queue. release_used_chain ( used . chain ) ;
9898 queue. add_buffer ( & [ ( buf. phys ( ) , self . page_size , true ) ] ) ?;
99- self . virtio . lock ( ) . notify_queue ( & queue) ;
99+ self . virtio . lock ( ) . notify_queue ( & queue) ? ;
100100
101101 Ok ( n)
102102 }
@@ -125,12 +125,12 @@ impl NicDevice for Controller {
125125 {
126126 let mut queue = self . send_queue . lock ( ) ;
127127 self . reap_tx ( & mut queue) ;
128- let desc_id = queue. add_buffer ( & [ ( buf. phys ( ) , total_len, false ) ] ) ?;
128+ let chain = queue. add_buffer ( & [ ( buf. phys ( ) , total_len, false ) ] ) ?;
129129 self . tx_buffers . lock ( ) . push ( TxBuffer {
130- desc_id : desc_id as u32 ,
130+ chain ,
131131 _buffer : buf,
132132 } ) ;
133- self . virtio . lock ( ) . notify_queue ( & queue) ;
133+ self . virtio . lock ( ) . notify_queue ( & queue) ? ;
134134 }
135135
136136 Ok ( ( ) )
@@ -168,8 +168,8 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
168168
169169 let mut dev = VirtioDevice :: new_pci ( access) ?;
170170
171- let dev_features_lo = dev. get_device_features ( 0 ) ;
172- let dev_features_hi = dev. get_device_features ( 1 ) ;
171+ let dev_features_lo = dev. get_device_features ( 0 ) ? ;
172+ let dev_features_hi = dev. get_device_features ( 1 ) ? ;
173173
174174 let supported_lo = ( spec:: FeatureFlags :: Mac
175175 | spec:: FeatureFlags :: MrgRxbuf
@@ -178,8 +178,8 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
178178 let driver_lo = dev_features_lo & supported_lo;
179179 let driver_hi = dev_features_hi & VIRTIO_F_VERSION_1_LO ;
180180
181- dev. set_driver_features ( 0 , driver_lo) ;
182- dev. set_driver_features ( 1 , driver_hi) ;
181+ dev. set_driver_features ( 0 , driver_lo) ? ;
182+ dev. set_driver_features ( 1 , driver_hi) ? ;
183183
184184 log ! (
185185 "Negotiated features lo=0x{:08x}, hi=0x{:08x}" ,
@@ -205,9 +205,9 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
205205
206206 // Wire both queues to MSI-X vector 0 (the one we configured above) and
207207 // disable config-change interrupts.
208- let ack_rx = dev. set_queue_msix_vector ( 0 , 0 ) ;
209- let ack_tx = dev. set_queue_msix_vector ( 1 , 0 ) ;
210- let _ = dev. set_config_msix_vector ( 0xFFFF ) ;
208+ let ack_rx = dev. set_queue_msix_vector ( 0 , 0 ) ? ;
209+ let ack_tx = dev. set_queue_msix_vector ( 1 , 0 ) ? ;
210+ let _ = dev. set_config_msix_vector ( 0xFFFF ) ? ;
211211 if ack_rx != 0 || ack_tx != 0 {
212212 error ! (
213213 "Device refused MSI-X vector assignment (rx={:#x}, tx={:#x})" ,
@@ -231,9 +231,9 @@ fn probe(_variant: &PciVariant, mut access: DeviceView<'static>) -> EResult<()>
231231 rx_buffers. push ( buf) ;
232232 }
233233
234- dev. set_driver_ok ( ) ;
234+ dev. set_driver_ok ( ) ? ;
235235
236- dev. notify_queue ( & recv_queue) ;
236+ dev. notify_queue ( & recv_queue) ? ;
237237
238238 let controller = Arc :: new ( Controller {
239239 virtio : SpinMutex :: new ( dev) ,
0 commit comments