openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

commit b7a10731712b3dda82ab41ae85b3a38e2c5944eb
parent 4f0dda7856f3ce38e57a3f648426d4387fbf6e5c
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date:   Tue, 29 Jan 2019 14:30:30 -0800

SDK-165760: With this commit customers will be able to use bcm_tx_array with ...

Devices: 56980_A0,56980_B0
Module: tx

Symptom:
bcm_tx_array() fails with "bcm_tx: Could not set up or add pkt to DV"
(memory leaks) when continuous DMA enabled.

With this commit customers will be able to use bcm_tx_array with
continuous DMA mode.

Diffstat:
Msdk-6.5.16/src/bcm/common/tx.c | 41++++++++++++++++++++++++++---------------
Msdk-6.5.16/src/soc/common/dma.c | 2+-
2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/sdk-6.5.16/src/bcm/common/tx.c b/sdk-6.5.16/src/bcm/common/tx.c @@ -5252,9 +5252,15 @@ _tx_pkt_desc_add(int unit, bcm_pkt_t *pkt, dv_t *dv, int pkt_idx) #endif - pkt->tx_header = NULL; - if (soc_feature(unit, soc_feature_cmicx) && (pkt_hg_hdr != NULL)) { + if (NULL != pkt->tx_header) { + LOG_ERROR(BSL_LS_BCM_TX, + (BSL_META_U(unit, + "_tx_pkt_desc_add: Cannot re-allocate mem to" + " tx_header as Pkt might me in-flight!!!\n"))); + return BCM_E_MEMORY; + } + if ((pkt->_higig[7] & BCM_TX_EXT_HG_HDR) && !SOC_IS_TOMAHAWK3(unit)) { pkt->tx_header = soc_cm_salloc(unit, sizeof(pkt->_higig) + sizeof(pkt->_ext_higig), "tx_header"); if (pkt->tx_header == NULL) { @@ -5326,6 +5332,8 @@ _tx_pkt_desc_add(int unit, bcm_pkt_t *pkt, dv_t *dv, int pkt_idx) if (bsl_check(bslLayerSoc, bslSourceTx, bslSeverityVerbose, unit)) { soc_dma_higig_dump(unit, "TX Header ", (uint8 *)pkt->tx_header, sizeof(pkt->_higig), 0, NULL); } + } else { + pkt->tx_header = NULL; } #ifdef BCM_XGS_SUPPORT @@ -5996,6 +6004,22 @@ _bcm_tx_callback_thread(void *param) STATIC void _bcm_tx_desc_done_cb(int unit, dv_t *dv, dcb_t *dcb) { + if (soc_feature(unit, soc_feature_cmicx)) { + soc_stat_t *stat = &SOC_CONTROL(unit)->stat; + tx_dv_info_t *dv_info; + int i; + + dv_info = TX_INFO(dv); + + for (i = 0; i < dv_info->pkt_count; ++i) { + if (dv_info->pkt[i] && dv_info->pkt[i]->tx_header) { + stat->dma_tbyt -= sizeof(dv_info->pkt[i]->_higig); + soc_cm_sfree(unit, dv_info->pkt[i]->tx_header); + dv_info->pkt[i]->tx_header = NULL; + } + } + } + if (BCM_SUCCESS(_bcm_tx_cb_intr_enabled())) { _bcm_tx_desc_done(unit, dv, dcb); } else { @@ -6047,19 +6071,6 @@ _bcm_tx_desc_done_cb(int unit, dv_t *dv, dcb_t *dcb) STATIC void _bcm_tx_reload_done_cb(int unit, dv_t *dv) { - if (soc_feature(unit, soc_feature_cmicx)) { - soc_stat_t *stat = &SOC_CONTROL(unit)->stat; - bcm_pkt_t *pkt; - - pkt = (bcm_pkt_t *)TX_INFO_CUR_PKT(dv); - - if (pkt && pkt->tx_header) { - stat->dma_tbyt -= sizeof(pkt->_higig); - soc_cm_sfree(unit, pkt->tx_header); - pkt->tx_header = NULL; - } - } - if (BCM_SUCCESS(_bcm_tx_cb_intr_enabled())) { _bcm_tx_reload_done(unit, dv); } else { diff --git a/sdk-6.5.16/src/soc/common/dma.c b/sdk-6.5.16/src/soc/common/dma.c @@ -3712,13 +3712,13 @@ STATIC void soc_dma_wait_desc_done(int unit, dv_t *dv_chain, dcb_t *dcb) { COMPILER_REFERENCE(unit); - sal_sem_give((sal_sem_t)dv_chain->dv_sem); if (SOC_DMA_MODE(unit) == SOC_DMA_MODE_CONTINUOUS) { if (dv_chain->dv_done_desc_subs != NULL) { dv_chain->dv_done_desc_subs(unit, dv_chain, NULL); } } + sal_sem_give((sal_sem_t)dv_chain->dv_sem); } /*