@@ -481,7 +481,7 @@ where
481
481
pub fn next_transfer (
482
482
& mut self ,
483
483
mut new_buf : BUF ,
484
- ) -> Result < ( BUF , CurrentBuffer ) , DMAError < BUF > > {
484
+ ) -> Result < ( BUF , CurrentBuffer , usize ) , DMAError < BUF > > {
485
485
if self . double_buf . is_some ( )
486
486
&& DIR :: direction ( ) != DmaDirection :: MemoryToMemory
487
487
{
@@ -513,10 +513,10 @@ where
513
513
// preceding reads"
514
514
compiler_fence ( Ordering :: Acquire ) ;
515
515
516
- let old_buf = self . buf . replace ( new_buf) ;
517
-
518
516
// We always have a buffer, so unwrap can't fail
519
- return Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: FirstBuffer ) ) ;
517
+ let old_buf = self . buf . replace ( new_buf) . unwrap ( ) ;
518
+
519
+ return Ok ( ( old_buf, CurrentBuffer :: FirstBuffer , 0 ) ) ;
520
520
} else {
521
521
unsafe {
522
522
self . stream
@@ -535,10 +535,10 @@ where
535
535
// preceding reads"
536
536
compiler_fence ( Ordering :: Acquire ) ;
537
537
538
- let old_buf = self . double_buf . replace ( new_buf) ;
539
-
540
538
// double buffering, unwrap can never fail
541
- return Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: DoubleBuffer ) ) ;
539
+ let old_buf = self . double_buf . replace ( new_buf) . unwrap ( ) ;
540
+
541
+ return Ok ( ( old_buf, CurrentBuffer :: DoubleBuffer , 0 ) ) ;
542
542
}
543
543
}
544
544
self . stream . disable ( ) ;
@@ -547,6 +547,9 @@ where
547
547
// "No re-ordering of reads and writes across this point is allowed"
548
548
compiler_fence ( Ordering :: SeqCst ) ;
549
549
550
+ // Check how many data in the transfer are remaining.
551
+ let remaining_data = STREAM :: get_number_of_transfers ( ) ;
552
+
550
553
// NOTE(unsafe) We now own this buffer and we won't call any &mut
551
554
// methods on it until the end of the DMA transfer
552
555
let buf_len = unsafe {
@@ -556,7 +559,9 @@ where
556
559
buf_len
557
560
} ;
558
561
self . stream . set_number_of_transfers ( buf_len as u16 ) ;
559
- let old_buf = self . buf . replace ( new_buf) ;
562
+
563
+ // We own the buffer now, so unwrap is always safe.
564
+ let old_buf = self . buf . replace ( new_buf) . unwrap ( ) ;
560
565
561
566
// Ensure that all transfers to normal memory complete before
562
567
// subsequent memory transfers.
@@ -573,7 +578,7 @@ where
573
578
self . stream . enable ( ) ;
574
579
}
575
580
576
- Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: FirstBuffer ) )
581
+ Ok ( ( old_buf, CurrentBuffer :: FirstBuffer , remaining_data as usize ) )
577
582
}
578
583
579
584
/// Stops the stream and returns the underlying resources.
0 commit comments