From fc07fe652344f31f8dadb8e8f03dbc38228b745c Mon Sep 17 00:00:00 2001 From: xoviat Date: Fri, 7 Aug 2026 14:41:01 -0500 Subject: [PATCH] stm32/gpio: disable flex borrow tracking partially reverts #6454. --- embassy-stm32/src/gpio.rs | 13 +++---------- embassy-stm32/src/usart/buffered.rs | 9 ++++++++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index ffc88aac5d..21d00988fd 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs @@ -18,7 +18,6 @@ use crate::peripherals; #[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Flex<'d> { pub(crate) pin: Peri<'d, AnyPin>, - borrowed: bool, } impl<'d> Flex<'d> { @@ -30,19 +29,17 @@ impl<'d> Flex<'d> { #[inline] pub fn new(pin: Peri<'d, impl Pin>) -> Self { // Pin will be in disconnected state. - Self { - pin: pin.into(), - borrowed: false, - } + Self { pin: pin.into() } } /// Reborrow into a "child" Flex. /// /// `self` will stay borrowed until the child Peripheral is dropped. + /// + /// When the child is dropped, the parent must call set_as to set the Mode again. pub fn reborrow(&mut self) -> Flex<'_> { Flex { pin: self.pin.reborrow(), - borrowed: true, } } @@ -50,7 +47,6 @@ impl<'d> Flex<'d> { pub unsafe fn clone_unchecked(&self) -> Flex<'d> { Flex { pin: self.pin.clone_unchecked(), - borrowed: self.borrowed, } } @@ -257,9 +253,6 @@ impl<'d> Flex<'d> { impl<'d> Drop for Flex<'d> { #[inline] fn drop(&mut self) { - if self.borrowed { - return; - } trace!("gpio: dropping {}", self.pin); critical_section::with(|_| { self.pin.set_as_disconnected(); diff --git a/embassy-stm32/src/usart/buffered.rs b/embassy-stm32/src/usart/buffered.rs index 723ca59301..cc05baecb3 100644 --- a/embassy-stm32/src/usart/buffered.rs +++ b/embassy-stm32/src/usart/buffered.rs @@ -1,8 +1,8 @@ use core::future::poll_fn; use core::marker::PhantomData; -use core::slice; use core::sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering}; use core::task::Poll; +use core::{mem, slice}; use embassy_embedded_hal::SetConfig; use embassy_hal_internal::Peri; @@ -869,6 +869,9 @@ impl<'d> Drop for BufferedUartRx<'d> { } drop_tx_rx(self.info, state); + } else { + mem::forget(self.rts.take()); + mem::forget(self.rx.take()); } } } @@ -887,6 +890,10 @@ impl<'d> Drop for BufferedUartTx<'d> { } } drop_tx_rx(self.info, state); + } else { + mem::forget(self.tx.take()); + mem::forget(self.cts.take()); + mem::forget(self.de.take()); } } }