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(); ///������� ��������� �������� �������