dev(SF-60): Незначительные доработки

This commit is contained in:
algin 2023-10-27 13:20:33 +03:00
parent 53229dbfa7
commit 75a0d57eb4
3 changed files with 25 additions and 46 deletions

View File

@ -53,7 +53,7 @@ free_rtos::EthRxFlow::EthRxFlow(TEthFrameMacAddr& mac_addr, EthStackIface& eth_s
EnetQueue_initQ(&rx_free_pktq_); EnetQueue_initQ(&rx_free_pktq_);
} }
void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv) void free_rtos::EthRxFlow::initRxFreePktQ(void * appPriv, EnetDma_PktQ * p_packet_queue, uint32_t qCount)
{ {
EnetDma_PktQ rxReadyQ; EnetDma_PktQ rxReadyQ;
EnetDma_Pkt *pPktInfo; EnetDma_Pkt *pPktInfo;
@ -69,11 +69,12 @@ void free_rtos::EthRxFlow::initRxFreePktQ(uint32_t qCount, void * appPriv)
ENET_UTILS_SET_PKT_APP_STATE(&pPktInfo->pktState, ENET_PKTSTATE_APP_WITH_FREEQ); ENET_UTILS_SET_PKT_APP_STATE(&pPktInfo->pktState, ENET_PKTSTATE_APP_WITH_FREEQ);
EnetQueue_enq(&rx_free_pktq_, &pPktInfo->node); EnetQueue_enq(p_packet_queue, &pPktInfo->node);
} }
/* Retrieve any packets which are ready */ /* Retrieve any packets which are ready */
EnetQueue_initQ(&rxReadyQ); EnetQueue_initQ(&rxReadyQ);
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ); status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK); EnetAppUtils_assert(status == ENET_SOK);
@ -89,7 +90,7 @@ void free_rtos::EthRxFlow::submitFreeRxPkts(uint32_t qCount)
EnetQueue_initQ(&rxSubmitQ); EnetQueue_initQ(&rxSubmitQ);
while((rxPktInfo != nullptr) && (qCount > 0)) while((qCount > 0) && (rxPktInfo != nullptr))
{ {
EnetQueue_enq(&rxSubmitQ, &rxPktInfo->node); EnetQueue_enq(&rxSubmitQ, &rxPktInfo->node);
@ -102,22 +103,12 @@ void free_rtos::EthRxFlow::submitFreeRxPkts(uint32_t qCount)
ENET_PKTSTATE_APP_WITH_DRIVER); ENET_PKTSTATE_APP_WITH_DRIVER);
status = EnetDma_submitRxPktQ(dma_handle_, &rxSubmitQ); status = EnetDma_submitRxPktQ(dma_handle_, &rxSubmitQ);
EnetAppUtils_assert(status == ENET_SOK);
if(status != ENET_SOK) {
EnetAppUtils_print("rx_flow %u: failed to reload rx dma flow\r\n", id_);
EnetAppUtils_assert(status == ENET_SOK);
return;
}
qCount = EnetQueue_getQCount(&rxSubmitQ); qCount = EnetQueue_getQCount(&rxSubmitQ);
/* Assert here, as during init, the number of DMA descriptors should be equal to /* Assert here, as during init, the number of DMA descriptors should be equal to
* the number of free Ethernet buffers available with app */ * the number of free Ethernet buffers available with app */
if(qCount != 0U) { EnetAppUtils_assert(qCount == 0U);
EnetAppUtils_print("rx_flow %u: number of DMA descriptors should be equal to the number of free Ethernet buffers\r\n", id_);
EnetAppUtils_assert(qCount == 0U);
}
} }
void free_rtos::EthRxFlow::rxProcessPktTask() void free_rtos::EthRxFlow::rxProcessPktTask()
@ -132,19 +123,16 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
status = sem_[e_signalRxPkt].pend(); status = sem_[e_signalRxPkt].pend();
if(status != SystemP_SUCCESS) {
continue;
}
do { do {
EnetDma_PktQ rxFreeQ;
EnetQueue_initQ(&rxFreeQ);
status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ); status = EnetDma_retrieveRxPktQ(dma_handle_, &rxReadyQ);
EnetAppUtils_assert(status == ENET_SOK); EnetAppUtils_assert(status == ENET_SOK);
readyQCount = EnetQueue_getQCount(&rxReadyQ); readyQCount = EnetQueue_getQCount(&rxReadyQ);
EnetAppUtils_assert(readyQCount != 0);
if(readyQCount == 0) {
break;
}
// Reload DMA with a new rx free queue as fast as possible // Reload DMA with a new rx free queue as fast as possible
submitFreeRxPkts(readyQCount); submitFreeRxPkts(readyQCount);
@ -159,17 +147,16 @@ void free_rtos::EthRxFlow::rxProcessPktTask()
} }
//} //}
EnetDma_checkPktState(&rxPktInfo->pktState, EnetQueue_enq(&rxFreeQ, &rxPktInfo->node);
ENET_PKTSTATE_MODULE_APP,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
EnetQueue_enq(&rx_free_pktq_, &rxPktInfo->node);
rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ); rxPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&rxReadyQ);
++rx_pkt_counter_;
} }
EnetAppUtils_validatePacketState(&rxFreeQ,
ENET_PKTSTATE_APP_WITH_DRIVER,
ENET_PKTSTATE_APP_WITH_FREEQ);
EnetQueue_append(&rx_free_pktq_, &rxFreeQ);
} while(readyQCount > 0); } while(readyQCount > 0);
} }
} }
@ -181,8 +168,6 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t
EnetAppUtils_print("rx_flow %u: opening flow...\r\n", id); EnetAppUtils_print("rx_flow %u: opening flow...\r\n", id);
rx_pkt_counter_ = 0;
if (open_) { if (open_) {
EnetAppUtils_print("rx_flow %u: rx flow is already open. Do nothing.\r\n", id_); EnetAppUtils_print("rx_flow %u: rx flow is already open. Do nothing.\r\n", id_);
return true; return true;
@ -230,7 +215,7 @@ bool free_rtos::EthRxFlow::open(uint32_t id, int32_t enetDmaRxChId, UBaseType_t
} }
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
initRxFreePktQ(ENET_SYSCFG_TOTAL_NUM_RX_PKT/2, this); initRxFreePktQ(this, &rx_free_pktq_, ENET_SYSCFG_TOTAL_NUM_RX_PKT/2);
submitFreeRxPkts(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4); submitFreeRxPkts(ENET_SYSCFG_TOTAL_NUM_RX_PKT/4);
open_ = true; open_ = true;

View File

@ -40,7 +40,7 @@ private:
friend void rxTaskHandler(void *appData); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> friend void rxTaskHandler(void *appData); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void initRxFreePktQ(uint32_t qCount, void * appPriv); void initRxFreePktQ(void * appPriv, EnetDma_PktQ * p_packet_queue, uint32_t qCount);
void submitFreeRxPkts(uint32_t qCount); void submitFreeRxPkts(uint32_t qCount);
void rxProcessPktTask(); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void rxProcessPktTask(); ///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@ -60,11 +60,8 @@ private:
TEthFrameMacAddr& mac_addr_; /// mac <20><><EFBFBD><EFBFBD><EFBFBD> TEthFrameMacAddr& mac_addr_; /// mac <20><><EFBFBD><EFBFBD><EFBFBD>
uint32_t rx_pkt_counter_;
EthStackIface& eth_stack_; EthStackIface& eth_stack_;
///------------------------------------
uint32_t rx_start_flow_idx_; uint32_t rx_start_flow_idx_;
uint32_t rx_flow_idx_; uint32_t rx_flow_idx_;
EnetDma_RxChHandle dma_handle_; EnetDma_RxChHandle dma_handle_;

View File

@ -26,16 +26,13 @@
/** /**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p_packet_queue * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p_packet_queue
*/ */
static void eth_initTxFreePktQ(void * appPriv, EnetDma_PktQ * p_packet_queue) static void eth_initTxFreePktQ(void * appPriv, EnetDma_PktQ * p_packet_queue, uint32_t qCount)
{ {
EnetDma_Pkt *pPktInfo; EnetDma_Pkt *pPktInfo;
uint32_t i; uint32_t i;
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int i_max = (ENET_SYSCFG_TOTAL_NUM_TX_PKT);
/* Initialize TX EthPkts and queue them to txFreePktInfoQ */ /* Initialize TX EthPkts and queue them to txFreePktInfoQ */
for (i = 0U; i < i_max; i++) for (i = 0U; i < qCount; i++)
{ {
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPktInfo = EnetMem_allocEthPkt(appPriv, pPktInfo = EnetMem_allocEthPkt(appPriv,
@ -125,7 +122,7 @@ bool free_rtos::EthTxFlow::open(uint32_t id, int32_t enetDmaTxChId)
dma_handle_ = txChInfo.hTxCh; dma_handle_ = txChInfo.hTxCh;
EnetAppUtils_assert(txChInfo.useGlobalEvt == true); EnetAppUtils_assert(txChInfo.useGlobalEvt == true);
EnetAppUtils_assert(txChInfo.maxNumTxPkts >= (ENET_SYSCFG_TOTAL_NUM_TX_PKT)); EnetAppUtils_assert(txChInfo.maxNumTxPkts >= ENET_SYSCFG_TOTAL_NUM_TX_PKT);
if (dma_handle_ == nullptr) if (dma_handle_ == nullptr)
{ {
@ -134,7 +131,7 @@ bool free_rtos::EthTxFlow::open(uint32_t id, int32_t enetDmaTxChId)
return false; return false;
} }
eth_initTxFreePktQ(this, &tx_free_pktq_); eth_initTxFreePktQ(this, &tx_free_pktq_, ENET_SYSCFG_TOTAL_NUM_TX_PKT);
open_= true; open_= true;