diff options
| author | Dario Nieuwenhuis <[email protected]> | 2023-08-15 16:47:45 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-08-15 16:47:45 +0200 |
| commit | 098fcb14b504dea617c38e90410c639ecbcb6aa7 (patch) | |
| tree | dc98c22199b8c224908b7b0368fbee915d77c19f | |
| parent | b6b44480457d272aace977e885d5dba252fd2bed (diff) | |
net-w5500: simplify rx logic.
| -rw-r--r-- | embassy-net-w5500/src/device.rs | 38 |
1 files changed, 11 insertions, 27 deletions
diff --git a/embassy-net-w5500/src/device.rs b/embassy-net-w5500/src/device.rs index 9874df0d6..4933625e2 100644 --- a/embassy-net-w5500/src/device.rs +++ b/embassy-net-w5500/src/device.rs | |||
| @@ -58,20 +58,11 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | /// Read bytes from the RX buffer. Returns the number of bytes read. | 60 | /// Read bytes from the RX buffer. Returns the number of bytes read. |
| 61 | async fn read_bytes(&mut self, buffer: &mut [u8], offset: u16) -> Result<usize, SPI::Error> { | 61 | async fn read_bytes(&mut self, read_ptr: &mut u16, buffer: &mut [u8]) -> Result<(), SPI::Error> { |
| 62 | let rx_size = socket::get_rx_size(&mut self.bus).await? as usize; | 62 | self.bus.read_frame(RegisterBlock::RxBuf, *read_ptr, buffer).await?; |
| 63 | 63 | *read_ptr = (*read_ptr).wrapping_add(buffer.len() as u16); | |
| 64 | let read_buffer = if rx_size > buffer.len() + offset as usize { | ||
| 65 | buffer | ||
| 66 | } else { | ||
| 67 | &mut buffer[..rx_size - offset as usize] | ||
| 68 | }; | ||
| 69 | 64 | ||
| 70 | let read_ptr = socket::get_rx_read_ptr(&mut self.bus).await?.wrapping_add(offset); | 65 | Ok(()) |
| 71 | self.bus.read_frame(RegisterBlock::RxBuf, read_ptr, read_buffer).await?; | ||
| 72 | socket::set_rx_read_ptr(&mut self.bus, read_ptr.wrapping_add(read_buffer.len() as u16)).await?; | ||
| 73 | |||
| 74 | Ok(read_buffer.len()) | ||
| 75 | } | 66 | } |
| 76 | 67 | ||
| 77 | /// Read an ethernet frame from the device. Returns the number of bytes read. | 68 | /// Read an ethernet frame from the device. Returns the number of bytes read. |
| @@ -83,31 +74,24 @@ impl<SPI: SpiDevice> W5500<SPI> { | |||
| 83 | 74 | ||
| 84 | socket::reset_interrupt(&mut self.bus, socket::Interrupt::Receive).await?; | 75 | socket::reset_interrupt(&mut self.bus, socket::Interrupt::Receive).await?; |
| 85 | 76 | ||
| 77 | let mut read_ptr = socket::get_rx_read_ptr(&mut self.bus).await?; | ||
| 78 | |||
| 86 | // First two bytes gives the size of the received ethernet frame | 79 | // First two bytes gives the size of the received ethernet frame |
| 87 | let expected_frame_size: usize = { | 80 | let expected_frame_size: usize = { |
| 88 | let mut frame_bytes = [0u8; 2]; | 81 | let mut frame_bytes = [0u8; 2]; |
| 89 | assert!(self.read_bytes(&mut frame_bytes[..], 0).await? == 2); | 82 | self.read_bytes(&mut read_ptr, &mut frame_bytes).await?; |
| 90 | u16::from_be_bytes(frame_bytes) as usize - 2 | 83 | u16::from_be_bytes(frame_bytes) as usize - 2 |
| 91 | }; | 84 | }; |
| 92 | 85 | ||
| 93 | // Read the ethernet frame | 86 | // Read the ethernet frame |
| 94 | let read_buffer = if frame.len() > expected_frame_size { | 87 | self.read_bytes(&mut read_ptr, &mut frame[..expected_frame_size]) |
| 95 | &mut frame[..expected_frame_size] | 88 | .await?; |
| 96 | } else { | ||
| 97 | frame | ||
| 98 | }; | ||
| 99 | |||
| 100 | let recvd_frame_size = self.read_bytes(read_buffer, 2).await?; | ||
| 101 | 89 | ||
| 102 | // Register RX as completed | 90 | // Register RX as completed |
| 91 | socket::set_rx_read_ptr(&mut self.bus, read_ptr).await?; | ||
| 103 | socket::command(&mut self.bus, socket::Command::Receive).await?; | 92 | socket::command(&mut self.bus, socket::Command::Receive).await?; |
| 104 | 93 | ||
| 105 | // If the whole frame wasn't read, drop it | 94 | Ok(expected_frame_size) |
| 106 | if recvd_frame_size < expected_frame_size { | ||
| 107 | Ok(0) | ||
| 108 | } else { | ||
| 109 | Ok(recvd_frame_size) | ||
| 110 | } | ||
| 111 | } | 95 | } |
| 112 | 96 | ||
| 113 | /// Write an ethernet frame to the device. Returns number of bytes written | 97 | /// Write an ethernet frame to the device. Returns number of bytes written |
