/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
        used to endorse or promote products derived from this software without
        specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

******************************************************************************/

/******************************************************************************
**  FILE        : gponOnuPm.c                                                **
**                                                                           **
**  DESCRIPTION : This file implements ONU GPON Alarm and Statistics         **
**                functionality                                              **
*******************************************************************************
*                                                                             *
*  MODIFICATION HISTORY:                                                      *
*                                                                             *
*   29Oct06  Oren Ben Hayun   created                                         *
* =========================================================================== *
******************************************************************************/

/* Include Files
------------------------------------------------------------------------------*/
#include "gponOnuHeader.h"

/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_pon/core/gpon/gponOnuPm.c"

/* Global Variables
------------------------------------------------------------------------------*/
/* ONU GPON PM table */
S_GponPm    g_OnuGponPm;
S_PloamSwPm g_OnuGponSwPm;

#ifdef MV_GPON_PERFORMANCE_CHECK
S_GponPerformanceCheck g_GponPmCheck;
#endif /* MV_GPON_PERFORMANCE_CHECK */
extern spinlock_t onuPonIrqLock;

static S_apiGemPortPmConfigDb apiGemPortPmConfigDb;

/* Global functions
------------------------------------------------------------------------------*/
void       onuGponPmInPmInit(void);
MV_STATUS onuGponPmCountersAdd(void);
MV_STATUS onuGponRougeOnuCheck(void);

/******************************************************************************/
/* ========================================================================== */
/*                         Init Section                                       */
/* ========================================================================== */
/******************************************************************************/
#ifdef MV_GPON_PERFORMANCE_CHECK
MV_STATUS onuGponPmInit(void)
{
  MV_U32 index;

  for (index = 0; index < PON_MAX_PERFORMANCE; index++)
  {
    g_GponPmCheck.pmCheckNode[index].uSecCntStart = (MV_U32*)onuPonMemAlloc(256 * sizeof(MV_U32));
    if (g_GponPmCheck.pmCheckNode[index].uSecCntStart == NULL)
      return(MV_ERROR);

    g_GponPmCheck.pmCheckNode[index].uSecCntStop = (MV_U32*)onuPonMemAlloc(256 * sizeof(MV_U32));
    if (g_GponPmCheck.pmCheckNode[index].uSecCntStop == NULL)
      return(MV_ERROR);

    g_GponPmCheck.pmCheckNode[index].uSecCntIdx = 0;
  }

  return(MV_OK);
}
#endif /* MV_GPON_PERFORMANCE_CHECK */

/******************************************************************************/
/* ========================================================================== */
/*                         Statistics Section                                 */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponPmInPmInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init the onu gpon alarm table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponPmInPmInit(void)
{
  /* reset all counters */
  memset(&g_OnuGponPm,   0, sizeof(S_GponPm));
  memset(&g_OnuGponSwPm, 0, sizeof(S_PloamSwPm));
}

/*******************************************************************************
**
**  onuGponPmTimerPmHndl
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is called by the GPON PM timer and trigger the
**               GPON handler to execute PM functionality
**
**  PARAMETERS:  unsigned long data
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponPmTimerPmHndl(unsigned long data)
{
  unsigned long flags;

  spin_lock_irqsave(&onuPonIrqLock, flags);
  onuPonResourceTbl_s.onuPonPmTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE;
  spin_unlock_irqrestore(&onuPonIrqLock, flags);

  /* Call PM handler */
  onuGponPmTimerExpireHndl();

  spin_lock_irqsave(&onuPonIrqLock, flags);
  if ((onuPonResourceTbl_s.onuPonPmTimerId.onuPonTimerPeriodic) != 0)
    onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonPmTimerId));

  spin_unlock_irqrestore(&onuPonIrqLock, flags);
}

/*******************************************************************************
**
**  onuGponPmTimerExpireHndl
**  ____________________________________________________________________________
**
**  DESCRIPTION: This routine execute PM handler functionality
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponPmTimerExpireHndl(void)
{
  S_RxBip8Pm inBip8Pm;
  unsigned long flags;

  onuGponPonMngRandomDelayGen4SN_Equ();
  onuGponPmCountersAdd();
  onuGponPmRxBip8PmGet(&inBip8Pm);
  spin_lock_irqsave(&onuPonIrqLock, flags);
  onuGponBerPeriodPass(inBip8Pm.bip8);
  spin_unlock_irqrestore(&onuPonIrqLock, flags);
  onuGponRougeOnuCheck();
}

/*******************************************************************************
**
**  onuGponRougeOnuCheck
**  ____________________________________________________________________________
**
**  DESCRIPTION: This routine validate rouge ONU statistics values
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponRougeOnuCheck(void)
{
#ifndef PON_FPGA
  MV_STATUS status;
#endif /* PON_FPGA */
  MV_U32    txBurstEnCnt;

  onuGponPmTxBurstEnCntGet(&txBurstEnCnt);

  if (txBurstEnCnt >= GPON_BURST_THRESHOLD)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_PM_MODULE, "===========================\n");
    mvPonPrint(PON_PRINT_ERROR, PON_PM_MODULE, "== ROUGE ONU             ==\n");
    mvPonPrint(PON_PRINT_ERROR, PON_PM_MODULE, "== Shutting Down the XVR ==\n");
    mvPonPrint(PON_PRINT_ERROR, PON_PM_MODULE, "===========================\n");

#ifndef PON_FPGA
    /* Set the output enable of the GP_BEN IO to Input */
    status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_INPUT, 0);
    if (status != MV_OK)
      return(status);
#endif /* PON_FPGA */
  }

  return(MV_OK);
}


/*******************************************************************************
**
**  ponOltPmOnuCountersAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: This routine read statistics values from ASIC to the database
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmCountersAdd(void)
{
	MV_U32  tempCounter1;
	MV_U32  tempCounter2;
	MV_U32  tempCounter3;
	MV_U32  tempCounter4;
	MV_U32  tcont;
	MV_BOOL exist;
	MV_STATUS status;

	/* BIP8 Counter */
	/* ============ */
	mvOnuGponMacBipStatusValueGet(&tempCounter1);
	g_OnuGponPm.rxBip8.bip8 += tempCounter1;

	/* Ploam Counters */
	/* ============== */
	mvOnuGponMacRxPloamLostCrcCounterGet(&tempCounter1);				 /* Error CRC */
	g_OnuGponPm.rxPloam.crcErrorPloamCounter += tempCounter1;
	mvOnuGponMacRxPloamLostFullCounterGet(&tempCounter1);				 /* Downstream lost due to full FIFO */
	g_OnuGponPm.rxPloam.fifoOverErrorPloamCounter += tempCounter1;
	mvOnuGponMacRxPloamRcvdIdleCounterGet(&tempCounter1);				 /* Downstream received idle */
	g_OnuGponPm.rxPloam.idlePloamCounter += tempCounter1;
	mvOnuGponMacRxPloamRcvdBroadCounterGet(&tempCounter1);				 /* Downstream received broadcast */
	g_OnuGponPm.rxPloam.receivedBroadcastPloamCounter += tempCounter1;
	mvOnuGponMacRxPloamRcvdOnuIdCounterGet(&tempCounter1);				 /* Downstream received ONU ID */
	g_OnuGponPm.rxPloam.receivedOnuIdPloamCounter += tempCounter1;

	/* BW MAP counters  */
	/* =============== */
	mvOnuGponMacRxBwMapAllocatrionsCounterGet(&tempCounter1, &tempCounter2, &tempCounter3, &tempCounter4);
	g_OnuGponPm.rxBwMap.allocCorrec += tempCounter1;				   /* Received allocations errors free */
	g_OnuGponPm.rxBwMap.allocUnCorrectableCrcErr += tempCounter2;	   /* Received allocations with uncorrectable CRC errors */
	g_OnuGponPm.rxBwMap.allocCorrectableCrcErr += tempCounter3;		   /* Received allocations with correctable CRC errors or errors free */
	g_OnuGponPm.rxBwMap.allocCrcErr += tempCounter4;				   /* Received allocations with CRC error */
	mvOnuGponMacRxBwMapTotalBwGet(&tempCounter1);						 /* Total received byte allocations */
	g_OnuGponPm.rxBwMap.totalReceivedAllocBytes += tempCounter1;

	/* PLEND unusable counter */
	/* ====================== */
	mvOnuGponMacInComingPlendCntGet(&tempCounter1);
	g_OnuGponPm.rxPlend.plend += tempCounter1;

	/* FEC Counters */
	/* ============ */
	mvOnuGponMacRxFecBytesCounterGet(&tempCounter1);					 /* Received bytes */
	g_OnuGponPm.rxFec.receivedBytes += tempCounter1;
	mvOnuGponMacRxFecCorrectCounterGet(&tempCounter1, &tempCounter2);
	g_OnuGponPm.rxFec.correctedBits += tempCounter2;				   /* Received corrected bits */
	g_OnuGponPm.rxFec.correctedBytes += tempCounter1;				   /* Received corrected bytes */
	mvOnuGponMacRxFecInorrectCounterGet(&tempCounter1, &tempCounter2);
	g_OnuGponPm.rxFec.receivedCodeWords += tempCounter2;			   /* Received code words */
	g_OnuGponPm.rxFec.uncorrectedCodeWords += tempCounter1;			   /* Received corrected code words */

	/* GEM Counters */
	/* ============ */
	mvOnuGponMacGemRcvdIdleGemFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedIdleGemFrames += tempCounter1;
	mvOnuGponMacGemRcvdValidGemFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedValidGemFrames += tempCounter1;
	mvOnuGponMacGemRcvdUndefGemFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedUndefinedGemFrames += tempCounter1;
	mvOnuGponMacGemRcvdOmciFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedOmciFrames += tempCounter1;
	mvOnuGponMacGemDropGemFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.droppedGemFrames += tempCounter1;
	mvOnuGponMacGemDropOmciFramesCounterGet(&tempCounter1);
	g_OnuGponPm.gem.droppedOmciFrames += tempCounter1;
	mvOnuGponMacGemRcvdGemFramesWithUncorrHecErrCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedGemFramesWithUncorrHecErr += tempCounter1;
	mvOnuGponMacGemRcvdGemFramesWithOneFixedHecErrCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedGemFramesWithOneFixedHecErr += tempCounter1;
	mvOnuGponMacGemRcvdGemFramesWithTwoFixedHecErrCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedGemFramesWithTwoFixedHecErr += tempCounter1;
	mvOnuGponMacGemRcvdValidGemFramesTotalByteCounterGet(&tempCounter1);
	g_OnuGponPm.gem.totalByteCountOfReceivedValidGemFrames += tempCounter1;
	mvOnuGponMacGemRcvdUndefGemFramesTotalByteCounterGet(&tempCounter1);
	g_OnuGponPm.gem.totalByteCountOfReceivedUndefinedGemFrames += tempCounter1;
	mvOnuGponMacGemReassembleMemoryFlushCounterGet(&tempCounter1);
	g_OnuGponPm.gem.gemReassembleMemoryFlush += tempCounter1;
	mvOnuGponMacGemSynchLostCounterGet(&tempCounter1);
	g_OnuGponPm.gem.gemSynchLost += tempCounter1;
	mvOnuGponMacGemRcvdEthFramesWithCorrFcsCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedEthFramesWithCorrFcs += tempCounter1;
	mvOnuGponMacGemRcvdEthFramesWithFcsErrCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedEthFramesWithFcsError += tempCounter1;
	mvOnuGponMacGemRcvdOmciFramesWithCorrCrcCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedOmciFramesWithCorrCrc += tempCounter1;
	mvOnuGponMacGemRcvdOmciFramesWithCrcErrCounterGet(&tempCounter1);
	g_OnuGponPm.gem.receivedOmciFramesWithCrcError += tempCounter1;

	/* Tx Counters */
	/* =========== */
	mvOnuGponMacTxGemPtiTypeOneFrameCounterGet(&tempCounter1);
	g_OnuGponPm.tx.transmittedGemPtiTypeOneFrames += tempCounter1;
	mvOnuGponMacTxGemPtiTypeZeroFrameCounterGet(&tempCounter1);
	g_OnuGponPm.tx.transmittedGemPtiTypeZeroFrames += tempCounter1;
	mvOnuGponMacTxIdleGemFramesCounterGet(&tempCounter1);
	g_OnuGponPm.tx.transmittedIdleGemFrames += tempCounter1;
	mvOnuGponMacTxTxEnableCounterGet(&tempCounter1);
	g_OnuGponPm.tx.transmittedTxEnableCount += tempCounter1;

	for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++) {
		status = onuGponDbBwTcontExist(tcont, &exist);
		if ((status == MV_OK) && (exist != MV_FALSE)) {
			mvOnuGponMacTxEthFramesTcontiCounterGet(tcont, &tempCounter1);
			g_OnuGponPm.tx.transmittedEthFramesViaTconti[tcont] += tempCounter1;
			mvOnuGponMacTxEthBytesTcontiCounterGet(tcont, &tempCounter1);
			g_OnuGponPm.tx.transmittedEthBytesViaTconti[tcont] += tempCounter1;
			mvOnuGponMacTxGemFramesTcontiCounterGet(tcont, &tempCounter1);
			g_OnuGponPm.tx.transmittedGemFramesViaTconti[tcont] += tempCounter1;
			mvOnuGponMacTxIdleGemFramesTcontiCounterGet(tcont, &tempCounter1);
			g_OnuGponPm.tx.transmittedIdleGemFramesViaTconti[tcont] += tempCounter1;
		}
	}

	/* Sw Counters */
	/* =========== */
	onuGponPmSwCountersUpdate(&g_OnuGponPm.rxPloam, &g_OnuGponPm.txPloam);

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxSwCountersAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function updates Rx Ploam message counters
**
**  PARAMETERS:  MV_U8 a_msgId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxSwCountersAdd(MV_U8 a_msgId)
{
  g_OnuGponSwPm.rxMsgTotalPloamCounter++;
  g_OnuGponSwPm.rxMsgIdPloamCounter[a_msgId]++;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmSwCountersUpdate
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function updates Rx Ploam message counters
**
**  PARAMETERS:  MV_U8 a_msgId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmSwCountersUpdate(S_RxPloamPm *rxPloamPm, S_TxPloamPm *txPloamPm)
{
  MV_U32 numOfMsgIdIndex;

  /* Rx PLOAM */
  rxPloamPm->rxMsgTotalPloamCounter = g_OnuGponSwPm.rxMsgTotalPloamCounter;

  for (numOfMsgIdIndex = ONU_GPON_DS_MSG_OVERHEAD;
       numOfMsgIdIndex <= ONU_GPON_DS_MSG_EXT_BURST_LEN;
       numOfMsgIdIndex++)
  {
    rxPloamPm->rxMsgIdPloamCounter[numOfMsgIdIndex] = g_OnuGponSwPm.rxMsgIdPloamCounter[numOfMsgIdIndex];
  }

  mvOnuGponMacTxSwCountersGet((void*)txPloamPm);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmFecPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Rx FEC counters
**
**  PARAMETERS:  S_RxFecPm *fecPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmFecPmGet(S_RxFecPm *fecPm)
{
  fecPm->receivedBytes        = g_OnuGponPm.rxFec.receivedBytes;
  fecPm->correctedBytes       = g_OnuGponPm.rxFec.correctedBytes;
  fecPm->correctedBits        = g_OnuGponPm.rxFec.correctedBits ;
  fecPm->receivedCodeWords    = g_OnuGponPm.rxFec.receivedCodeWords;
  fecPm->uncorrectedCodeWords = g_OnuGponPm.rxFec.uncorrectedCodeWords;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxPloamPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Rx PLOAM counters
**
**  PARAMETERS:  S_RxPloamPm *rxPloamPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxPloamPmGet(S_RxPloamPm *rxPloamPm)
{
  MV_U32 numOfMsgIdIndex;

  rxPloamPm->crcErrorPloamCounter          = g_OnuGponPm.rxPloam.crcErrorPloamCounter;
  rxPloamPm->receivedBroadcastPloamCounter = g_OnuGponPm.rxPloam.receivedBroadcastPloamCounter;
  rxPloamPm->receivedOnuIdPloamCounter     = g_OnuGponPm.rxPloam.receivedOnuIdPloamCounter;
  rxPloamPm->fifoOverErrorPloamCounter     = g_OnuGponPm.rxPloam.fifoOverErrorPloamCounter;
  rxPloamPm->idlePloamCounter              = g_OnuGponPm.rxPloam.idlePloamCounter;
  rxPloamPm->rxMsgTotalPloamCounter        = g_OnuGponPm.rxPloam.rxMsgTotalPloamCounter;

  for (numOfMsgIdIndex = 0 ;numOfMsgIdIndex <= ONU_GPON_DS_MSG_LAST;numOfMsgIdIndex++)
  {
    rxPloamPm->rxMsgIdPloamCounter[numOfMsgIdIndex] = g_OnuGponPm.rxPloam.rxMsgIdPloamCounter[numOfMsgIdIndex];
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmTxPloamPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Tx PLOAM counters
**
**  PARAMETERS:  S_TxPloamPm *txPloamPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmTxPloamPmGet(S_TxPloamPm *txPloamPm)
{
  MV_U32 numOfMsgIdIndex;

  txPloamPm->txMsgTotalPloamCounter = g_OnuGponPm.txPloam.txMsgTotalPloamCounter;

  for (numOfMsgIdIndex = 1; numOfMsgIdIndex <= ONU_GPON_US_MSG_LAST; numOfMsgIdIndex++ )
  {
    txPloamPm->txMsgIdPloamCounter[numOfMsgIdIndex] = g_OnuGponPm.txPloam.txMsgIdPloamCounter[numOfMsgIdIndex];

    txPloamPm->txErrMsgIdPloamCounter[numOfMsgIdIndex] = g_OnuGponPm.txPloam.txErrMsgIdPloamCounter[numOfMsgIdIndex];
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxBwMapCountersAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: This routine read BW MAP counters from ASIC to the database
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxBwMapCountersAdd(void)
{
  MV_U32  tempCounter1;
  MV_U32  tempCounter2;
  MV_U32  tempCounter3;
  MV_U32  tempCounter4;

  mvOnuGponMacRxBwMapAllocatrionsCounterGet(&tempCounter1, &tempCounter2, &tempCounter3, &tempCounter4);
  g_OnuGponPm.rxBwMap.allocCorrec              += tempCounter1;      /* Received allocations errors free */
  g_OnuGponPm.rxBwMap.allocUnCorrectableCrcErr += tempCounter2;      /* Received allocations with uncorrectable CRC errors */
  g_OnuGponPm.rxBwMap.allocCorrectableCrcErr   += tempCounter3;      /* Received allocations with correctable CRC errors or errors free */
  g_OnuGponPm.rxBwMap.allocCrcErr              += tempCounter4;      /* Received allocations with CRC error */
  mvOnuGponMacRxBwMapTotalBwGet(&tempCounter1);                     /* Total received byte allocations */
  g_OnuGponPm.rxBwMap.totalReceivedAllocBytes  += tempCounter1;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxBwMapPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Rx BW MAP counters
**
**  PARAMETERS:  S_RxPloamPm *rxPloamPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxBwMapPmGet(S_RxBwMapPm *rxBwMapPm)
{
  rxBwMapPm->allocCorrec              = g_OnuGponPm.rxBwMap.allocCorrec;
  rxBwMapPm->allocCorrectableCrcErr   = g_OnuGponPm.rxBwMap.allocCorrectableCrcErr;
  rxBwMapPm->allocCrcErr              = g_OnuGponPm.rxBwMap.allocCrcErr;
  rxBwMapPm->allocUnCorrectableCrcErr = g_OnuGponPm.rxBwMap.allocUnCorrectableCrcErr;
  rxBwMapPm->totalReceivedAllocBytes  = g_OnuGponPm.rxBwMap.totalReceivedAllocBytes;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxPlendPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Rx Plend counter
**
**  PARAMETERS:  S_RxPlendPm *rxPlendPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxPlendPmGet(S_RxPlendPm *rxPlendPm)
{
  rxPlendPm->plend = g_OnuGponPm.rxPlend.plend;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmRxBip8PmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Rx Bip8 counter
**
**  PARAMETERS:  S_RxBip8Pm *rxBip8Pm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmRxBip8PmGet(S_RxBip8Pm *rxBip8Pm)
{
  rxBip8Pm->bip8 = g_OnuGponPm.rxBip8.bip8;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmGemPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Gem pm counters
**
**  PARAMETERS:  S_GemPm *gemPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmGemPmGet(S_GemPm *gemPm)
{
  gemPm->receivedIdleGemFrames                       = g_OnuGponPm.gem.receivedIdleGemFrames;
  gemPm->receivedValidGemFrames                      = g_OnuGponPm.gem.receivedValidGemFrames;
  gemPm->receivedUndefinedGemFrames                  = g_OnuGponPm.gem.receivedUndefinedGemFrames;
  gemPm->receivedOmciFrames                          = g_OnuGponPm.gem.receivedOmciFrames;
  gemPm->droppedGemFrames                            = g_OnuGponPm.gem.droppedGemFrames;
  gemPm->droppedOmciFrames                           = g_OnuGponPm.gem.droppedOmciFrames;
  gemPm->receivedGemFramesWithUncorrHecErr           = g_OnuGponPm.gem.receivedGemFramesWithUncorrHecErr;
  gemPm->receivedGemFramesWithOneFixedHecErr         = g_OnuGponPm.gem.receivedGemFramesWithOneFixedHecErr;
  gemPm->receivedGemFramesWithTwoFixedHecErr         = g_OnuGponPm.gem.receivedGemFramesWithTwoFixedHecErr;
  gemPm->totalByteCountOfReceivedValidGemFrames      = g_OnuGponPm.gem.totalByteCountOfReceivedValidGemFrames;
  gemPm->totalByteCountOfReceivedUndefinedGemFrames  = g_OnuGponPm.gem.totalByteCountOfReceivedUndefinedGemFrames;
  gemPm->gemReassembleMemoryFlush                    = g_OnuGponPm.gem.gemReassembleMemoryFlush;
  gemPm->gemSynchLost                                = g_OnuGponPm.gem.gemSynchLost;
  gemPm->receivedEthFramesWithCorrFcs                = g_OnuGponPm.gem.receivedEthFramesWithCorrFcs;
  gemPm->receivedEthFramesWithFcsError               = g_OnuGponPm.gem.receivedEthFramesWithFcsError;
  gemPm->receivedOmciFramesWithCorrCrc               = g_OnuGponPm.gem.receivedOmciFramesWithCorrCrc;
  gemPm->receivedOmciFramesWithCrcError              = g_OnuGponPm.gem.receivedOmciFramesWithCrcError;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmTxPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Tx pm counters
**
**  PARAMETERS:  S_TxPm *txPm
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmTxPmGet(S_GponTxPm *txPm)
{
	MV_U32 tcont;
	MV_BOOL   exist;
	MV_STATUS status;

	txPm->transmittedGemPtiTypeOneFrames    = g_OnuGponPm.tx.transmittedGemPtiTypeOneFrames;
	txPm->transmittedGemPtiTypeZeroFrames   = g_OnuGponPm.tx.transmittedGemPtiTypeZeroFrames;
	txPm->transmittedIdleGemFrames          = g_OnuGponPm.tx.transmittedIdleGemFrames;
	txPm->transmittedTxEnableCount          = g_OnuGponPm.tx.transmittedTxEnableCount;

	for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++) {
		status = onuGponDbBwTcontExist(tcont, &exist);
		if ((status == MV_OK) && (exist != MV_FALSE)) {
			txPm->transmittedEthFramesViaTconti[tcont]     = g_OnuGponPm.tx.transmittedEthFramesViaTconti[tcont];
			txPm->transmittedEthBytesViaTconti[tcont]      = g_OnuGponPm.tx.transmittedEthBytesViaTconti[tcont];
			txPm->transmittedGemFramesViaTconti[tcont]     = g_OnuGponPm.tx.transmittedGemFramesViaTconti[tcont];
			txPm->transmittedIdleGemFramesViaTconti[tcont] = g_OnuGponPm.tx.transmittedIdleGemFramesViaTconti[tcont];
		}
	}

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmTxBurstEnCntGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The funtion return onu Tx burst enable counter
**
**  PARAMETERS:  unsigned int *txBurstEnCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponPmTxBurstEnCntGet(unsigned int *txBurstEnCnt)
{
  *txBurstEnCnt = g_OnuGponPm.tx.transmittedTxEnableCount;

  g_OnuGponPm.tx.transmittedTxEnableCount = 0;

  return(MV_OK);
}



/******************************************************************************/
/* ========================================================================== */
/*                         GEM Port PM Section                                */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponPmGemPortPmInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears GEM Port PM database
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     void
**
*******************************************************************************/
void onuGponPmGemPortPmInit(void)
{
  int       indx;

  for (indx = 0; indx < MAX_ENTRIES_GEMPORTPM_CONFIG_DB; indx++)
  {
    apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx].in_use = MV_FALSE;
  }

  if (asicOntMiscRegRead(mvAsicReg_RX_MIB_DEFAULT, &apiGemPortPmConfigDb.origRxMibDefaultReg, 0) != MV_OK)
  {
    printk("%s: asicOntMiscRegRead failed for mvAsicReg_RX_MIB_DEFAULT(%d)\n", __FUNCTION__, mvAsicReg_RX_MIB_DEFAULT);
  }
}


/*******************************************************************************
**
**  onuGponPmGemPortPmGetNumUsedEntries
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function counts the number of used GEM port entries in the DB
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     int
**
*******************************************************************************/
int onuGponPmGemPortPmGetNumUsedEntries(void)
{
  int       indx;
  int       usedEntries = 0;

  for (indx = 0; indx < MAX_ENTRIES_GEMPORTPM_CONFIG_DB; indx++)
  {
    if (apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx].in_use == MV_TRUE)
      usedEntries++;
  }
  return usedEntries;
}


/*******************************************************************************
**
**  onuGponPmGemPortPmStart
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function activates MIB Counter PM for a GEM port
**
**  PARAMETERS:  S_GponIoctlGemPortPmConfig *
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponPmGemPortPmStart(MV_U16 gemPort)
{
  MV_STATUS            rcode = MV_OK;
  int                  indx;
  S_apiGemPortPmConfig *apiGemPortPmConfig;
  S_apiGemPortPmConfig *tgtApiGemPortPmConfig = 0;
  int                  freeIndx;
  MV_U32               mibCtrlValue;

  // Does the GEM Port already appear in table
  for (indx = 0; indx < MAX_SUPPORTED_GEMPORTS_FOR_PM; indx++)
  {
    apiGemPortPmConfig = &apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx];
    if (apiGemPortPmConfig->in_use == MV_TRUE && apiGemPortPmConfig->gem_port == gemPort)
    {
        printk("%s: gemPort %d already in table (start)\n", __FUNCTION__, gemPort);
        return MV_ALREADY_EXIST;
    }
  }

  for (indx = 0; indx < MAX_SUPPORTED_GEMPORTS_FOR_PM; indx++)
  {
    apiGemPortPmConfig = &apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx];
    if (apiGemPortPmConfig->in_use == MV_FALSE)
    {
      tgtApiGemPortPmConfig = apiGemPortPmConfig;
      freeIndx              = indx;
      break;
    }
  }

  // Did we find a free entry
  if (tgtApiGemPortPmConfig == 0)
  {
      printk("%s: Table full. gemPort = %d (start)\n", __FUNCTION__, gemPort);
      return MV_NO_MORE;
  }

  if (onuGponPmGemPortPmGetNumUsedEntries() == 0)
  {
    if ((rcode = asicOntMiscRegRead(mvAsicReg_RX_MIB_DEFAULT, &apiGemPortPmConfigDb.origRxMibDefaultReg, 0)) != MV_OK)
    {
      printk("%s: asicOntMiscRegRead failed for mvAsicReg_RX_MIB_DEFAULT(%d)\n", __FUNCTION__, mvAsicReg_RX_MIB_DEFAULT);
      return rcode;
    }
    mibCtrlValue = MAKE_MIB_COUNTER_CONTROL(MIB_COUNTER_CONTROL_INVALID_BIT,0,0);
    if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_DEFAULT, mibCtrlValue, 0)) != MV_OK)
    {
      printk("%s: asicOntMiscRegWrite failed for mvAsicReg_RX_MIB_DEFAULT(%d)\n", __FUNCTION__, mvAsicReg_RX_MIB_DEFAULT);
      return rcode;
    }
  }

  mibCtrlValue = MAKE_MIB_COUNTER_CONTROL(MIB_COUNTER_CONTROL_VALID_BIT,freeIndx,gemPort);
  if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_CTRL, mibCtrlValue, indx)) != MV_OK)
  {
      printk("%s: asicOntMiscRegWrite failed for indx = %d (start)\n", __FUNCTION__, indx);
  }
  else
  {
    tgtApiGemPortPmConfig->gem_port    = gemPort;
    tgtApiGemPortPmConfig->counter_set = freeIndx;
    tgtApiGemPortPmConfig->in_use      = MV_TRUE;
  }
  return rcode;
}


/*******************************************************************************
**
**  onuGponPmGemPortPmStop
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function activates MIB Counter PM for a GEM port
**
**  PARAMETERS:  S_GponIoctlGemPortPmConfig *
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS  onuGponPmGemPortPmStop(MV_U16 gemPort)
{
  MV_STATUS            rcode = MV_OK;
  int                  indx;
  S_apiGemPortPmConfig *apiGemPortPmConfig;
  S_apiGemPortPmConfig *tgtApiGemPortPmConfig = 0;
  MV_U32               mibCtrlValue;

  // Does the GEM Port already appear in table
  for (indx = 0; indx < MAX_SUPPORTED_GEMPORTS_FOR_PM; indx++)
  {
    apiGemPortPmConfig = &apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx];
    if (apiGemPortPmConfig->in_use == MV_TRUE && apiGemPortPmConfig->gem_port == gemPort)
    {
      tgtApiGemPortPmConfig = apiGemPortPmConfig;
      break;
    }
  }

  // Did we find a free entry
  if (tgtApiGemPortPmConfig == 0)
  {
      printk("%s: gemPort %d not in table (stop)\n", __FUNCTION__, gemPort);
      return MV_NOT_FOUND;
  }

  mibCtrlValue = MAKE_MIB_COUNTER_CONTROL(MIB_COUNTER_CONTROL_INVALID_BIT,0,0);
  if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_CTRL, mibCtrlValue, indx)) != MV_OK)
  {
    printk("%s: asicOntMiscRegWrite failed for indx = %d (stop)\n", __FUNCTION__, indx);
    return rcode;
  }
  else
  {
    tgtApiGemPortPmConfig->in_use = MV_FALSE;
  }

  // If no more GEM ports are being monitored, restore the original RX_MIB_DEFAULT register value
  if (onuGponPmGemPortPmGetNumUsedEntries() == 0)
  {
    if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_DEFAULT, apiGemPortPmConfigDb.origRxMibDefaultReg, 0)) != MV_OK)
    {
      printk("%s: asicOntMiscRegWrite failed for mvAsicReg_RX_MIB_DEFAULT(%d)\n", __FUNCTION__, mvAsicReg_RX_MIB_DEFAULT);
      return rcode;
    }
  }

  return rcode;
}

/*******************************************************************************
**
**  onuGponPmGemPortPmReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears HW register for PM collection for GEM Port
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponPmGemPortPmReset(void)
{
  MV_STATUS            rcode;
  int                  indx;
  uint32_t             mibCtrlValue = MAKE_MIB_COUNTER_CONTROL(MIB_COUNTER_CONTROL_INVALID_BIT,0,0);

  for (indx = 0; indx < MAX_ENTRIES_GEMPORTPM_CONFIG_DB; indx++)
  {
    // Clear register (indx)
    apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx].in_use = MV_FALSE;
    if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_CTRL, mibCtrlValue, indx)) != MV_OK)
    {
      printk("%s: asicOntMiscRegWrite failure, rcode = %d, indx = %d\n", __FUNCTION__, rcode, indx);
      return rcode;
    }
  }

  if ((rcode = asicOntMiscRegWrite(mvAsicReg_RX_MIB_DEFAULT, apiGemPortPmConfigDb.origRxMibDefaultReg, 0)) != MV_OK)
  {
    printk("%s: asicOntMiscRegWrite failed for mvAsicReg_RX_MIB_DEFAULT(%d)\n", __FUNCTION__, mvAsicReg_RX_MIB_DEFAULT);
    return rcode;
  }

  return MV_OK;
}


/*******************************************************************************
**
**  onuGponPmGemPortPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function retrieves MIB Counter PM for GEM Port
**
**  PARAMETERS:  S_GponIoctlGemPortMibCounters *
**
**  OUTPUTS:     Reads MIB counters from HW
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponPmGemPortPmGet(MV_U16 gemPort, S_GponIoctlGemPortMibCounters *gemPortMibCounters)
{
  MV_STATUS            rcode = MV_OK;
  int                  indx;
  S_apiGemPortPmConfig *apiGemPortPmConfig;
  S_apiGemPortPmConfig *tgtApiGemPortPmConfig = 0;
  MV_U32               baseCounterReg;
  MV_U32               lowvalue;
  MV_U32               hivalue;
  MV_U32               registersAra[] =
  {
    mvAsicReg_PON_MAC_MIB_COUNTERS_0, mvAsicReg_PON_MAC_MIB_COUNTERS_1, mvAsicReg_PON_MAC_MIB_COUNTERS_2, mvAsicReg_PON_MAC_MIB_COUNTERS_3,
    mvAsicReg_PON_MAC_MIB_COUNTERS_4, mvAsicReg_PON_MAC_MIB_COUNTERS_5, mvAsicReg_PON_MAC_MIB_COUNTERS_6, mvAsicReg_PON_MAC_MIB_COUNTERS_7
  };

  for (indx = 0; indx < MAX_SUPPORTED_GEMPORTS_FOR_PM; indx++)
  {
    apiGemPortPmConfig = &apiGemPortPmConfigDb.apiGemPortPmConfigAra[indx];
    if (apiGemPortPmConfig->in_use == MV_TRUE && apiGemPortPmConfig->gem_port == gemPort)
    {
      baseCounterReg = registersAra[apiGemPortPmConfig->counter_set];
      tgtApiGemPortPmConfig = apiGemPortPmConfig;
      break;
    }
  }

  if (tgtApiGemPortPmConfig != 0)
  {
//    printk("%s: gemPort %d, counterSet %d, baseCounterReg %d\n",
//           __FUNCTION__, tgtApiGemPortPmConfig->gem_port, tgtApiGemPortPmConfig->counter_set, baseCounterReg);

    // Read PM MIB Counters from counter_set (indx)

    // 64 bit counter treatment: read the low part first, to lock the high part
    rcode |= asicOntMiscRegRead(baseCounterReg, &lowvalue, ONU_GPON_MIB_PM_GoodOctetsReceived_low );
    rcode |= asicOntMiscRegRead(baseCounterReg, &hivalue,  ONU_GPON_MIB_PM_GoodOctetsReceived_high);
    gemPortMibCounters->good_octets_received = (uint64_t) hivalue << 32 | lowvalue;

    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->bad_octets_received,       ONU_GPON_MIB_PM_BadOctetsReceived);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->mac_trans_error,           ONU_GPON_MIB_PM_MACTransError);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->good_frames_received,      ONU_GPON_MIB_PM_GoodFramesReceived);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->bad_frames_received,       ONU_GPON_MIB_PM_BadFramesReceived);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->broadcast_frames_received, ONU_GPON_MIB_PM_BroadcastFramesReceived);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->multicast_frames_received, ONU_GPON_MIB_PM_MulticastFramesReceived);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_64_octets,          ONU_GPON_MIB_PM_Frames64Octets);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_65_to_127_octets,   ONU_GPON_MIB_PM_Frames65to127Octets);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_128_to_255octets,   ONU_GPON_MIB_PM_Frames128to255Octets);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_256_to_511_octets,  ONU_GPON_MIB_PM_Frames256to511Octets);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_512_to_1023_octets, ONU_GPON_MIB_PM_Frames512to1023Octets);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->frames_1024_to_max_octets, ONU_GPON_MIB_PM_Frames1024toMaxOctets);

    // 64 bit counter treatment: read the low part first, to lock the high part
    rcode |= asicOntMiscRegRead(baseCounterReg, &lowvalue, ONU_GPON_MIB_PM_GoodOctetsSent_low);
    rcode |= asicOntMiscRegRead(baseCounterReg, &hivalue,  ONU_GPON_MIB_PM_GoodOctetsSent_high);
    gemPortMibCounters->good_octets_sent = (uint64_t) hivalue << 32 | lowvalue;

    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->good_frames_sent, ONU_GPON_MIB_PM_GoodFramesSent);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->multicast_frames_sent, ONU_GPON_MIB_PM_MulticastFramesSent);
    rcode |= asicOntMiscRegRead(baseCounterReg, &gemPortMibCounters->broadcast_frames_sent, ONU_GPON_MIB_PM_BroadcastFramesSent);

    if (rcode != MV_OK)
    {
      printk("%s: asicOntMiscRegRead failure, rcode = %d, baseCounterReg = %d\n", __FUNCTION__, rcode, baseCounterReg);
    }
  }
  else
  {
    printk("%s: gemPort %d not in table\n", __FUNCTION__, gemPort);
    return MV_NOT_FOUND;
  }

  return rcode;
}

/*******************************************************************************
**
**  onuGponPmGemPortPmConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns configured GEM port data
**
**  PARAMETERS:  Index in the GEM port DB
**
**  OUTPUTS:     S_apiGemPortPmConfig
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponPmGemPortPmConfigGet(MV_U16 dbIdx, S_apiGemPortPmConfig *gemPortPmConfig)
{
  memset (gemPortPmConfig, 0, sizeof(S_apiGemPortPmConfig));

  if ( dbIdx >= MAX_SUPPORTED_GEMPORTS_FOR_PM )
  {
      printk("%s: Invalid index = %d\n", __FUNCTION__, dbIdx);
      return MV_OUT_OF_RANGE;
  }

  if ( apiGemPortPmConfigDb.apiGemPortPmConfigAra[dbIdx].in_use == MV_FALSE )
      return MV_GET_ERROR;

  memcpy (gemPortPmConfig, &apiGemPortPmConfigDb.apiGemPortPmConfigAra[dbIdx], sizeof(S_apiGemPortPmConfig));

  return MV_OK;
}


