aboutsummaryrefslogtreecommitdiff
path: root/embassy-net-nrf91/src
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-net-nrf91/src')
-rw-r--r--embassy-net-nrf91/src/lib.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/embassy-net-nrf91/src/lib.rs b/embassy-net-nrf91/src/lib.rs
index 110d0ff24..d8878f147 100644
--- a/embassy-net-nrf91/src/lib.rs
+++ b/embassy-net-nrf91/src/lib.rs
@@ -209,6 +209,7 @@ async fn new_internal<'a>(
209 209
210 tx_seq_no: 0, 210 tx_seq_no: 0,
211 tx_buf_used: [false; TX_BUF_COUNT], 211 tx_buf_used: [false; TX_BUF_COUNT],
212 tx_waker: WakerRegistration::new(),
212 213
213 trace_chans: Vec::new(), 214 trace_chans: Vec::new(),
214 trace_check: PointerChecker { 215 trace_check: PointerChecker {
@@ -311,6 +312,7 @@ struct StateInner {
311 312
312 tx_seq_no: u16, 313 tx_seq_no: u16,
313 tx_buf_used: [bool; TX_BUF_COUNT], 314 tx_buf_used: [bool; TX_BUF_COUNT],
315 tx_waker: WakerRegistration,
314 316
315 trace_chans: Vec<TraceChannelInfo, TRACE_CHANNEL_COUNT>, 317 trace_chans: Vec<TraceChannelInfo, TRACE_CHANNEL_COUNT>,
316 trace_check: PointerChecker, 318 trace_check: PointerChecker,
@@ -522,6 +524,7 @@ impl StateInner {
522 msg.data = ptr::null_mut(); 524 msg.data = ptr::null_mut();
523 msg.data_len = 0; 525 msg.data_len = 0;
524 self.tx_buf_used[buf_idx] = false; 526 self.tx_buf_used[buf_idx] = false;
527 self.tx_waker.wake();
525 Err(e) 528 Err(e)
526 } else { 529 } else {
527 Ok(()) 530 Ok(())
@@ -586,6 +589,7 @@ impl StateInner {
586 ); 589 );
587 } 590 }
588 self.tx_buf_used[idx] = false; 591 self.tx_buf_used[idx] = false;
592 self.tx_waker.wake();
589 } 593 }
590 594
591 fn handle_data(&mut self, msg: &Message, ch: &mut ch::Runner<MTU>) { 595 fn handle_data(&mut self, msg: &Message, ch: &mut ch::Runner<MTU>) {
@@ -761,10 +765,22 @@ impl<'a> Control<'a> {
761 state.next_req_serial = state.next_req_serial.wrapping_add(1); 765 state.next_req_serial = state.next_req_serial.wrapping_add(1);
762 } 766 }
763 767
768 drop(state); // don't borrow state across awaits.
769
764 msg.param[0..4].copy_from_slice(&req_serial.to_le_bytes()); 770 msg.param[0..4].copy_from_slice(&req_serial.to_le_bytes());
765 unwrap!(state.send_message(msg, req_data)); 771
772 poll_fn(|cx| {
773 let mut state = self.state.borrow_mut();
774 state.tx_waker.register(cx.waker());
775 match state.send_message(msg, req_data) {
776 Ok(_) => Poll::Ready(()),
777 Err(NoFreeBufs) => Poll::Pending,
778 }
779 })
780 .await;
766 781
767 // Setup the pending request state. 782 // Setup the pending request state.
783 let mut state = self.state.borrow_mut();
768 let (req_slot_idx, req_slot) = state 784 let (req_slot_idx, req_slot) = state
769 .requests 785 .requests
770 .iter_mut() 786 .iter_mut()