diff options
| -rw-r--r-- | embassy-stm32/src/ucpd.rs | 17 |
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 | ||
| 412 | impl<'d, T: Instance> Drop for PdPhy<'d, T> { | 412 | impl<'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) { |
