Skip to content

Commit e70a787

Browse files
committed
Adding return of remaining transfers
1 parent 0bfeeca commit e70a787

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/dma/mod.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ where
481481
pub fn next_transfer(
482482
&mut self,
483483
mut new_buf: BUF,
484-
) -> Result<(BUF, CurrentBuffer), DMAError<BUF>> {
484+
) -> Result<(BUF, CurrentBuffer, usize), DMAError<BUF>> {
485485
if self.double_buf.is_some()
486486
&& DIR::direction() != DmaDirection::MemoryToMemory
487487
{
@@ -513,10 +513,10 @@ where
513513
// preceding reads"
514514
compiler_fence(Ordering::Acquire);
515515

516-
let old_buf = self.buf.replace(new_buf);
517-
518516
// 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));
520520
} else {
521521
unsafe {
522522
self.stream
@@ -535,10 +535,10 @@ where
535535
// preceding reads"
536536
compiler_fence(Ordering::Acquire);
537537

538-
let old_buf = self.double_buf.replace(new_buf);
539-
540538
// 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));
542542
}
543543
}
544544
self.stream.disable();
@@ -547,6 +547,9 @@ where
547547
// "No re-ordering of reads and writes across this point is allowed"
548548
compiler_fence(Ordering::SeqCst);
549549

550+
// Check how many data in the transfer are remaining.
551+
let remaining_data = STREAM::get_number_of_transfers();
552+
550553
// NOTE(unsafe) We now own this buffer and we won't call any &mut
551554
// methods on it until the end of the DMA transfer
552555
let buf_len = unsafe {
@@ -556,7 +559,9 @@ where
556559
buf_len
557560
};
558561
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();
560565

561566
// Ensure that all transfers to normal memory complete before
562567
// subsequent memory transfers.
@@ -573,7 +578,7 @@ where
573578
self.stream.enable();
574579
}
575580

576-
Ok((old_buf.unwrap(), CurrentBuffer::FirstBuffer))
581+
Ok((old_buf, CurrentBuffer::FirstBuffer, remaining_data as usize))
577582
}
578583

579584
/// Stops the stream and returns the underlying resources.

0 commit comments

Comments
 (0)