aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-03-06 23:33:02 +0000
committerGitHub <[email protected]>2022-03-06 23:33:02 +0000
commit9735c38592ab6749d832f027fdc3070f97dc57cf (patch)
tree60fc6f5b5fd23fc6ecb4198d23c9d6d93b44e5d6
parent24b6478a7ced1e98165e4776894c439e86507763 (diff)
parent8acec146e0b11fc7ce07b193a37f8903c66ec821 (diff)
Merge #655
655: common/serial/usb: fix hang when write buffer gets full and then the bus resets. r=Dirbaio a=Dirbaio Co-authored-by: Dario Nieuwenhuis <[email protected]>
-rw-r--r--embassy-hal-common/src/usb/usb_serial.rs32
1 files changed, 27 insertions, 5 deletions
diff --git a/embassy-hal-common/src/usb/usb_serial.rs b/embassy-hal-common/src/usb/usb_serial.rs
index 2592d05a6..94f687890 100644
--- a/embassy-hal-common/src/usb/usb_serial.rs
+++ b/embassy-hal-common/src/usb/usb_serial.rs
@@ -167,6 +167,7 @@ impl<'bus, 'a, B: UsbBus> AsyncWrite for UsbSerial<'bus, 'a, B> {
167 167
168 let write_buf = this.write_buf.push_buf(); 168 let write_buf = this.write_buf.push_buf();
169 if write_buf.is_empty() { 169 if write_buf.is_empty() {
170 trace!("buf full, registering waker");
170 this.write_waker.register(cx.waker()); 171 this.write_waker.register(cx.waker());
171 return Poll::Pending; 172 return Poll::Pending;
172 } 173 }
@@ -244,10 +245,18 @@ impl<'bus, 'a, B: UsbBus> UsbSerial<'bus, 'a, B> {
244 }; 245 };
245 246
246 if !buf.is_empty() { 247 if !buf.is_empty() {
248 trace!("writing packet len {}", buf.len());
247 let count = match self.inner.write_packet(buf) { 249 let count = match self.inner.write_packet(buf) {
248 Ok(c) => c, 250 Ok(c) => {
249 Err(UsbError::WouldBlock) => 0, 251 trace!("write packet: OK {}", c);
252 c
253 }
254 Err(UsbError::WouldBlock) => {
255 trace!("write packet: WouldBlock");
256 0
257 }
250 Err(_) => { 258 Err(_) => {
259 trace!("write packet: error");
251 self.write_error = true; 260 self.write_error = true;
252 return; 261 return;
253 } 262 }
@@ -260,11 +269,20 @@ impl<'bus, 'a, B: UsbBus> UsbSerial<'bus, 'a, B> {
260 } 269 }
261 self.write_buf.pop(count); 270 self.write_buf.pop(count);
262 } else if full_size_packets > 0 { 271 } else if full_size_packets > 0 {
263 if let Err(e) = self.inner.write_packet(&[]) { 272 trace!("writing empty packet");
264 if !matches!(e, UsbError::WouldBlock) { 273 match self.inner.write_packet(&[]) {
274 Ok(_) => {
275 trace!("write empty packet: OK");
276 }
277 Err(UsbError::WouldBlock) => {
278 trace!("write empty packet: WouldBlock");
279 return;
280 }
281 Err(_) => {
282 trace!("write empty packet: Error");
265 self.write_error = true; 283 self.write_error = true;
284 return;
266 } 285 }
267 return;
268 } 286 }
269 self.write_state = WriteState::Idle; 287 self.write_state = WriteState::Idle;
270 } 288 }
@@ -284,10 +302,14 @@ where
284 self.read_buf.clear(); 302 self.read_buf.clear();
285 self.write_buf.clear(); 303 self.write_buf.clear();
286 self.write_state = WriteState::Idle; 304 self.write_state = WriteState::Idle;
305 self.read_waker.wake();
306 self.write_waker.wake();
287 } 307 }
288 308
289 fn endpoint_in_complete(&mut self, addr: EndpointAddress) { 309 fn endpoint_in_complete(&mut self, addr: EndpointAddress) {
310 trace!("DONE endpoint_in_complete");
290 if addr == self.inner.write_ep_address() { 311 if addr == self.inner.write_ep_address() {
312 trace!("DONE writing packet, waking");
291 self.write_waker.wake(); 313 self.write_waker.wake();
292 314
293 self.flush_write(); 315 self.flush_write();