2023-05-03 14:01:32 +03:00
/*
* eth_tx_flow . cpp
*
2023-06-08 12:27:49 +03:00
* Created on : 7 <EFBFBD> <EFBFBD> <EFBFBD> . 2023 <EFBFBD> .
2023-05-03 14:01:32 +03:00
* Author : sychev
*/
2023-06-26 18:58:31 +03:00
# include "ethernet/eth_tx_flow.hpp"
2023-05-03 14:01:32 +03:00
# include <cstring>
# include <networking/enet/core/include/core/enet_soc.h>
# include <networking/enet/core/include/core/enet_queue.h>
# include <networking/enet/utils/include/enet_board.h>
# include <networking/enet/utils/include/enet_appmemutils.h>
# include <networking/enet/utils/include/enet_appmemutils_cfg.h>
# include <networking/enet/utils/include/enet_apputils.h>
/*----------------------------------------------------------------------*/
/**
2023-06-08 12:27:49 +03:00
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> sysconfig .
* <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> < build_name > / syscfg
2023-05-03 14:01:32 +03:00
*/
# include "ti_enet_config.h"
/*----------------------------------------------------------------------*/
/**
2023-06-08 12:27:49 +03:00
* <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
2023-05-03 14:01:32 +03:00
*/
static void eth_initTxFreePktQ ( void * appPriv , EnetDma_PktQ * p_packet_queue )
{
EnetDma_Pkt * pPktInfo ;
uint32_t i ;
2023-06-08 12:27:49 +03:00
/// <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>
2023-05-03 14:01:32 +03:00
int i_max = ( ENET_SYSCFG_TOTAL_NUM_TX_PKT / 2 ) ;
/* Initialize TX EthPkts and queue them to txFreePktInfoQ */
for ( i = 0U ; i < i_max ; i + + )
{
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
pPktInfo = EnetMem_allocEthPkt ( appPriv ,
ENET_MEM_LARGE_POOL_PKT_SIZE ,
ENETDMA_CACHELINE_ALIGNMENT ) ;
EnetAppUtils_assert ( pPktInfo ! = NULL ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
ENET_UTILS_SET_PKT_APP_STATE ( & pPktInfo - > pktState , ENET_PKTSTATE_APP_WITH_FREEQ ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> p_packet_queue
2023-05-03 14:01:32 +03:00
EnetQueue_enq ( p_packet_queue , & pPktInfo - > node ) ;
}
EnetAppUtils_print ( " initQs() txFreePktInfoQ initialized with %d pkts \r \n " ,
EnetQueue_getQCount ( p_packet_queue ) ) ;
}
static uint32_t eth_retrieveFreeTxPkts ( EnetDma_TxChHandle * p_handle , EnetDma_PktQ * p_queque )
{
EnetDma_PktQ txFreeQ ;
EnetDma_Pkt * pktInfo ;
uint32_t txFreeQCnt = 0U ;
int32_t status ;
EnetQueue_initQ ( & txFreeQ ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
status = EnetDma_retrieveTxPktQ ( * p_handle , & txFreeQ ) ;
if ( status = = ENET_SOK )
{
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
txFreeQCnt = EnetQueue_getQCount ( & txFreeQ ) ;
pktInfo = ( EnetDma_Pkt * ) EnetQueue_deq ( & txFreeQ ) ;
while ( NULL ! = pktInfo )
{
EnetDma_checkPktState ( & pktInfo - > pktState ,
ENET_PKTSTATE_MODULE_APP ,
ENET_PKTSTATE_APP_WITH_DRIVER ,
ENET_PKTSTATE_APP_WITH_FREEQ ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> txFreePktInfoQ
2023-05-03 14:01:32 +03:00
EnetQueue_enq ( p_queque , & pktInfo - > node ) ;
2023-06-08 12:27:49 +03:00
pktInfo = ( EnetDma_Pkt * ) EnetQueue_deq ( & txFreeQ ) ; /// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
}
}
else
{
EnetAppUtils_print ( " retrieveFreeTxPkts() failed to retrieve pkts: %d \r \n " , status ) ;
}
2023-06-08 12:27:49 +03:00
return txFreeQCnt ; /// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
}
free_rtos : : EthTxFlow : : EthTxFlow ( ) :
id_ { 0 } ,
open_ { false } ,
tx_ch_num_ { 0 }
{
EnetQueue_initQ ( & tx_free_pktq_ ) ;
}
bool free_rtos : : EthTxFlow : : open ( uint32_t id , int32_t enetDmaTxChId )
{
if ( id > = e_ethMacTotal ) {
return false ;
}
EnetApp_GetDmaHandleInArgs txInArgs ;
EnetApp_GetTxDmaHandleOutArgs txChInfo ;
EnetAppUtils_print ( " tx_flow %u: opening flow... \r \n " , id ) ;
port_data_ [ id ] . tx_pkt_counter = 0 ;
if ( open_ ) {
EnetAppUtils_print ( " tx_flow %u: tx flow is already open. Do nothing. \r \n " , id_ ) ;
return true ;
}
/* Open the TX channel */
txInArgs . notifyCb = nullptr ;
txInArgs . cbArg = nullptr ;
EnetApp_getTxDmaHandle ( enetDmaTxChId , & txInArgs , & txChInfo ) ;
tx_ch_num_ = txChInfo . txChNum ;
dma_handle_ = txChInfo . hTxCh ;
EnetAppUtils_assert ( txChInfo . useGlobalEvt = = true ) ;
EnetAppUtils_assert ( txChInfo . maxNumTxPkts > = ( ENET_SYSCFG_TOTAL_NUM_TX_PKT / 2U ) ) ;
if ( dma_handle_ = = nullptr )
{
EnetAppUtils_print ( " tx_flow %u: failed to open tx dma flow \r \n " , id_ ) ;
EnetAppUtils_assert ( dma_handle_ ! = nullptr ) ;
return false ;
}
eth_initTxFreePktQ ( this , & tx_free_pktq_ ) ;
open_ = true ;
EnetAppUtils_print ( " tx_flow %u: tx flow open successfully \r \n " , id_ ) ;
return true ;
}
void free_rtos : : EthTxFlow : : enable ( TEthMacPorts port_id ) {
if ( port_id > = e_ethMacTotal ) {
return ;
}
port_data_ [ port_id ] . tx_enable = true ;
}
void free_rtos : : EthTxFlow : : disable ( TEthMacPorts port_id ) {
if ( port_id > = e_ethMacTotal ) {
return ;
}
port_data_ [ port_id ] . tx_enable = false ;
}
bool free_rtos : : EthTxFlow : : send ( TEthMacPorts port_id , uint8_t * p_data , uint32_t len )
{
if ( port_id > = e_ethMacTotal ) {
return false ;
}
if ( ! port_data_ [ port_id ] . tx_enable ) {
return false ;
}
EnetDma_PktQ txSubmitQ ;
EnetDma_Pkt * txPktInfo ;
int32_t status ;
/*
2023-06-08 12:27:49 +03:00
* <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> enet <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> txFreePktInfoQ
2023-05-03 14:01:32 +03:00
*/
eth_retrieveFreeTxPkts ( & dma_handle_ , & tx_free_pktq_ ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> txSubmitQ
2023-05-03 14:01:32 +03:00
EnetQueue_initQ ( & txSubmitQ ) ;
2023-06-08 12:27:49 +03:00
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> TX Eth */
2023-05-03 14:01:32 +03:00
txPktInfo = ( EnetDma_Pkt * ) EnetQueue_deq ( & tx_free_pktq_ ) ;
if ( txPktInfo ! = NULL )
{
2023-06-08 12:27:49 +03:00
///<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
memcpy ( txPktInfo - > sgList . list [ 0 ] . bufPtr , p_data , len ) ;
txPktInfo - > sgList . list [ 0 ] . segmentFilledLen = len ;
txPktInfo - > sgList . numScatterSegments = 1 ;
txPktInfo - > chkSumInfo = 0U ;
txPktInfo - > appPriv = nullptr ;
txPktInfo - > tsInfo . txPktSeqId = 0 ;
2023-06-08 12:27:49 +03:00
txPktInfo - > txPktTc = 0 ; /// Traffic class <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> IPv6
2023-05-03 14:01:32 +03:00
txPktInfo - > tsInfo . enableHostTxTs = false ;
txPktInfo - > txPortNum = ( Enet_MacPort ) port_id ;
EnetDma_checkPktState ( & txPktInfo - > pktState ,
ENET_PKTSTATE_MODULE_APP ,
ENET_PKTSTATE_APP_WITH_FREEQ ,
ENET_PKTSTATE_APP_WITH_DRIVER ) ;
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> txPktInfo <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> txSubmitQ
2023-05-03 14:01:32 +03:00
EnetQueue_enq ( & txSubmitQ , & txPktInfo - > node ) ;
}
else
{
EnetAppUtils_print ( " tx_flow %u: Drop due to TX pkt not available \r \n " , id_ ) ;
return false ;
}
2023-06-08 12:27:49 +03:00
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> DMA
2023-05-03 14:01:32 +03:00
status = EnetDma_submitTxPktQ ( dma_handle_ , & txSubmitQ ) ;
if ( status ! = ENET_SOK )
{
EnetAppUtils_print ( " tx_flow %u: Failed to submit TX pkt queue: %d \r \n " , id_ , status ) ;
return false ;
}
2023-06-08 12:27:49 +03:00
+ + port_data_ [ port_id ] . tx_pkt_counter ; /// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2023-05-03 14:01:32 +03:00
return true ;
}
2023-06-08 12:27:49 +03:00
bool free_rtos : : EthTxFlow : : send ( TEthMacPorts port_id , Handler * handler , uint32_t numScatterSegments )
{
if ( port_id > = e_ethMacTotal ) {
return false ;
}
if ( ! port_data_ [ port_id ] . tx_enable ) {
return false ;
}
EnetDma_PktQ txSubmitQ ;
EnetDma_Pkt * txPktInfo ;
int32_t status ;
uint32_t len ;
eth_retrieveFreeTxPkts ( & dma_handle_ , & tx_free_pktq_ ) ;
EnetQueue_initQ ( & txSubmitQ ) ;
txPktInfo = ( EnetDma_Pkt * ) EnetQueue_deq ( & tx_free_pktq_ ) ;
if ( txPktInfo ! = NULL )
{
for ( size_t scatter_segment = 0 ; scatter_segment < numScatterSegments ; scatter_segment + + )
{
len = handler - > Sender ( txPktInfo - > sgList . list [ scatter_segment ] . bufPtr , scatter_segment ) ;
txPktInfo - > sgList . list [ scatter_segment ] . segmentFilledLen = len ;
}
txPktInfo - > sgList . numScatterSegments = numScatterSegments ;
txPktInfo - > chkSumInfo = 0U ;
txPktInfo - > appPriv = nullptr ;
txPktInfo - > tsInfo . txPktSeqId = 0 ;
txPktInfo - > txPktTc = 0 ; /// Traffic class <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> IPv6
txPktInfo - > tsInfo . enableHostTxTs = false ;
txPktInfo - > txPortNum = ( Enet_MacPort ) port_id ;
EnetDma_checkPktState ( & txPktInfo - > pktState ,
ENET_PKTSTATE_MODULE_APP ,
ENET_PKTSTATE_APP_WITH_FREEQ ,
ENET_PKTSTATE_APP_WITH_DRIVER ) ;
EnetQueue_enq ( & txSubmitQ , & txPktInfo - > node ) ;
}
else
{
EnetAppUtils_print ( " tx_flow %u: Drop due to TX pkt not available \r \n " , id_ ) ;
return false ;
}
2023-05-03 14:01:32 +03:00
2023-06-08 12:27:49 +03:00
status = EnetDma_submitTxPktQ ( dma_handle_ , & txSubmitQ ) ;
if ( status ! = ENET_SOK )
{
EnetAppUtils_print ( " tx_flow %u: Failed to submit TX pkt queue: %d \r \n " , id_ , status ) ;
return false ;
}
+ + port_data_ [ port_id ] . tx_pkt_counter ; /// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
return true ;
}