aboutsummaryrefslogtreecommitdiff
path: root/src/control.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/control.rs')
-rw-r--r--src/control.rs32
1 files changed, 6 insertions, 26 deletions
diff --git a/src/control.rs b/src/control.rs
index 8bfa033ba..98f678fbc 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,
@@ -278,23 +273,8 @@ impl<'a> Control<'a> {
278 } 273 }
279 274
280 async fn ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, buf: &mut [u8]) -> usize { 275 async fn ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, buf: &mut [u8]) -> usize {
281 // TODO cancel ioctl on future drop. 276 self.ioctl_state.do_ioctl(kind, cmd, iface, buf).await;
282 277 let resp_len = self.ioctl_state.wait_complete().await;
283 while !matches!(self.ioctl_state.get(), IoctlState::Idle) {
284 yield_now().await;
285 }
286
287 self.ioctl_state.set(IoctlState::Pending { kind, cmd, iface, buf });
288
289 let resp_len = loop {
290 if let IoctlState::Done { resp_len } = self.ioctl_state.get() {
291 break resp_len;
292 }
293 yield_now().await;
294 };
295
296 self.ioctl_state.set(IoctlState::Idle);
297
298 resp_len 278 resp_len
299 } 279 }
300} 280}