diff options
| author | Ulf Lilleengen <[email protected]> | 2024-12-04 14:24:18 +0100 |
|---|---|---|
| committer | Ulf Lilleengen <[email protected]> | 2024-12-04 14:48:55 +0100 |
| commit | aa1bd827ca36f88baa116c2bf5c2cb3c74e6b026 (patch) | |
| tree | 6a0ef96480ace932d7bc169eb0014de6cb0634d2 /embassy-net-nrf91/src/lib.rs | |
| parent | af02310edc60c568368d2e8805bb07a0797723a8 (diff) | |
Wait for tx buffers to be available for request fn
Diffstat (limited to 'embassy-net-nrf91/src/lib.rs')
| -rw-r--r-- | embassy-net-nrf91/src/lib.rs | 18 |
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() |
