From 8f643cd992598cde79a400b3aab6fdf35cf37446 Mon Sep 17 00:00:00 2001 From: algin Date: Tue, 26 Sep 2023 10:09:59 +0300 Subject: [PATCH] =?UTF-8?q?fix(UML-1780):=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D1=89=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D0=B0=D1=80=D1=8F=D0=B4=D0=BA=D0=B0=20DMA=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/free_rtos/ethernet/eth_rx_flow.cpp | 33 ++++++++++++------- components/free_rtos/ethernet/eth_rx_flow.hpp | 3 +- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/components/free_rtos/ethernet/eth_rx_flow.cpp b/components/free_rtos/ethernet/eth_rx_flow.cpp index d7434d1..8428b8b 100644 --- a/components/free_rtos/ethernet/eth_rx_flow.cpp +++ b/components/free_rtos/ethernet/eth_rx_flow.cpp @@ -28,7 +28,25 @@ using namespace free_rtos; void free_rtos::rxIsrHandler(void *appData) { EthRxFlow * rx_flow = (EthRxFlow *)appData; + EnetDma_PktQ rxReadyQ; + uint32_t readyQCount; + int32_t status; + if (rx_flow != nullptr) { + status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ); + EnetAppUtils_assert(status == ENET_SOK); + + readyQCount = EnetQueue_getQCount(&rxReadyQ); + + if(readyQCount == 0) { + return; + } + + // Reload DMA with a new rx free queue as fast as possible + rx_flow->reloadDmaRxPktQ(readyQCount); + + EnetQueue_append(&rx_flow->rx_ready_pktq_, &rxReadyQ); + rx_flow->sem_[EthRxFlow::e_signalRxPkt].post(); } } @@ -47,6 +65,7 @@ free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_s passive_mode_{false} { EnetQueue_initQ(&rx_free_pktq_); + EnetQueue_initQ(&rx_ready_pktq_); } void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv) @@ -118,7 +137,6 @@ void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount) void free_rtos::EthRxFlow::rxProcessPktTask() { - EnetDma_PktQ rxReadyQ; /// ������� ������� ������� (������ � �������) EnetDma_Pkt* rxPktInfo; /// ����� � ������� int32_t status; @@ -128,19 +146,12 @@ void free_rtos::EthRxFlow::rxProcessPktTask() status = sem_[e_signalRxPkt].pend(e_signalRxPkt_timeout_ticks_); if(status != SystemP_SUCCESS) { - EnetAppUtils_print("rx_flow %u: Warning ! No rx packets timeout.\r\n", id_); + //EnetAppUtils_print("rx_flow %u: Warning ! No rx packets timeout.\r\n", id_); continue; } - /// ��������� ������� � � �������� � rxReadyQ - status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ); - EnetAppUtils_assert(status == ENET_SOK); - - // Reload DMA with a new rx free queue as fast as possible - reloadDmaRxPktQ(EnetQueue_getQCount(&rxReadyQ)); - - rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ); + rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_); while(rxPktInfo != nullptr) { @@ -164,7 +175,7 @@ void free_rtos::EthRxFlow::rxProcessPktTask() EnetQueue_enq(&rx_free_pktq_, &rxPktInfo->node); /// ��������� ��������� ���� �� ������� - rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ); + rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_); /// ����������� ������� �������� ������� ++rx_pkt_counter_; diff --git a/components/free_rtos/ethernet/eth_rx_flow.hpp b/components/free_rtos/ethernet/eth_rx_flow.hpp index 0da97aa..b61917e 100644 --- a/components/free_rtos/ethernet/eth_rx_flow.hpp +++ b/components/free_rtos/ethernet/eth_rx_flow.hpp @@ -50,7 +50,7 @@ private: e_signalTotal }; - static constexpr e_signalRxPkt_timeout_ticks_ = 1500; + static constexpr uint32_t e_signalRxPkt_timeout_ticks_ = SystemP_WAIT_FOREVER; uint32_t id_; /// ������������� ������ bool open_; /// ���� ����, ��� dma ����� ��� ������ @@ -70,6 +70,7 @@ private: uint32_t rx_flow_idx_; EnetDma_RxChHandle dma_handle_; EnetDma_PktQ rx_free_pktq_; + EnetDma_PktQ rx_ready_pktq_; bool passive_mode_; /// ��������� �����, ������ �����������, �� �� ���������� � ���� ��������� };