aboutsummaryrefslogtreecommitdiff
path: root/src/control.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/control.rs')
-rw-r--r--src/control.rs30
1 files changed, 6 insertions, 24 deletions
diff --git a/src/control.rs b/src/control.rs
index 79677b554..0dbf6d44f 100644
--- a/src/control.rs
+++ b/src/control.rs
@@ -1,8 +1,6 @@
1use core::cell::Cell;
2use core::cmp::{max, min}; 1use core::cmp::{max, min};
3 2
4use ch::driver::LinkState; 3use ch::driver::LinkState;
5use embassy_futures::yield_now;
6use embassy_net_driver_channel as ch; 4use embassy_net_driver_channel as ch;
7use embassy_time::{Duration, Timer}; 5use embassy_time::{Duration, Timer};
8 6
@@ -10,21 +8,18 @@ pub use crate::bus::SpiBusCyw43;
10use crate::consts::*; 8use crate::consts::*;
11use crate::events::{Event, EventQueue}; 9use crate::events::{Event, EventQueue};
12use crate::fmt::Bytes; 10use crate::fmt::Bytes;
11use crate::ioctl::{IoctlState, IoctlType};
13use crate::structs::*; 12use crate::structs::*;
14use crate::{countries, IoctlState, IoctlType, PowerManagementMode}; 13use crate::{countries, PowerManagementMode};
15 14
16pub struct Control<'a> { 15pub struct Control<'a> {
17 state_ch: ch::StateRunner<'a>, 16 state_ch: ch::StateRunner<'a>,
18 event_sub: &'a EventQueue, 17 event_sub: &'a EventQueue,
19 ioctl_state: &'a Cell<IoctlState>, 18 ioctl_state: &'a IoctlState,
20} 19}
21 20
22impl<'a> Control<'a> { 21impl<'a> Control<'a> {
23 pub(crate) fn new( 22 pub(crate) fn new(state_ch: ch::StateRunner<'a>, event_sub: &'a EventQueue, ioctl_state: &'a IoctlState) -> Self {
24 state_ch: ch::StateRunner<'a>,
25 event_sub: &'a EventQueue,
26 ioctl_state: &'a Cell<IoctlState>,
27 ) -> Self {
28 Self { 23 Self {
29 state_ch, 24 state_ch,
30 event_sub, 25 event_sub,
@@ -285,21 +280,8 @@ impl<'a> Control<'a> {
285 async fn ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, buf: &mut [u8]) -> usize { 280 async fn ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, buf: &mut [u8]) -> usize {
286 // TODO cancel ioctl on future drop. 281 // TODO cancel ioctl on future drop.
287 282
288 while !matches!(self.ioctl_state.get(), IoctlState::Idle) { 283 self.ioctl_state.do_ioctl(kind, cmd, iface, buf).await;
289 yield_now().await; 284 let resp_len = self.ioctl_state.wait_complete().await;
290 }
291
292 self.ioctl_state.set(IoctlState::Pending { kind, cmd, iface, buf });
293
294 let resp_len = loop {
295 if let IoctlState::Done { resp_len } = self.ioctl_state.get() {
296 break resp_len;
297 }
298 yield_now().await;
299 };
300
301 self.ioctl_state.set(IoctlState::Idle);
302
303 resp_len 285 resp_len
304 } 286 }
305} 287}