From 9bcf04ab896c87515dbaf6bd9378cb06ebd45114 Mon Sep 17 00:00:00 2001 From: Hu Rui Date: Wed, 8 Jul 2026 17:08:08 +0800 Subject: [PATCH] fix(uhci): rx fsm race condition Closes https://github.com/espressif/esp-idf/issues/18746 --- components/esp_driver_uart/src/uhci.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/components/esp_driver_uart/src/uhci.c b/components/esp_driver_uart/src/uhci.c index 20591b4d05f..258543afac4 100644 --- a/components/esp_driver_uart/src/uhci.c +++ b/components/esp_driver_uart/src/uhci.c @@ -164,7 +164,7 @@ static bool uhci_gdma_rx_callback_done(gdma_channel_handle_t dma_chan, gdma_even gdma_stop(uhci_ctrl->rx_dir.dma_chan); gdma_reset(uhci_ctrl->rx_dir.dma_chan); - uhci_ctrl->rx_dir.rx_fsm = UHCI_RX_FSM_ENABLE; + atomic_store(&uhci_ctrl->rx_dir.rx_fsm, UHCI_RX_FSM_ENABLE); } if (event_data->flags.abnormal_eof) { @@ -357,10 +357,11 @@ esp_err_t uhci_receive(uhci_controller_handle_t uhci_ctrl, uint8_t *read_buffer, ESP_RETURN_ON_ERROR(esp_cache_msync(mount_configs[0].buffer, usable_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), TAG, "cache sync failed"); } + atomic_store(&uhci_ctrl->rx_dir.rx_fsm, UHCI_RX_FSM_RUN); + gdma_reset(uhci_ctrl->rx_dir.dma_chan); gdma_start(uhci_ctrl->rx_dir.dma_chan, gdma_link_get_head_addr(uhci_ctrl->rx_dir.dma_link)); - atomic_store(&uhci_ctrl->rx_dir.rx_fsm, UHCI_RX_FSM_RUN); return ESP_OK; } @@ -473,7 +474,7 @@ esp_err_t uhci_new_controller(const uhci_controller_config_t *config, uhci_contr } atomic_init(&uhci_ctrl->tx_dir.tx_fsm, UHCI_TX_FSM_ENABLE); - atomic_init(&uhci_ctrl->rx_dir.rx_fsm, UHCI_TX_FSM_ENABLE); + atomic_init(&uhci_ctrl->rx_dir.rx_fsm, UHCI_RX_FSM_ENABLE); // Auto search a free controller bool ctrl_found = false;