aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/src/ucpd.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/embassy-stm32/src/ucpd.rs b/embassy-stm32/src/ucpd.rs
index 133a1c827..c40ee8ad0 100644
--- a/embassy-stm32/src/ucpd.rs
+++ b/embassy-stm32/src/ucpd.rs
@@ -266,7 +266,7 @@ impl<'d, T: Instance> Drop for CcPhy<'d, T> {
266 // Check if the PdPhy part was dropped already. 266 // Check if the PdPhy part was dropped already.
267 let drop_not_ready = &T::state().drop_not_ready; 267 let drop_not_ready = &T::state().drop_not_ready;
268 if drop_not_ready.load(Ordering::Relaxed) { 268 if drop_not_ready.load(Ordering::Relaxed) {
269 drop_not_ready.store(true, Ordering::Relaxed); 269 drop_not_ready.store(false, Ordering::Relaxed);
270 } else { 270 } else {
271 r.cfgr1().write(|w| w.set_ucpden(false)); 271 r.cfgr1().write(|w| w.set_ucpden(false));
272 rcc::disable::<T>(); 272 rcc::disable::<T>();
@@ -411,13 +411,14 @@ pub struct PdPhy<'d, T: Instance> {
411 411
412impl<'d, T: Instance> Drop for PdPhy<'d, T> { 412impl<'d, T: Instance> Drop for PdPhy<'d, T> {
413 fn drop(&mut self) { 413 fn drop(&mut self) {
414 T::REGS.cr().modify(|w| w.set_phyrxen(false)); 414 let r = T::REGS;
415 // Check if the Type-C part was dropped already. 415 r.cr().modify(|w| w.set_phyrxen(false));
416 // Check if the CcPhy part was dropped already.
416 let drop_not_ready = &T::state().drop_not_ready; 417 let drop_not_ready = &T::state().drop_not_ready;
417 if drop_not_ready.load(Ordering::Relaxed) { 418 if drop_not_ready.load(Ordering::Relaxed) {
418 drop_not_ready.store(true, Ordering::Relaxed); 419 drop_not_ready.store(false, Ordering::Relaxed);
419 } else { 420 } else {
420 T::REGS.cfgr1().write(|w| w.set_ucpden(false)); 421 r.cfgr1().write(|w| w.set_ucpden(false));
421 rcc::disable::<T>(); 422 rcc::disable::<T>();
422 T::Interrupt::disable(); 423 T::Interrupt::disable();
423 } 424 }
@@ -453,6 +454,8 @@ impl<'d, T: Instance> PdPhy<'d, T> {
453 }); 454 });
454 }); 455 });
455 456
457 let mut rxpaysz = 0;
458
456 // Stop DMA reception immediately after receiving a packet, to prevent storing multiple packets in the same buffer. 459 // Stop DMA reception immediately after receiving a packet, to prevent storing multiple packets in the same buffer.
457 poll_fn(|cx| { 460 poll_fn(|cx| {
458 let sr = r.sr().read(); 461 let sr = r.sr().read();
@@ -466,6 +469,8 @@ impl<'d, T: Instance> PdPhy<'d, T> {
466 Poll::Ready(Err(RxError::HardReset)) 469 Poll::Ready(Err(RxError::HardReset))
467 } else if sr.rxmsgend() { 470 } else if sr.rxmsgend() {
468 dma.request_stop(); 471 dma.request_stop();
472 // Should be read immediately on interrupt.
473 rxpaysz = r.rx_payszr().read().rxpaysz().into();
469 474
470 let ret = if sr.rxovr() { 475 let ret = if sr.rxovr() {
471 Err(RxError::Overrun) 476 Err(RxError::Overrun)
@@ -501,7 +506,7 @@ impl<'d, T: Instance> PdPhy<'d, T> {
501 _ => unreachable!(), 506 _ => unreachable!(),
502 }; 507 };
503 508
504 Ok((sop, r.rx_payszr().read().rxpaysz().into())) 509 Ok((sop, rxpaysz))
505 } 510 }
506 511
507 fn enable_rx_interrupt(enable: bool) { 512 fn enable_rx_interrupt(enable: bool) {