/*******************************************************************************
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        : gponOnuDb.c                                                **
**                                                                           **
**  DESCRIPTION : This file implements ONU GPON database functionality       **
*******************************************************************************
*                                                                             *
*  MODIFICATION HISTORY:                                                      *
*                                                                             *
*   29Oct06  Oren Ben Hayun   created                                         *
* =========================================================================== *
******************************************************************************/

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

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

/* Global Variables
------------------------------------------------------------------------------*/
/* ONU GPON Database */
S_OnuGponDb onuGponDb_s;

/* Local Variables
------------------------------------------------------------------------------*/
MV_U8 onuGponPassword[ONU_GPON_PASS_LEN] = {0x01, 0x02, 0x03, 0x04, 0x05,
                                             0x0A, 0x0B, 0x0C, 0x0D, 0x0E};

/* Export Functions
------------------------------------------------------------------------------*/

/* Local Functions
------------------------------------------------------------------------------*/
void      onuGponDbOnuGenTblInit(void);
void      onuGponDbOnuSyncParamTblInit(void);
void      onuGponDbOnuOperParamTblInit(void);
MV_STATUS onuGponDbGemPortAesClearAll(void);
MV_STATUS onuGponDbSerialNumberMaskEnableSet(MV_BOOL a_SerialNumberMaskEnable);
MV_BOOL   onuGponDbSerialNumberMaskEnableGet(void);

/******************************************************************************/
/* ========================================================================== */
/*                         Initialization Section                             */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponDbDbInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu database to default values
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbInit (void)
{
  MV_STATUS rcode = MV_OK;

  onuGponDbOnuGenTblInit();
  onuGponDbOnuSyncParamTblInit();
  onuGponDbOnuOperParamTblInit();
  onuGponDbBwAllocInit();

  return(rcode);
}

/*******************************************************************************
**
**  onuGponDbOnuGenTblInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu database general table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbOnuGenTblInit(void)
{
  /* clear onu database general table */
  memset((&(onuGponDb_s.onuGponGenTbl_s)), 0, sizeof (S_OnuGponGenTbl));

  /* set onu to state 01 */
  onuGponDbOnuStateSet(GPON_ONU_ID_STATE_01);

  /* set onu Id to undefined onu */
  onuGponDbOnuIdSet(GPON_ONU_ID_ONU_ID_DEF);

  /* set gpon rate to default value */
  onuGponDbRateSet(GPON_FRAME_DELINEATION_FR);

  /* set gpon xvr polarity to default value */
  
  /* set onu init status to be MV_FALSE */
  onuGponDbInitSet(MV_FALSE);

  /* set OMCC Valid to be MV_FALSE */
  onuGponDbOmccValidSet(MV_FALSE);

  /* set OnuId Override to be MV_FALSE */
  onuGponDbOnuIdOverrideSet(MV_FALSE);

  /* Set NULL in Notify functions */
  onuGponDbAlarmNotifySet(NULL);
  onuGponDbStatusNotifySet(NULL);
  onuGponDbOmccNotifySet(NULL);
  onuGponDbDisableNotifySet(NULL);

  onuGponDbOmccPortSet(0xFFFF);
}

/*******************************************************************************
**
**  onuGponDbOnuSyncParamTblInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu database sync params table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbOnuSyncParamTblInit(void)
{
  MV_U32 IdleMsgData[ONU_GPON_MSG_LEN];
  MV_U32 snMsgData[ONU_GPON_MSG_LEN];
  MV_U8  serialNumber[ONU_GPON_SN_LEN];

  /* clear onu database sync params table */
  memset ((&(onuGponDb_s.onuGponSyncParamsTbl_s)), 0, sizeof (S_OnuGponSyncParamsTbl));

  /* set onu guard bits */
  onuGponDbGuardBitsSet(0);

  /* set onu delays */
  onuGponDbConstDelaySet(GPON_TX_DELAY_TD_1244);
  onuGponDbEqualizationDelaySet(GPON_TX_EQUAL_DELAY_TD);

  /* set onu preamble */
  onuGponDbPreambleSet(ONU_GPON_PREM_TYPE_01, ONU_TX_PREAMBLE_TYPE_01_P, ONU_TX_PREAMBLE_TYPE_01_PC);
  onuGponDbPreambleSet(ONU_GPON_PREM_TYPE_02, ONU_TX_PREAMBLE_TYPE_02_P, ONU_TX_PREAMBLE_TYPE_02_PC);
  onuGponDbPreambleSet(ONU_GPON_PREM_TYPE_03, ONU_TX_PREAMBLE_TYPE_03_P, ONU_TX_PREAMBLE_TYPE_03_DEF_PC);

  /* set onu delimiter */
  onuGponDbDelimiterSet(ONU_GPON_DELM_BYTE_01, GPON_TX_DELIMITER_D0);
  onuGponDbDelimiterSet(ONU_GPON_DELM_BYTE_02, GPON_TX_DELIMITER_D1);
  onuGponDbDelimiterSet(ONU_GPON_DELM_BYTE_03, GPON_TX_DELIMITER_D2);
  onuGponDbDelimiterSizeSet(GPON_TX_DELIMITER_DS);
  onuGponDbDelimiterOverrideSet (MV_FALSE);

  /* set onu serial number */
  serialNumber[0] = ONU_GPON_SN_DEF_BYTE_1;
  serialNumber[1] = ONU_GPON_SN_DEF_BYTE_2;
  serialNumber[2] = ONU_GPON_SN_DEF_BYTE_3;
  serialNumber[3] = ONU_GPON_SN_DEF_BYTE_4;
  serialNumber[4] = ONU_GPON_SN_DEF_BYTE_5;
  serialNumber[5] = ONU_GPON_SN_DEF_BYTE_6;
  serialNumber[6] = ONU_GPON_SN_DEF_BYTE_7;
  serialNumber[7] = ONU_GPON_SN_DEF_BYTE_8;

  /* set onu serial number mask parametrs */
  onuGponDbSerialNumberMaskEnableSet(ONU_GPON_SN_MSK_GEN_ENA);
  onuGponDbSerialNumberMaskMatchSet(ONU_GPON_SN_MSK_DEF_MATCH);
  onuGponDbSnMaskSet(MV_FALSE);

  onuGponDbSerialNumSet (&(serialNumber[0]));

  IdleMsgData[0] = ((MV_U32)0) |
                   (((MV_U32)0) << 8) |
                   (((MV_U32)ONU_GPON_IDLE_MSG_DEF_BYTE_02) << 16) |
                   (((MV_U32)ONU_GPON_IDLE_MSG_DEF_BYTE_01) << 24);
  IdleMsgData[1] = ((MV_U32)0) |
                   (((MV_U32)0) << 8) |
                   (((MV_U32)0) << 16) |
                   (((MV_U32)0) << 24);
  IdleMsgData[2] = ((MV_U32)0) |
                   (((MV_U32)0) << 8) |
                   (((MV_U32)0) << 16) |
                   (((MV_U32)0) << 24);

  onuGponDbIdleMsgSet(IdleMsgData);

  snMsgData[0] = ((MV_U32)serialNumber[1]) |
                 (((MV_U32)serialNumber[0]) << 8) |
                 (((MV_U32)ONU_GPON_SN_MSG_DEF_BYTE_02) << 16) |
                 (((MV_U32)ONU_GPON_SN_MSG_DEF_BYTE_01) << 24);
  snMsgData[1] = ((MV_U32)serialNumber[5]) |
                 (((MV_U32)serialNumber[4]) << 8) |
                 (((MV_U32)serialNumber[3]) << 16) |
                 (((MV_U32)serialNumber[2]) << 24);
  snMsgData[2] = ((MV_U32)ONU_GPON_SN_MSG_DEF_BYTE_12) |
                 (((MV_U32)ONU_GPON_SN_MSG_DEF_BYTE_11) << 8) |
                 (((MV_U32)serialNumber[7]) << 16) |
                 (((MV_U32)serialNumber[6]) << 24);

  onuGponDbSnMsgSet(snMsgData);
}

/*******************************************************************************
**
**  onuGponDbOnuOperParamTblInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu database oper params table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbOnuOperParamTblInit(void)
{
  /* clear onu database oper params table */
  memset((&(onuGponDb_s.onuGponOperParamsTbl_s)), 0, sizeof (S_OnuGponOperParamsTbl));

  /* set ber, signal fail threshold and signal degraded threshold */
  onuGponDbBerIntervalSet(GPON_BIP_PERIOD_CNTR);
  onuGponDbBerCalcIntervalSet(ONU_GPON_DEF_INTERNAL_BER_INTERVAL);
  onuGponDbSfThresholdSet(ONU_GPON_DEF_SF_THRESHOLD);
  onuGponDbSdThresholdSet(ONU_GPON_DEF_SD_THRESHOLD);

  /* Init GEM Port AES table */
  onuGponDbGemPortAesClearAll();

  /* Init GEM Port table */
  onuGponDbGemPortClearAll();
  onuGponDbGemPortSavedClearAll();

  /* set onu REI sequence number */
  onuGponDbReiSeqNumSet(ONU_GPON_DEF_REI_SEQ_NUM);

  /* set onu password */
  onuGponDbPasswordSet(&(onuGponPassword[0]));
}

/*******************************************************************************
**
**  onuGponDbBwAllocInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu database bandwidth allocation table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbBwAllocInit(void)
{
	MV_U32 iEntry;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwTcontSet(iEntry, MV_FALSE, PON_ONU_ALLOC_NOT_EXIST, MV_FALSE);
		onuGponDbBwAllocSet(iEntry, PON_ONU_ALLOC_NOT_EXIST, MV_FALSE);
		onuGponDbBwIdleAllocSet(iEntry, PON_ONU_ALLOC_NOT_EXIST);
	}

	return(MV_OK);
}

/******************************************************************************/
/* ========================================================================== */
/*                         Interface Section                                  */
/* ========================================================================== */
/******************************************************************************/

/********************************************/
/* ======================================== */
/*   ONU GPON General Table API Functions   */
/* ======================================== */
/********************************************/

/*******************************************************************************
**
**  onuGponDbOnuStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu state in the database
**
**  PARAMETERS:  E_OnuState onuState_e - ONU_GPON_01_INIT
**                                       ONU_GPON_02_STANDBY
**                                       ONU_GPON_03_SERIAL_NUM
**                                       ONU_GPON_04_RANGING
**                                       ONU_GPON_05_OPERATION
**  									 ONU_GPON_06_POPUP
**  									 ONU_GPON_07_EMERGANCY_STOP
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbOnuStateSet(MV_U32 onuState)
{
  if ((onuState < ONU_GPON_01_INIT) ||
      (onuState > ONU_GPON_07_EMERGANCY_STOP))
  {
    return(MV_ERROR);
  }

  onuGponDb_s.onuGponGenTbl_s.onuGponOnuState = onuState;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuStateGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu state
**
*******************************************************************************/
MV_U32 onuGponDbOnuStateGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOnuState);
}

/*******************************************************************************
**
**  onuGponDbOnuIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Id in the database
**
**  PARAMETERS:  MV_U32 onuId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOnuIdSet(MV_U32 onuId)
{
  MV_U32 idleMsg[3];
  MV_U32 snNumMsg[3];

  onuGponDb_s.onuGponGenTbl_s.onuGponOnuId = onuId;

  onuGponDbIdleMsgGet(idleMsg);

  idleMsg[0] &= (0x00FFFFFF);
  idleMsg[0] |=  (onuId << 24);

  onuGponDbIdleMsgSet(idleMsg);

  onuGponDbSnMsgGet(snNumMsg);

  snNumMsg[0] &= (0x00FFFFFF);
  snNumMsg[0] |=  (onuId << 24);

  onuGponDbSnMsgSet(snNumMsg);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuIdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Id
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu Id
**
*******************************************************************************/
MV_U32 onuGponDbOnuIdGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOnuId);
}

/*******************************************************************************
**
**  onuGponDbOnuSignalDetectSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu signal detect state in the database
**
**  PARAMETERS:  MV_U32 state
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbOnuSignalDetectSet(MV_U32 state)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponSignalDetect = state;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuSignalDetectGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu signal detect state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu state
**
*******************************************************************************/
MV_U32 onuGponDbOnuSignalDetectGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponSignalDetect);
}

/*******************************************************************************
**
**  onuGponDbOnuDsSyncOnSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu DS Sync state in the database
**
**  PARAMETERS:  MV_U32 state
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbOnuDsSyncOnSet(MV_U32 state)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponDsSyncOn = state;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuDsSyncOnGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return DS Sync state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu state
**
*******************************************************************************/
MV_U32 onuGponDbOnuDsSyncOnGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponDsSyncOn);
}

/*******************************************************************************
**
**  onuGponDbXvrSdPolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu XVR SD polarity
**
**  PARAMETERS:  MV_U32 state
**
**  OUTPUTS:	None
**
**  RETURNS:	MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbXvrSdPolaritySet(MV_U32 polarity)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponXvrSdPolarity = polarity;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbXvrSdPolarityGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return XVR SD polarity
**
**  PARAMETERS:  None
**
**  OUTPUTS:	None
**
**  RETURNS:	XVR SD polarity 
**
*******************************************************************************/
MV_U32 onuGponDbXvrSdPolarityGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponXvrSdPolarity);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Id override value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu Id
**
*******************************************************************************/
MV_U32 onuGponDbOnuIdOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOnuIdOverrideVal);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Id override value
**
**  PARAMETERS:  MV_U32 onuId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOnuIdOverrideValueSet(MV_U32 onuId)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponOnuIdOverrideVal = onuId;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Id override state
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOnuIdOverrideSet(MV_BOOL enable)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponOnuIdOverrideEn = enable;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Id override state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu Id
**
*******************************************************************************/
MV_BOOL onuGponDbOnuIdOverrideGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOnuIdOverrideEn);
}

/*******************************************************************************
**
**  onuGponDbdGaspEnSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set dying gasp in the database
**
**  PARAMETERS:  MV_BOOL dGaspEn
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbdGaspEnSet(MV_BOOL dGaspEn)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponDyingGaspEn = dGaspEn;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbdGaspEnGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu dying gasp state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu Id
**
*******************************************************************************/
MV_BOOL onuGponDbdGaspEnGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponDyingGaspEn);
}

/*******************************************************************************
**
**  onuGponDbInitSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set ONU Init status in the database
**
**  PARAMETERS:  MV_BOOL init
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbInitSet(MV_BOOL init)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponInit = init;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbInitGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu init state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu init state - MV_TRUE/MV_FALSE
**
*******************************************************************************/
MV_BOOL onuGponDbInitGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponInit);
}

/*******************************************************************************
**
**  onuGponDbOmccValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu OMCC state in the database
**
**  PARAMETERS:  MV_BOOL omccValid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOmccValidSet(MV_BOOL omccValid)
{
  onuGponDb_s.onuGponGenTbl_s.omccValid = omccValid;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOmccValidGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu OMCC state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     OMCC - MV_TRUE/MV_FALSE
**
*******************************************************************************/
MV_BOOL onuGponDbOmccValidGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.omccValid);
}

/*******************************************************************************
**
**  onuGponDbOmccPortdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu OMCC value in the database
**
**  PARAMETERS:  MV_U32 omccPort
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOmccPortSet(MV_U32 omccPort)
{
  onuGponDb_s.onuGponGenTbl_s.omccPort = omccPort;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOmccPortGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu OMCC port
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     OMCC port
**
*******************************************************************************/
MV_U32 onuGponDbOmccPortGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.omccPort);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu OMCC override value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     OMCC override value
**
*******************************************************************************/
MV_U32 onuGponDbOmccPortOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOmccPortOverrideVal);
}

/*******************************************************************************
**
**  onuGponDbOnuIdOverrideValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu OMCC override value in the database
**
**  PARAMETERS:  MV_U32 OmccPort
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOmccPortOverrideValueSet(MV_U32 OmccPort)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponOmccPortOverrideVal = OmccPort;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOmccPortOverrideSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu OMCC override state in the database
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOmccPortOverrideSet(MV_BOOL enable)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponOmccPortOverrideEn = enable;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOmccPortOverrideGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu OMCC override state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     OMCC override state
**
*******************************************************************************/
MV_BOOL onuGponDbOmccPortOverrideGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponOmccPortOverrideEn);
}

/*******************************************************************************
**
**  onuGponDbRateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set ONU Rate in the database
**
**  PARAMETERS:  MV_U32 rate
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbRateSet(MV_U32 rate)
{
  onuGponDb_s.onuGponGenTbl_s.onuGponRate = rate;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbRateGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Rate
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu Rate
**
*******************************************************************************/
MV_U32 onuGponDbRateGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuGponRate);
}

/*******************************************************************************
**
**  onuGponDbAlarmNotifySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Alarm Notify Callback in the database
**
**  PARAMETERS:  ALARMNOTIFYFUNC alarmCallback - alarm callback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbAlarmNotifySet(ALARMNOTIFYFUNC alarmCallback)
{
  onuGponDb_s.onuGponGenTbl_s.alarmCallback = alarmCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbAlarmNotifyGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Alarm Notify Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Alarm Notify Callback
**
*******************************************************************************/
ALARMNOTIFYFUNC onuGponDbAlarmNotifyGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.alarmCallback);
}

/*******************************************************************************
**
**  onuGponDbStatusNotifySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Status Notify Callback in the database
**
**  PARAMETERS:  STATUSNOTIFYFUNC statusCallback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbStatusNotifySet(STATUSNOTIFYFUNC statusCallback)
{
  onuGponDb_s.onuGponGenTbl_s.statusCallback = statusCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbStatusNotifyGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Status Notify Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Status Notify Callback
**
*******************************************************************************/
STATUSNOTIFYFUNC onuGponDbStatusNotifyGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.statusCallback);
}

/*******************************************************************************
**
**  onuGponDbOmccNotifySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Omcc Notify Callback in the database
**
**  PARAMETERS:  OMCCNOTIFYFUNC omccCallback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbOmccNotifySet(OMCCNOTIFYFUNC omccCallback)
{
  onuGponDb_s.onuGponGenTbl_s.omccCallback = omccCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbOmccNotifyGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Omcc Notify Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Omcc Notify Callback
**
*******************************************************************************/
OMCCNOTIFYFUNC onuGponDbOmccNotifyGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.omccCallback);
}

/*******************************************************************************
**
**  onuGponDbDisableNotifySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu disable Notify Callback in the database
**
**  PARAMETERS:  DISABLENOTIFYFUNC disableCallback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbDisableNotifySet(DISABLENOTIFYFUNC disableCallback)
{
  onuGponDb_s.onuGponGenTbl_s.disableCallback = disableCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbDisableNotifyGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu disable Notify Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Disable Notify Callback
**
*******************************************************************************/
DISABLENOTIFYFUNC onuGponDbDisableNotifyGet (void)
{
  return(onuGponDb_s.onuGponGenTbl_s.disableCallback);
}

/***********************************************/
/* =========================================== */
/*   ONU GPON Sync Params Table API Functions  */
/* =========================================== */
/***********************************************/

/*******************************************************************************
**
**  onuGponDbSnMaskSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SN mask in the database
**
**  PARAMETERS:  MV_U32 snMaskEn
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSnMaskSet(MV_U32 snMaskEn)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskDefEnable = snMaskEn;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbGuardBitsSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead guard bit
**
**  PARAMETERS:  MV_U32 guardBit
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGuardBitsSet(MV_U32 guardBit)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponGuardBits = guardBit;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbGuardBitsGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead guard bit
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Overhead guard bit
**
*******************************************************************************/
MV_U32 onuGponDbGuardBitsGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponGuardBits);
}

/*******************************************************************************
**
**  onuGponDbPreambleSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead preamble type and count
**
**  PARAMETERS:  E_OnuOverheadPreambleType premType_e
**               MV_U32                    premVal
**               MV_U32                    premCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPreambleSet(E_OnuOverheadPreambleType premType_e,
                               MV_U32 premVal,
                               MV_U32 premCnt)
{
  if (premType_e > ONU_GPON_PREM_TYPE_03)
  {
    return(MV_ERROR);
  }

  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPreambleVal[premType_e] = premVal;
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPreambleCnt[premType_e] = premCnt;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbPreambleGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead preamble type and count
**
**  PARAMETERS:  E_OnuOverheadPreambleType premType_e
**               MV_U32                    *premVal
**               MV_U32                    *premCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbPreambleGet(E_OnuOverheadPreambleType premType_e,
                          MV_U32 *premVal,
                          MV_U32 *premCnt)
{
  *premVal = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPreambleVal[premType_e];
  *premCnt = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPreambleCnt[premType_e];
}

/*******************************************************************************
**
**  onuGponDbExtPreambleStatusSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead extended preamble type3 status
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtPreambleStatusSet(MV_U32 extendPremStatus)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleStatus = extendPremStatus;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtPreambleStatusGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead extended preamble type3 status
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     extended preamble type3 status
**
*******************************************************************************/
MV_U32 onuGponDbExtPreambleStatusGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleStatus);
}

/*******************************************************************************
**
**  onuGponDbExtPreambleSyncSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead extended preamble type3 - state 3/4
**
**  PARAMETERS:  MV_U32 extendPremCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtPreambleSyncSet(MV_U32 extendPremCnt)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSync = extendPremCnt;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtPreambleSyncGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead extended preamble type3
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead extended preamble type3 count - state 3/4
**
*******************************************************************************/
MV_U32 onuGponDbExtPreambleSyncGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSync);
}

/*******************************************************************************
**
**  onuGponDbExtPreambleOperSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead extended preamble type3 - state 5
**
**  PARAMETERS:  MV_U32 extendPremCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtPreambleOperSet(MV_U32 extendPremCnt)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOper = extendPremCnt;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtPreambleOperGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead extended preamble type3
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead extended preamble type3 count - state 5
**
*******************************************************************************/
MV_U32 onuGponDbExtPreambleOperGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOper);
}

/*******************************************************************************
**
**  onuGponDbDelimiterSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead delimiter byte
**
**  PARAMETERS:  E_OnuOverheadDelimiterByte delimByte_e
**               MV_U32                     delimVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbDelimiterSet(E_OnuOverheadDelimiterByte delimByte_e,
                                MV_U32 delimVal)
{
  if (delimByte_e > ONU_GPON_DELM_BYTE_03)
  {
    return(MV_ERROR);
  }

  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiter[delimByte_e] = delimVal;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbDelimiterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead delimiter byte
**
**  PARAMETERS:  E_OnuOverheadDelimiterByte delimByte_e
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead delimiter byte
**
*******************************************************************************/
MV_U32 onuGponDbDelimiterGet(E_OnuOverheadDelimiterByte delimByte_e)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiter[delimByte_e]);
}

/*******************************************************************************
**
**  onuGponDbDelimiterSizeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead delimiter size
**
**  PARAMETERS:  MV_U32 delimSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbDelimiterSizeSet(MV_U32 delimSize)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterSize = delimSize;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbDelimiterSizeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead delimiter size
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead delimiter size
**
*******************************************************************************/
MV_U32 onuGponDbDelimiterSizeGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterSize);
}

/*******************************************************************************
**
**  onuGponDbDelimiterOverrideValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead delimiter override value
**
**  PARAMETERS:  MV_U32 delimVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbDelimiterOverrideValueSet(MV_U32 delimVal)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterOverrideValue = delimVal;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDelimiterOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead delimiter override value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu overhead delimiter override value
**
*******************************************************************************/
MV_U32 onuGponDbDelimiterOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterOverrideValue);
}

/*******************************************************************************
**
**  onuGponDbDelimiterOverrideSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu overhead delimiter override state
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     onu overhead delimiter state
**
*******************************************************************************/
MV_STATUS onuGponDbDelimiterOverrideSet(MV_BOOL enable)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterOverride = enable;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbDelimiterOverridGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu overhead delimiter override state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead delimiter override state
**
*******************************************************************************/
MV_U32 onuGponDbDelimiterOverrideGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponDelimiterOverride);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstDelayAddSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu extended burst delay add state
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtendedBurstDelayAddSet(MV_BOOL enable)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleDelayAdd = enable;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstDelayAddGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst delay add state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst delay add state
**
*******************************************************************************/
MV_BOOL onuGponDbExtendedBurstDelayAddGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleDelayAdd);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstDelayValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu extended burst delay values
**
**  PARAMETERS:  MV_U32 exBurstSync
**               MV_U32 exBurstOper
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtendedBurstDelayValueSet(MV_U32 exBurstSync, MV_U32 exBurstOper)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSyncDelay = exBurstSync;
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOperDelay = exBurstOper;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstSyncDelayValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst delay value (O3/O4)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst delay value (O3/O4)
**
*******************************************************************************/
MV_U32 onuGponDbExtendedBurstSyncDelayValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSyncDelay);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstOperDelayValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst delay value (O5)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst delay value (O5)
**
*******************************************************************************/
MV_U32 onuGponDbExtendedBurstOperDelayValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOperDelay);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstOverrideSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu extended burst override state
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtendedBurstOverrideSet(MV_BOOL enable)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOverride = enable;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstOverrideGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst override state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst override state
**
*******************************************************************************/
MV_BOOL onuGponDbExtendedBurstOverrideGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOverride);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstOverrideValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu extended burst override values
**
**  PARAMETERS:  MV_U32 exBurstRange
**               MV_U32 exBurstOper
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbExtendedBurstOverrideValueSet(MV_U32 exBurstRange, MV_U32 exBurstOper)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSyncOverride = exBurstRange;
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOperOverride = exBurstOper;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstSyncOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst override value (O3/O4)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst override value (O3/O4)
**
*******************************************************************************/
MV_U32 onuGponDbExtendedBurstSyncOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleSyncOverride);
}

/*******************************************************************************
**
**  onuGponDbExtendedBurstOperOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu extended burst override value (O5)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu extended burst override value (O5)
**
*******************************************************************************/
MV_U32 onuGponDbExtendedBurstOperOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponExtPreambleOperOverride);
}

/*******************************************************************************
**
**  onuGponDbMaxExtraSnTransSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set overhead max extra sn transmissions
**
**  PARAMETERS:  MV_U32 maxExtraSnTrans
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbMaxExtraSnTransSet(MV_U32 maxExtraSnTrans)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponMaxExtraSnTrans = maxExtraSnTrans;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbMaxExtraSnTransGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return overhead max extra sn transmissions
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     overhead max extra sn transmissions
**
*******************************************************************************/
MV_U32 onuGponDbMaxExtraSnTransGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponMaxExtraSnTrans);
}

/*******************************************************************************
**
**  onuGponDbSerialNumSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu serial number
**
**  PARAMETERS:  MV_U8 *serialNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSerialNumSet(MV_U8 *serialNum)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_SN_LEN; index++)
  {
    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNum[index] = *(serialNum + index);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbSerialNumGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu serial number
**
**  PARAMETERS:  MV_U8 *serialNum
**
**  OUTPUTS:     MV_U8 *serialNum
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbSerialNumGet(MV_U8 *serialNum)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_SN_LEN; index++)
  {
    *(serialNum + index) = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNum[index];
  }
}

/*******************************************************************************
**
**  onuGponDbSerialNumberMaskEnableGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SN mask enable state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     SN mask enable state
**
*******************************************************************************/
MV_BOOL onuGponDbSerialNumberMaskEnableGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskEnable);
}

/*******************************************************************************
**
**  onuGponDbSerialNumberMaskEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SN mask enable state
**
**  PARAMETERS:  MV_BOOL a_SerialNumberMaskEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSerialNumberMaskEnableSet(MV_BOOL a_SerialNumberMaskEnable)
{
  MV_BOOL profileSnMaskValue;

  profileSnMaskValue = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskDefEnable;

  if (profileSnMaskValue == MV_TRUE)
  {
    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskEnable = a_SerialNumberMaskEnable;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbSerialNumberMaskMatchGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SN mask match state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     SN mask match state
**
*******************************************************************************/
MV_BOOL onuGponDbSerialNumberMaskMatchGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskMatch);
}

/*******************************************************************************
**
**  onuGponDbSerialNumberMaskMatchSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SN mask enable state
**
**  PARAMETERS:  MV_BOOL a_SerialNumberMaskMatch
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSerialNumberMaskMatchSet(MV_BOOL a_SerialNumberMaskMatch)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSerialNumberMaskMatch = a_SerialNumberMaskMatch;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbConstDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu const delay
**
**  PARAMETERS:  MV_U32 constDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbConstDelaySet(MV_U32 constDelay)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponConstDelay = constDelay;
}

/*******************************************************************************
**
**  onuGponDbConstDelayGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu const delay
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu const delay
**
*******************************************************************************/
MV_U32 onuGponDbConstDelayGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponConstDelay);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu equalization delay
**
**  PARAMETERS:  MV_U32 equalizationDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbEqualizationDelaySet(MV_U32 equalizationDelay)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelay = equalizationDelay;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelayGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu equalization delay
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu equalization delay
**
*******************************************************************************/
MV_U32 onuGponDbEqualizationDelayGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelay);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelayOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu equalization delay override value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu equalization delay override value
**
*******************************************************************************/
MV_U32 onuGponDbEqualizationDelayOverrideValueGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelayOverrideValue);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelayOverrideValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu equalization delay override value
**
**  PARAMETERS:  MV_U32 equalizationDelayOverrideVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbEqualizationDelayOverrideValueSet(MV_U32 equalizationDelayOverrideVal)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelayOverrideValue = equalizationDelayOverrideVal;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelayOverrideValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu equalization delay override state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu equalization delay override state
**
*******************************************************************************/
MV_BOOL onuGponDbEqualizationDelayOverrideGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelayOverride);
}

/*******************************************************************************
**
**  onuGponDbEqualizationDelayOverrideSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu equalization delay override state
**
**  PARAMETERS:  MV_BOOL OverrideEqualizationDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbEqualizationDelayOverrideSet(MV_BOOL OverrideEqualizationDelay)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponEqualizationDelayOverride = OverrideEqualizationDelay;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbPowerLevelSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu power level
**
**  PARAMETERS:  MV_U32 powerLevel
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPowerLevelSet(MV_U32 powerLevel)
{
  onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPowerLevel = powerLevel;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbPowerLevelGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu power level
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu power level
**
*******************************************************************************/
MV_U32 onuGponDbPowerLevelGet(void)
{
  return(onuGponDb_s.onuGponSyncParamsTbl_s.onuGponPowerLevel);
}

/*******************************************************************************
**
**  onuGponDbIdleMsgSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu idle message
**
**  PARAMETERS:  MV_U32 *idleMsg
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbIdleMsgSet(MV_U32 *idleMsg)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_MSG_LEN; index++)
  {
    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponIdleMsg[index] = *(idleMsg + index);
  }
}

/*******************************************************************************
**
**  onuGponDbIdleMsgGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu idle message
**
**  PARAMETERS:  MV_U32 *idleMsg
**
**  OUTPUTS:     MV_U32 *idleMsg
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbIdleMsgGet(MV_U32 *idleMsg)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_MSG_LEN; index++)
  {
    *(idleMsg + index) = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponIdleMsg[index];
  }
}

/*******************************************************************************
**
**  onuGponDbSnMsgSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu serial number message
**
**  PARAMETERS:  MV_U32 *snMsg
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbSnMsgSet(MV_U32 *snMsg)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_MSG_LEN; index++)
  {
    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSnMsg[index] = *(snMsg + index);
  }
}

/*******************************************************************************
**
**  onuGponDbSnMsgGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu serial number message
**
**  PARAMETERS:  MV_U32 *snMsg
**
**  OUTPUTS:     MV_U32 *snMsg
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbSnMsgGet(MV_U32 *snMsg)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_MSG_LEN; index++)
  {
    *(snMsg + index) = onuGponDb_s.onuGponSyncParamsTbl_s.onuGponSnMsg[index];
  }
}

/***********************************************/
/* =========================================== */
/*   ONU GPON Oper Params Table API Functions  */
/* =========================================== */
/***********************************************/

/*******************************************************************************
**
**  onuGponDbBerIntervalSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu ber interval
**
**  PARAMETERS:  MV_U32 berInterval
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbBerIntervalSet(MV_U32 berInterval)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerInterval = berInterval;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBerIntervalGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu ber interval
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu ber interval
**
*******************************************************************************/
MV_U32 onuGponDbBerIntervalGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerInterval);
}

/*******************************************************************************
**
**  onuGponDbBipInterruptStatusValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function update onu ber interval value
**
**  PARAMETERS:  MV_U32 Bip8
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbBipInterruptStatusValueSet(MV_U32 Bip8)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerIntervalValue = Bip8;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBerIntervalGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu ber interval value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu ber interval value
**
*******************************************************************************/
MV_U32 onuGponDbBipInterruptStatusValueGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerIntervalValue);
}

/*******************************************************************************
**
**  onuGponDbGemResetSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets onu gem reset on fiber disconnection
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGemResetSet(MV_U32 gem_reset){

    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponResetGemPorts = gem_reset;
    return(MV_OK);
}
/*******************************************************************************
**
**  onuGponDbGemResetGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu gem reset on fiber disconnection
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     return onu gem reset on fiber disconnection
**
*******************************************************************************/
MV_U32 onuGponDbGemResetGet(void){

    return (onuGponDb_s.onuGponSyncParamsTbl_s.onuGponResetGemPorts);
}
/*******************************************************************************
**
**  onuGponDbTcontResetSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets onu TCONT reset on fiber disconnection
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbTcontResetSet(MV_U32 tcont_reset){

    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponResetTconts = tcont_reset;
    return(MV_OK);
}
/*******************************************************************************
**
**  onuGponDbTcontResetGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu tcont reset on fiber disconnection
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     return onu gem reset on fiber disconnection
**
*******************************************************************************/
MV_U32 onuGponDbTcontResetGet(void){

    return (onuGponDb_s.onuGponSyncParamsTbl_s.onuGponResetTconts);
}
/*******************************************************************************
**
**  onuGponDbGemRestoreSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets flag "restore GEM ports on exiting from state 7"
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
MV_VOID onuGponDbGemRestoreSet(MV_BOOL gem_restore)
{
    onuGponDb_s.onuGponSyncParamsTbl_s.onuGponRestoreGemPorts = gem_restore;
}
/*******************************************************************************
**
**  onuGponDbGemRestoreGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return flag "GEM ports restore on exiting from state 7"
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     return onu gem restore on exiting from state 7
**
*******************************************************************************/
MV_BOOL onuGponDbGemRestoreGet(MV_VOID)
{
    return (onuGponDb_s.onuGponSyncParamsTbl_s.onuGponRestoreGemPorts);
}

/*******************************************************************************
**
**  onuGponDbBerCalcIntervalSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu internal ber interval
**
**  PARAMETERS:  MV_U32 internalBerInterval
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbBerCalcIntervalSet(MV_U32 internalBerInterval)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerCalcInterval = internalBerInterval;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBerCalcIntervalGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu internal ber interval
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu internal ber interval
**
*******************************************************************************/
MV_U32 onuGponDbBerCalcIntervalGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponBerCalcInterval);
}

/*******************************************************************************
**
**  onuGponDbSfThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SF threshold
**
**  PARAMETERS:  MV_U32 SF_Threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSfThresholdSet(MV_U32 SF_Threshold)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponSfThreshold = SF_Threshold;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbSfThresholdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SF threshold
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu SF threshold
**
*******************************************************************************/
MV_U32 onuGponDbSfThresholdGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponSfThreshold);
}

/*******************************************************************************
**
**  onuGponDbSdThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SD threshold
**
**  PARAMETERS:  MV_U32 SD_Threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbSdThresholdSet(MV_U32 SD_Threshold)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponSdThreshold = SD_Threshold;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbSdThresholdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SD threshold
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu SD threshold
**
*******************************************************************************/
MV_U32 onuGponDbSdThresholdGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponSdThreshold);
}

/*******************************************************************************
**
**  onuGponDbGemPortValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set gem port valid state
**
**  PARAMETERS:  MV_U32 gemPortId
**               MV_BOOL   valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGemPortValidSet(MV_U32 gemPortId, MV_BOOL valid)
{
	if (gemPortId >= GPON_ONU_MAX_GEM_PORTS)
		return(MV_ERROR);

	onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortValid[gemPortId] = valid;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbGemPortValidGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return gem port valid state
**
**  PARAMETERS:  MV_U32 gemPortId
**
**  OUTPUTS:     None
**
**  RETURNS:     gem port valid state
**
*******************************************************************************/
MV_BOOL onuGponDbGemPortValidGet(MV_U32 gemPortId)
{
	if (gemPortId >= GPON_ONU_MAX_GEM_PORTS)
		return(MV_FALSE);

	return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortValid[gemPortId]);
}

/*******************************************************************************
**
**  onuGponDbGemPortClearAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clear all gem ports
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGemPortClearAll(void)
{
	MV_U32  iPort;

	for (iPort = 0 ; iPort < GPON_ONU_MAX_GEM_PORTS ; iPort++)
		onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortValid[iPort] = MV_FALSE;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbGemPortSavedClearAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clear all saved gem ports
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
MV_VOID onuGponDbGemPortSavedClearAll(void)
{
	MV_U32  iPort;

	for (iPort = 0 ; iPort < GPON_ONU_MAX_GEM_PORTS ; iPort++)
		onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortSave[iPort] = MV_FALSE;
}

/*******************************************************************************
**
**  onuGponDbGemPortSaveAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function saves validity state of all gem ports
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
MV_VOID onuGponDbGemPortSaveAll(void)
{
	MV_U32  iPort;

	for (iPort = 0 ; iPort < GPON_ONU_MAX_GEM_PORTS ; iPort++) {
		onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortSave[iPort] =
				onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortValid[iPort];
	}
}

/*******************************************************************************
**
**  onuGponDbGemPortSavedValidGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return gem port valid state from "saved ports" array
**
**  PARAMETERS:  MV_U32 gemPortId
**
**  OUTPUTS:     None
**
**  RETURNS:     gem port valid state
**
*******************************************************************************/
MV_BOOL onuGponDbGemPortSavedValidGet(MV_U32 gemPortId)
{
	if (gemPortId >= GPON_ONU_MAX_GEM_PORTS)
		return(MV_FALSE);

	return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortSave[gemPortId]);
}

/*******************************************************************************
**
**  onuGponDbGemPortAesSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set gem port encryption state
**
**  PARAMETERS:  MV_U32 gemPortId
**               MV_BOOL mode
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGemPortAesSet(MV_U32 gemPortId, MV_BOOL mode)
{
  if (gemPortId >= GPON_ONU_MAX_GEM_PORTS)
  {
    return(MV_ERROR);
  }
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortAes[gemPortId] = mode;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbGemPortAesGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return gem port encryption state
**
**  PARAMETERS:  MV_U32 gemPortId
**
**  OUTPUTS:     None
**
**  RETURNS:     gem port encryption state
**
*******************************************************************************/
MV_BOOL onuGponDbGemPortAesGet(MV_U32 gemPortId)
{
  if (gemPortId >= GPON_ONU_MAX_GEM_PORTS)
  {
    return(MV_FALSE);
  }

  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortAes[gemPortId]);
}

/*******************************************************************************
**
**  onuGponDbGemPortAesClearAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clear all AES gem ports
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbGemPortAesClearAll(void)
{
  MV_U32  iPort;

  for (iPort = 0 ; iPort < GPON_ONU_MAX_GEM_PORTS ; iPort++)
  {
    onuGponDb_s.onuGponOperParamsTbl_s.onuGponGemPortAes[iPort] = MV_FALSE;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbReiSeqNumSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu REI sequence number
**
**  PARAMETERS:  MV_U32 reiSeqNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbReiSeqNumSet(MV_U32 reiSeqNum)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponReiSeqNum = reiSeqNum;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbReiSeqNumGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu REI sequence number
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu REI sequence number
**
*******************************************************************************/
MV_U32 onuGponDbReiSeqNumGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponReiSeqNum);
}

/*******************************************************************************
**
**  onuGponDbPasswordSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu password
**
**  PARAMETERS:  MV_U8 *password
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPasswordSet(MV_U8 *password)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_PASS_LEN; index++)
  {
    onuGponDb_s.onuGponOperParamsTbl_s.onuGponPassword[index] = *(password + index);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbPasswordGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu password
**
**  PARAMETERS:  MV_U8 *password
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbPasswordGet(MV_U8 *password)
{
  MV_U32 index;

  for (index = 0; index < ONU_GPON_PASS_LEN; index++)
  {
    *(password + index) = onuGponDb_s.onuGponOperParamsTbl_s.onuGponPassword[index];
  }
}

/********************************************/
/* ======================================== */
/*   ONU GPON BW Alloc Table API Functions  */
/* ======================================== */
/********************************************/

/* ======================================== */
/*   ONU BW ALLOC SECTION                   */
/* ======================================== */

/*******************************************************************************
**
**  onuGponDbBwAllocSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets Alloc-Id value & state to T-Cont
**
**  PARAMETERS:  MV_U32 entry
**               MV_U32 allocId
**               MV_BOOL valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbBwAllocSet(MV_U32 entry, MV_U32 allocId, MV_BOOL valid)
{
	if (entry >= ONU_GPON_MAX_NUM_OF_T_CONTS)
		return(MV_ERROR);

	onuGponDb_s.onuGponBwTbl_s.onuAllocIds[entry].allocId = allocId;
	onuGponDb_s.onuGponBwTbl_s.onuAllocIds[entry].valid   = valid;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwAllocGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Alloc-Id value & state to T-Cont
**
**  PARAMETERS:  MV_U32 entry
**               MV_U32 allocId
**               MV_BOOL valid
**
**  OUTPUTS:     None
**
**  RETURNS:     Alloc-Id value & state
**
*******************************************************************************/
MV_STATUS onuGponDbBwAllocGet(MV_U32 entry, MV_U32 *allocId, MV_BOOL *valid)
{
	if (entry >= ONU_GPON_MAX_NUM_OF_T_CONTS) {
		*allocId = 0;
		*valid   = MV_FALSE;
		return(MV_ERROR);
	}

	*allocId = onuGponDb_s.onuGponBwTbl_s.onuAllocIds[entry].allocId;
	*valid   = onuGponDb_s.onuGponBwTbl_s.onuAllocIds[entry].valid;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwAllocExist
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function true if Alloc-Id exist in the onu
**
**  PARAMETERS:  MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     Alloc-Id existance
**
*******************************************************************************/
MV_BOOL onuGponDbBwAllocExist(MV_U32 allocId)
{
	MV_U32  iEntry;
	MV_U32  entryAllocId;
	MV_BOOL valid;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwAllocGet(iEntry, &entryAllocId, &valid);
		if ((entryAllocId == allocId) && (valid == MV_TRUE))
			return(MV_TRUE);
	}

	return(MV_FALSE);
}

/*******************************************************************************
**
**  onuGponDbBwAllocInsert
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function assign Alloc-Id to T-Cont
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *entry
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwAllocInsert(MV_U32 allocId, MV_U32 *entry)
{
	MV_U32  iEntry;
	MV_U32  entryAllocId;
	MV_BOOL valid;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwAllocGet(iEntry, &entryAllocId, &valid);
		if (valid == MV_FALSE) {
			onuGponDbBwAllocSet(iEntry, allocId, MV_TRUE);
			*entry = iEntry;
			return(MV_OK);
		}
	}

	return(MV_ERROR);
}

/*******************************************************************************
**
**  onuGponDbBwAllocRemove
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function remove Alloc-Id from T-Cont
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *entry
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwAllocRemove(MV_U32 allocId, MV_U32 *entry)
{
	MV_U32  iEntry;
	MV_U32  entryAllocId;
	MV_BOOL valid;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwAllocGet(iEntry, &entryAllocId, &valid);
		if ((entryAllocId == allocId) && (valid == MV_TRUE)) {
			onuGponDbBwAllocSet(iEntry, PON_ONU_ALLOC_NOT_EXIST, MV_FALSE);
			*entry = iEntry;
			return(MV_OK);
		}
	}

	return(MV_ERROR);
}

/* ======================================== */
/*   ONU BW IDLE ALLOC SECTION              */
/* ======================================== */

/*******************************************************************************
**
**  onuGponDbBwIdleAllocSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets Idle Alloc-Id value
**
**  PARAMETERS:  MV_U32 entry
**               MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     NONE
**
*******************************************************************************/
MV_VOID onuGponDbBwIdleAllocSet(MV_U32 entry, MV_U32 allocId)
{
	if (entry < ONU_GPON_MAX_NUM_OF_T_CONTS)
		onuGponDb_s.onuGponBwTbl_s.onuIdleAllocIds[entry] = allocId;
}

/*******************************************************************************
**
**  onuGponDbBwIdleAllocGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Idle Alloc-Id value
**
**  PARAMETERS:  MV_U32 entry
**               MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     NONE
**
*******************************************************************************/
MV_VOID onuGponDbBwIdleAllocGet(MV_U32 entry, MV_U32 *allocId)
{
	if (entry < ONU_GPON_MAX_NUM_OF_T_CONTS)
		*allocId = onuGponDb_s.onuGponBwTbl_s.onuIdleAllocIds[entry];
}

/*******************************************************************************
**
**  onuGponDbBwIdleAllocExist
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function true if Idle Alloc-Id exist in the onu
**
**  PARAMETERS:  MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     Alloc-Id existance
**
*******************************************************************************/
MV_BOOL onuGponDbBwIdleAllocExist(MV_U32 allocId, MV_U32 *entry)
{
	MV_U32 iEntry;
	MV_U32 entryAllocId;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwIdleAllocGet(iEntry, &entryAllocId);
		if (entryAllocId == allocId) {
			*entry = entryAllocId;
			return(MV_TRUE);
		}
	}

	*entry = 0;
	return(MV_FALSE);
}

/*******************************************************************************
**
**  onuGponDbBwIdleAllocInsert
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function add Idle Alloc-Id
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *entry
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwIdleAllocInsert(MV_U32 allocId, MV_U32 *entry)
{
	MV_U32  iEntry;
	MV_U32  entryAllocId;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwIdleAllocGet(iEntry, &entryAllocId);
		if (entryAllocId == PON_ONU_ALLOC_NOT_EXIST) {
			onuGponDbBwIdleAllocSet(iEntry, allocId);
			*entry = iEntry;
			return(MV_OK);
		}
	}

	return(MV_ERROR);
}

/*******************************************************************************
**
**  onuGponDbBwIdleAllocRemove
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function remove Idle Alloc-Id
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *entry
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwIdleAllocRemove(MV_U32 allocId, MV_U32 *entry)
{
	MV_U32 iEntry;
	MV_U32 entryAllocId;

	for (iEntry = 0 ; iEntry < ONU_GPON_MAX_NUM_OF_T_CONTS ; iEntry++) {
		onuGponDbBwIdleAllocGet(iEntry, &entryAllocId);
		if (entryAllocId == allocId) {
			onuGponDbBwIdleAllocSet(iEntry, PON_ONU_ALLOC_NOT_EXIST);
			*entry = iEntry;
			return(MV_OK);
		}
	}

	return(MV_ERROR);
}

/* ======================================== */
/*   ONU BW TCONT SECTION                   */
/* ======================================== */

/*******************************************************************************
**
**  onuGponDbBwTcontSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set an entry in the T-Cont table
**
**  PARAMETERS:  MV_U32  tcontNum
**               MV_BOOL exist
**               MV_U32  allocId
**               MV_BOOL valid
**
**  OUTPUTS:     None
**
**  RETURNS:     NONE
**
*******************************************************************************/
MV_VOID onuGponDbBwTcontSet(MV_U32  tcontNum,
                              MV_BOOL exist,
                              MV_U32  allocId,
                              MV_BOOL valid)
{
	if (tcontNum < ONU_GPON_MAX_NUM_OF_T_CONTS) {
		onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].exist   = exist;
		onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].allocId = allocId;
		onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].valid   = valid;
	}
}

/*******************************************************************************
**
**  onuGponDbBwTcontGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return an entry from the T-Cont table
**
**  PARAMETERS:  MV_U32  tcontNum
**               MV_BOOL *exist
**               MV_U32  *allocId
**               MV_BOOL *valid
**
**  OUTPUTS:     None
**
**  RETURNS:     NONE
**
*******************************************************************************/
MV_VOID onuGponDbBwTcontGet(MV_U32  tcontNum,
                              MV_BOOL *exist,
                              MV_U32  *allocId,
                              MV_BOOL *valid)
{
	if (tcontNum < ONU_GPON_MAX_NUM_OF_T_CONTS) {
		*exist   = onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].exist;
		*allocId = onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].allocId;
		*valid   = onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].valid;
	}
}

/*******************************************************************************
**
**  onuGponDbBwTcontExist
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return true if T-Cont entry is valid
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_BOOL   *exist
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwTcontExist(MV_U32 tcontNum, MV_BOOL *exist)
{
	if (tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS)
		return(MV_ERROR);

	*exist = onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].exist;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwTcontClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reset T-Cont table entry
**
**  PARAMETERS:  MV_U32 tcontNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwTcontClear(MV_U32 tcontNum)
{
	if ((tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS) ||
		(onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].exist != MV_TRUE))
		return(MV_ERROR);

	onuGponDbBwTcontSet(tcontNum, MV_TRUE, PON_ONU_ALLOC_NOT_EXIST, MV_FALSE);
	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwTcontAlloc
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set T-Cont table entry
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_U32 allocId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwTcontAlloc(MV_U32 tcontNum, MV_U32 allocId)
{
	if ((tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS) ||
		(onuGponDb_s.onuGponBwTbl_s.onuTcontIds[tcontNum].exist != MV_TRUE))
		return(MV_ERROR);

	onuGponDbBwTcontSet(tcontNum, MV_TRUE, allocId, MV_TRUE);
	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwTcontConnectCheck
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return T-Cont table entry according to Alloc-Id
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *tcontNum
**               MV_BOOL   *valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwTcontConnectCheck(MV_U32 allocId, MV_U32 *tcontNum, MV_BOOL *valid)
{
	MV_BOOL exist;
	MV_U32  dbAllocId;
	MV_BOOL dbValid;
	MV_U32  iTcont;

	for (iTcont = 0 ; iTcont < ONU_GPON_MAX_NUM_OF_T_CONTS ; iTcont++) {
		onuGponDbBwTcontGet(iTcont, &exist, &dbAllocId, &dbValid);
		if ((exist == MV_TRUE) && (dbValid == MV_TRUE) && (allocId == dbAllocId)) {
			*valid    = dbValid;
			*tcontNum = iTcont;
			return(MV_OK);
		}
	}

	*valid    = MV_FALSE;
	*tcontNum = 0;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwTcontFreeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return free T-Cont table entry according to Alloc-Id
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 *tcontNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_TRUE if there is a free entry, MV_FALSE otherwise
**
*******************************************************************************/
MV_BOOL onuGponDbBwTcontFreeGet(MV_U32 allocId, MV_U32 *tcontNum)
{
	MV_BOOL exist;
	MV_U32  dbAllocId;
	MV_BOOL dbValid;
	MV_U32  iTcont;
	MV_U32  tempTcont = 0;

	for (iTcont = 0 ; iTcont < ONU_GPON_MAX_NUM_OF_T_CONTS ; iTcont++) {

		onuGponDbBwTcontGet(iTcont, &exist, &dbAllocId, &dbValid);
		if ((exist == MV_TRUE) && (dbValid == MV_FALSE)) {
			*tcontNum = iTcont;
			return(MV_TRUE);
		}

		if (dbAllocId == allocId)
			tempTcont = iTcont;
	}

	*tcontNum = tempTcont;

	return(MV_FALSE);
}

/*******************************************************************************
**
**  onuGponDbBwMapCntDumpSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enables/disables BW MAP counters dump before
**               ONU state changing
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbBwMapCntDumpSet(MV_U32 enable)
{
    onuGponDb_s.onuGponGenTbl_s.onuGponBwMapDumpEn = enable;

    return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbBwMapCntDumpGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns the BW MAP counters dump state
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     enabled/disabled
**
*******************************************************************************/
MV_BOOL onuGponDbBwMapCntDumpGet(void)
{
    return (onuGponDb_s.onuGponGenTbl_s.onuGponBwMapDumpEn);
}

/*******************************************************************************
**
**  onuGponDbDgCallbackSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Dying Gasp Callback in the database
**
**  PARAMETERS:  DYINGGASPFUNC dgCallback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbDgCallbackSet(DYINGGASPFUNC dgCallback)
{
  onuGponDb_s.onuGponGenTbl_s.onuDgCallback = dgCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbDgCallbackGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Dying Gasp Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Dying Gasp Callback
**
*******************************************************************************/
DYINGGASPFUNC onuGponDbDgCallbackGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuDgCallback);
}

/*******************************************************************************
**
**  onuGponDbLinkStatusCallbackSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Link Status Callback in the database
**
**  PARAMETERS:  LINKSTATUSFUNC linkStatusCallback
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponDbLinkStatusCallbackSet(LINKSTATUSFUNC linkStatusCallback)
{
  onuGponDb_s.onuGponGenTbl_s.onuLinkStatusCallback = linkStatusCallback;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbLinkStatusCallbackGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu Link Status Callback
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     Link Status Callback
**
*******************************************************************************/
LINKSTATUSFUNC onuGponDbLinkStatusCallbackGet(void)
{
  return(onuGponDb_s.onuGponGenTbl_s.onuLinkStatusCallback);
}

/*******************************************************************************
**
**  onuGponDbPONIdCountInc
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function increments a PLOAM pon ID msg counter
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponDbPONIdCountInc(void)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponPonIdCount += 1;
}

/*******************************************************************************
**
**  onuGponDbPONIdGetCount
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PLOAM pon ID msg counter
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
MV_U32 onuGponDbPONIdGetCount(void)
{
  return onuGponDb_s.onuGponOperParamsTbl_s.onuGponPonIdCount;
}

/*******************************************************************************
**
**  onuGponDbPONIdTypeABitGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PON Id type A bit (from PON-ID maintenance)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     ponIdTypeABit
**
*******************************************************************************/
MV_U8 onuGponDbPONIdTypeABitGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTypeABit);
}

/*******************************************************************************
**
**  onuGponDbPONIdTypeABitSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PON Id type A bit (from PON-ID maintenance)
**               in the database
**
**  PARAMETERS:  MV_U8 ponIdTypeABit
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPONIdTypeABitSet(MV_U8 ponIdTypeABit)
{
  onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTypeABit = ponIdTypeABit;

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponDbPONIdClassTypeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PONIdClassType (from PON-ID maintenance)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     ponIdClassType
**
*******************************************************************************/
MV_U8 onuGponDbPONIdClassTypeGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType);
}

/*******************************************************************************
**
**  onuGponDbPONIdClassTypeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PONIdClassType (from PON-ID maintenance)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     ponIdClassType
**
*******************************************************************************/
MV_U8* onuGponDbPONIdClassTypeStrGet(void)
{
  MV_U8   *ponIdClassTypeText[] = {"Class A", "Class B","Class B+","Class C","Class C+","reserved"};
  MV_U8   *ret;

  if (onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType > ONU_GPON_PON_ID_TYPE_CLASS_MAX)
  {
    ret = ponIdClassTypeText[ONU_GPON_PON_ID_TYPE_CLASS_MAX];
  }
  else
  {
    ret = ponIdClassTypeText[onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType];
  }
  return ret;
}

/*******************************************************************************
**
**  onuGponDbPONIdClassTypeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PONIdClassType (from PON-ID maintenance)
**               in the database
**
**  PARAMETERS:  MV_U8 ponIdClassType
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPONIdClassTypeSet(MV_U8 ponIdClassType)
{
  MV_STATUS ret = MV_OK;

  if (ponIdClassType > ONU_GPON_PON_ID_TYPE_CLASS_MAX)
  {
    ret = MV_BAD_PARAM;
  }
  else
  {
    onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdClassType = ponIdClassType;
  }

  return(ret);
}

/*******************************************************************************
**
**  onuGponDbPONIdBytesInfoGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PONId bytes info array (from PON-ID maintenance)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     ponIdBytesInfo
**
*******************************************************************************/
void onuGponDbPONIdBytesInfoGet(MV_U8 *ponIdBytesInfo)
{
  memcpy(ponIdBytesInfo, &(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdBytesInfo[0]), ONU_GPON_PON_ID_BYTES_LEN);
}

/*******************************************************************************
**
**  onuGponDbPONIdBytesInfoSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PONId bytes info array (from PON-ID maintenance)
**               in the database
**
**  PARAMETERS:  MV_U8* ponIdBytesInfo
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPONIdBytesInfoSet(MV_U8 *ponIdBytesInfo)
{
  MV_STATUS ret = MV_OK;

  if (ponIdBytesInfo == NULL)
  {
    ret = MV_BAD_PARAM;
  }
  else
  {
    memcpy(&(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdBytesInfo[0]), ponIdBytesInfo, ONU_GPON_PON_ID_BYTES_LEN);
  }

  return(ret);
}

/*******************************************************************************
**
**  onuGponDbPONIdOpticalLevelGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns PONId Tx Optical Level (from PON-ID maintenance)
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onuGponPONIdTxOpticalLevel
**
*******************************************************************************/
MV_U16 onuGponDbPONIdOpticalLevelGet(void)
{
  return(onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTxOpticalLevel);
}

/*******************************************************************************
**
**  onuGponDbPONIdOpticalLevelSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PONId Tx Optical Level (from PON-ID maintenance)
**               in the database
**
**  PARAMETERS:  MV_U16 ponIdTxOpticalLevel
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponDbPONIdOpticalLevelSet(MV_U16 ponIdTxOpticalLevel)
{
  MV_STATUS ret = MV_OK;

  onuGponDb_s.onuGponOperParamsTbl_s.onuGponPONIdTxOpticalLevel = ponIdTxOpticalLevel;

  return(ret);
}

