diff options
Diffstat (limited to 'embassy-net-driver-channel')
| -rw-r--r-- | embassy-net-driver-channel/src/lib.rs | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/embassy-net-driver-channel/src/lib.rs b/embassy-net-driver-channel/src/lib.rs index 369dc5a9d..073edb41a 100644 --- a/embassy-net-driver-channel/src/lib.rs +++ b/embassy-net-driver-channel/src/lib.rs | |||
| @@ -34,24 +34,25 @@ impl<const MTU: usize, const N_RX: usize, const N_TX: usize> State<MTU, N_RX, N_ | |||
| 34 | struct StateInner<'d, const MTU: usize> { | 34 | struct StateInner<'d, const MTU: usize> { |
| 35 | rx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, | 35 | rx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 36 | tx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, | 36 | tx: zerocopy_channel::Channel<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 37 | link_state: Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 37 | shared: Mutex<NoopRawMutex, RefCell<Shared>>, |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | /// State of the LinkState | 40 | /// State of the LinkState |
| 41 | struct LinkStateState { | 41 | struct Shared { |
| 42 | state: LinkState, | 42 | link_state: LinkState, |
| 43 | waker: WakerRegistration, | 43 | waker: WakerRegistration, |
| 44 | ethernet_address: [u8; 6], | ||
| 44 | } | 45 | } |
| 45 | 46 | ||
| 46 | pub struct Runner<'d, const MTU: usize> { | 47 | pub struct Runner<'d, const MTU: usize> { |
| 47 | tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, | 48 | tx_chan: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 48 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 49 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 49 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 50 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | pub struct RxRunner<'d, const MTU: usize> { | 53 | pub struct RxRunner<'d, const MTU: usize> { |
| 53 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 54 | rx_chan: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 54 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 55 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 55 | } | 56 | } |
| 56 | 57 | ||
| 57 | pub struct TxRunner<'d, const MTU: usize> { | 58 | pub struct TxRunner<'d, const MTU: usize> { |
| @@ -62,7 +63,7 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 62 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { | 63 | pub fn split(self) -> (RxRunner<'d, MTU>, TxRunner<'d, MTU>) { |
| 63 | ( | 64 | ( |
| 64 | RxRunner { | 65 | RxRunner { |
| 65 | link_state: self.link_state, | 66 | shared: self.shared, |
| 66 | rx_chan: self.rx_chan, | 67 | rx_chan: self.rx_chan, |
| 67 | }, | 68 | }, |
| 68 | TxRunner { tx_chan: self.tx_chan }, | 69 | TxRunner { tx_chan: self.tx_chan }, |
| @@ -70,9 +71,17 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 70 | } | 71 | } |
| 71 | 72 | ||
| 72 | pub fn set_link_state(&mut self, state: LinkState) { | 73 | pub fn set_link_state(&mut self, state: LinkState) { |
| 73 | self.link_state.lock(|s| { | 74 | self.shared.lock(|s| { |
| 74 | let s = &mut *s.borrow_mut(); | 75 | let s = &mut *s.borrow_mut(); |
| 75 | s.state = state; | 76 | s.link_state = state; |
| 77 | s.waker.wake(); | ||
| 78 | }); | ||
| 79 | } | ||
| 80 | |||
| 81 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | ||
| 82 | self.shared.lock(|s| { | ||
| 83 | let s = &mut *s.borrow_mut(); | ||
| 84 | s.ethernet_address = address; | ||
| 76 | s.waker.wake(); | 85 | s.waker.wake(); |
| 77 | }); | 86 | }); |
| 78 | } | 87 | } |
| @@ -124,9 +133,17 @@ impl<'d, const MTU: usize> Runner<'d, MTU> { | |||
| 124 | 133 | ||
| 125 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { | 134 | impl<'d, const MTU: usize> RxRunner<'d, MTU> { |
| 126 | pub fn set_link_state(&mut self, state: LinkState) { | 135 | pub fn set_link_state(&mut self, state: LinkState) { |
| 127 | self.link_state.lock(|s| { | 136 | self.shared.lock(|s| { |
| 137 | let s = &mut *s.borrow_mut(); | ||
| 138 | s.link_state = state; | ||
| 139 | s.waker.wake(); | ||
| 140 | }); | ||
| 141 | } | ||
| 142 | |||
| 143 | pub fn set_ethernet_address(&mut self, address: [u8; 6]) { | ||
| 144 | self.shared.lock(|s| { | ||
| 128 | let s = &mut *s.borrow_mut(); | 145 | let s = &mut *s.borrow_mut(); |
| 129 | s.state = state; | 146 | s.ethernet_address = address; |
| 130 | s.waker.wake(); | 147 | s.waker.wake(); |
| 131 | }); | 148 | }); |
| 132 | } | 149 | } |
| @@ -194,8 +211,9 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | |||
| 194 | let state = unsafe { &mut *state_uninit }.write(StateInner { | 211 | let state = unsafe { &mut *state_uninit }.write(StateInner { |
| 195 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), | 212 | rx: zerocopy_channel::Channel::new(&mut state.rx[..]), |
| 196 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), | 213 | tx: zerocopy_channel::Channel::new(&mut state.tx[..]), |
| 197 | link_state: Mutex::new(RefCell::new(LinkStateState { | 214 | shared: Mutex::new(RefCell::new(Shared { |
| 198 | state: LinkState::Down, | 215 | link_state: LinkState::Down, |
| 216 | ethernet_address, | ||
| 199 | waker: WakerRegistration::new(), | 217 | waker: WakerRegistration::new(), |
| 200 | })), | 218 | })), |
| 201 | }); | 219 | }); |
| @@ -207,12 +225,11 @@ pub fn new<'d, const MTU: usize, const N_RX: usize, const N_TX: usize>( | |||
| 207 | Runner { | 225 | Runner { |
| 208 | tx_chan: tx_receiver, | 226 | tx_chan: tx_receiver, |
| 209 | rx_chan: rx_sender, | 227 | rx_chan: rx_sender, |
| 210 | link_state: &state.link_state, | 228 | shared: &state.shared, |
| 211 | }, | 229 | }, |
| 212 | Device { | 230 | Device { |
| 213 | caps, | 231 | caps, |
| 214 | ethernet_address, | 232 | shared: &state.shared, |
| 215 | link_state: &state.link_state, | ||
| 216 | rx: rx_receiver, | 233 | rx: rx_receiver, |
| 217 | tx: tx_sender, | 234 | tx: tx_sender, |
| 218 | }, | 235 | }, |
| @@ -233,9 +250,8 @@ impl<const MTU: usize> PacketBuf<MTU> { | |||
| 233 | pub struct Device<'d, const MTU: usize> { | 250 | pub struct Device<'d, const MTU: usize> { |
| 234 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, | 251 | rx: zerocopy_channel::Receiver<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 235 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, | 252 | tx: zerocopy_channel::Sender<'d, NoopRawMutex, PacketBuf<MTU>>, |
| 236 | link_state: &'d Mutex<NoopRawMutex, RefCell<LinkStateState>>, | 253 | shared: &'d Mutex<NoopRawMutex, RefCell<Shared>>, |
| 237 | caps: Capabilities, | 254 | caps: Capabilities, |
| 238 | ethernet_address: [u8; 6], | ||
| 239 | } | 255 | } |
| 240 | 256 | ||
| 241 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | 257 | impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { |
| @@ -265,14 +281,14 @@ impl<'d, const MTU: usize> embassy_net_driver::Driver for Device<'d, MTU> { | |||
| 265 | } | 281 | } |
| 266 | 282 | ||
| 267 | fn ethernet_address(&self) -> [u8; 6] { | 283 | fn ethernet_address(&self) -> [u8; 6] { |
| 268 | self.ethernet_address | 284 | self.shared.lock(|s| s.borrow().ethernet_address) |
| 269 | } | 285 | } |
| 270 | 286 | ||
| 271 | fn link_state(&mut self, cx: &mut Context) -> LinkState { | 287 | fn link_state(&mut self, cx: &mut Context) -> LinkState { |
| 272 | self.link_state.lock(|s| { | 288 | self.shared.lock(|s| { |
| 273 | let s = &mut *s.borrow_mut(); | 289 | let s = &mut *s.borrow_mut(); |
| 274 | s.waker.register(cx.waker()); | 290 | s.waker.register(cx.waker()); |
| 275 | s.state | 291 | s.link_state |
| 276 | }) | 292 | }) |
| 277 | } | 293 | } |
| 278 | } | 294 | } |
