aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32-wpan/src/wb55/sub/mm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32-wpan/src/wb55/sub/mm.rs')
-rw-r--r--embassy-stm32-wpan/src/wb55/sub/mm.rs14
1 files changed, 6 insertions, 8 deletions
diff --git a/embassy-stm32-wpan/src/wb55/sub/mm.rs b/embassy-stm32-wpan/src/wb55/sub/mm.rs
index cbb5f130b..0ca7d1835 100644
--- a/embassy-stm32-wpan/src/wb55/sub/mm.rs
+++ b/embassy-stm32-wpan/src/wb55/sub/mm.rs
@@ -4,7 +4,6 @@ use core::mem::MaybeUninit;
4use core::task::Poll; 4use core::task::Poll;
5 5
6use aligned::{A4, Aligned}; 6use aligned::{A4, Aligned};
7use cortex_m::interrupt;
8use embassy_stm32::ipcc::IpccTxChannel; 7use embassy_stm32::ipcc::IpccTxChannel;
9use embassy_sync::waitqueue::AtomicWaker; 8use embassy_sync::waitqueue::AtomicWaker;
10 9
@@ -52,7 +51,7 @@ impl<'a> MemoryManager<'a> {
52 loop { 51 loop {
53 poll_fn(|cx| unsafe { 52 poll_fn(|cx| unsafe {
54 MM_WAKER.register(cx.waker()); 53 MM_WAKER.register(cx.waker());
55 if LinkedListNode::is_empty(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) { 54 if critical_section::with(|cs| LinkedListNode::is_empty(cs, LOCAL_FREE_BUF_QUEUE.as_mut_ptr())) {
56 Poll::Pending 55 Poll::Pending
57 } else { 56 } else {
58 Poll::Ready(()) 57 Poll::Ready(())
@@ -62,10 +61,9 @@ impl<'a> MemoryManager<'a> {
62 61
63 self.ipcc_mm_release_buffer_channel 62 self.ipcc_mm_release_buffer_channel
64 .send(|| { 63 .send(|| {
65 interrupt::free(|_| unsafe { 64 critical_section::with(|cs| unsafe {
66 // CS required while moving nodes 65 while let Some(node_ptr) = LinkedListNode::remove_head(cs, LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) {
67 while let Some(node_ptr) = LinkedListNode::remove_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr()) { 66 LinkedListNode::insert_head(cs, FREE_BUF_QUEUE.as_mut_ptr(), node_ptr);
68 LinkedListNode::insert_head(FREE_BUF_QUEUE.as_mut_ptr(), node_ptr);
69 } 67 }
70 }) 68 })
71 }) 69 })
@@ -77,8 +75,8 @@ impl<'a> MemoryManager<'a> {
77impl<'a> evt::MemoryManager for MemoryManager<'a> { 75impl<'a> evt::MemoryManager for MemoryManager<'a> {
78 /// SAFETY: passing a pointer to something other than a managed event packet is UB 76 /// SAFETY: passing a pointer to something other than a managed event packet is UB
79 unsafe fn drop_event_packet(evt: *mut EvtPacket) { 77 unsafe fn drop_event_packet(evt: *mut EvtPacket) {
80 interrupt::free(|_| unsafe { 78 critical_section::with(|cs| unsafe {
81 LinkedListNode::insert_head(LOCAL_FREE_BUF_QUEUE.as_mut_ptr(), evt as *mut _); 79 LinkedListNode::insert_head(cs, LOCAL_FREE_BUF_QUEUE.as_mut_ptr(), evt as *mut _);
82 }); 80 });
83 81
84 MM_WAKER.wake(); 82 MM_WAKER.wake();