From 66ae172d07912373ba5597757506a1a248e3dc15 Mon Sep 17 00:00:00 2001 From: algin Date: Tue, 26 Sep 2023 16:29:18 +0300 Subject: [PATCH] =?UTF-8?q?fix(UML-1780):=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=20=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=B2=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=20=D0=BF=D1=80=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/free_rtos/ethernet/eth.cpp | 6 -- components/free_rtos/ethernet/eth_rx_flow.cpp | 74 ++++++++++++++++--- components/free_rtos/ethernet/eth_rx_flow.hpp | 2 +- 3 files changed, 63 insertions(+), 19 deletions(-) diff --git a/components/free_rtos/ethernet/eth.cpp b/components/free_rtos/ethernet/eth.cpp index a0b0830..7e7df87 100644 --- a/components/free_rtos/ethernet/eth.cpp +++ b/components/free_rtos/ethernet/eth.cpp @@ -170,12 +170,6 @@ void free_rtos::Eth::link_task() { for (int i = 0; i < macPortNum_; ++i) { - if(linkUp_[i] == true) { - ClockP_usleep(100000); - - continue; - } - macPort = macPort_[i]; linkUp = false; diff --git a/components/free_rtos/ethernet/eth_rx_flow.cpp b/components/free_rtos/ethernet/eth_rx_flow.cpp index 8428b8b..3bdca3c 100644 --- a/components/free_rtos/ethernet/eth_rx_flow.cpp +++ b/components/free_rtos/ethernet/eth_rx_flow.cpp @@ -28,27 +28,61 @@ using namespace free_rtos; void free_rtos::rxIsrHandler(void *appData) { EthRxFlow * rx_flow = (EthRxFlow *)appData; + EnetDma_Pkt* rxPktInfo; 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); + if(rx_flow == nullptr) { + return; + } - readyQCount = EnetQueue_getQCount(&rxReadyQ); + status = EnetDma_retrieveRxPktQ(rx_flow->dma_handle_, &rxReadyQ); + EnetAppUtils_assert(status == ENET_SOK); - if(readyQCount == 0) { - return; + readyQCount = EnetQueue_getQCount(&rxReadyQ); + + if(readyQCount == 0) { + return; + } + + // Reload DMA with a new rx free queue as fast as possible + rx_flow->submitFreeRxPkts(readyQCount); + + //EnetQueue_append(&rx_flow->rx_ready_pktq_, &rxReadyQ); + + //rx_flow->sem_[EthRxFlow::e_signalRxPkt].post(); + + rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ); + + while(rxPktInfo != nullptr) + { + /// � ��������� ������ �������� ������ �� ������������ + if (!rx_flow->passive_mode_) + { + /// � ����� ������ ����� ���� ��������� ��������� + for (int j = 0 ; j < rxPktInfo->sgList.numScatterSegments; ++j) + { + rx_flow->eth_stack_.rx_handler(rxPktInfo->sgList.list[j].bufPtr, rxPktInfo->sgList.list[j].segmentFilledLen); + } } - // Reload DMA with a new rx free queue as fast as possible - rx_flow->reloadDmaRxPktQ(readyQCount); + /// �������� ��������� ������ �� ��������. ����� ����������� � ������������� ����� ��������. + EnetDma_checkPktState(&rxPktInfo->pktState, + ENET_PKTSTATE_MODULE_APP, + ENET_PKTSTATE_APP_WITH_DRIVER, + ENET_PKTSTATE_APP_WITH_FREEQ); - EnetQueue_append(&rx_flow->rx_ready_pktq_, &rxReadyQ); + /// ������ ����� � ������� ��������� ������� + EnetQueue_enq(&rx_flow->rx_free_pktq_, &rxPktInfo->node); - rx_flow->sem_[EthRxFlow::e_signalRxPkt].post(); + /// ��������� ��������� ���� �� ������� + rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ); + + /// ����������� ������� �������� ������� + ++rx_flow->rx_pkt_counter_; } + } void free_rtos::rxTaskHandler(void *appData) @@ -96,7 +130,7 @@ void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv) EnetAppUtils_assert(EnetQueue_getQCount(&rxReadyQ) == 0U); } -void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount) +void free_rtos::EthRxFlow::submitFreeRxPkts(uint32_t qCount) { EnetDma_PktQ rxSubmitQ; EnetDma_Pkt* rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_free_pktq_); @@ -138,6 +172,8 @@ void free_rtos::EthRxFlow::reloadDmaRxPktQ(uint32_t qCount) void free_rtos::EthRxFlow::rxProcessPktTask() { EnetDma_Pkt* rxPktInfo; /// ����� � ������� + EnetDma_PktQ rxReadyQ; + uint32_t readyQCount; int32_t status; while(1) @@ -150,7 +186,21 @@ void free_rtos::EthRxFlow::rxProcessPktTask() continue; } +/* + status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ); + EnetAppUtils_assert(status == ENET_SOK); + readyQCount = EnetQueue_getQCount(&rxReadyQ); + + if(readyQCount == 0) { + continue; + } + + // Reload DMA with a new rx free queue as fast as possible + submitFreeRxPkts(readyQCount); + + EnetQueue_append(&rx_ready_pktq_, &rxReadyQ); +*/ rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rx_ready_pktq_); while(rxPktInfo != nullptr) @@ -240,7 +290,7 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t /// ������������� ������� ������� initRxFreePktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/2, this); - reloadDmaRxPktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4); + submitFreeRxPkts(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4); open_ = true; diff --git a/components/free_rtos/ethernet/eth_rx_flow.hpp b/components/free_rtos/ethernet/eth_rx_flow.hpp index b61917e..c2f2aca 100644 --- a/components/free_rtos/ethernet/eth_rx_flow.hpp +++ b/components/free_rtos/ethernet/eth_rx_flow.hpp @@ -40,7 +40,7 @@ private: friend void rxTaskHandler(void *appData); ///������ ��������� �������� ������� void initRxFreePktQ(uint32_t qCount, void * appPriv); - void reloadDmaRxPktQ(uint32_t qCount); + void submitFreeRxPkts(uint32_t qCount); void rxProcessPktTask(); ///������� ��������� �������� �������