aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-08-15 16:47:45 +0200
committerDario Nieuwenhuis <[email protected]>2023-08-15 16:47:45 +0200
commit098fcb14b504dea617c38e90410c639ecbcb6aa7 (patch)
treedc98c22199b8c224908b7b0368fbee915d77c19f
parentb6b44480457d272aace977e885d5dba252fd2bed (diff)
net-w5500: simplify rx logic.
-rw-r--r--embassy-net-w5500/src/device.rs38
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