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

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

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

/* Global Variables
------------------------------------------------------------------------------*/
S_GponPm g_OnuGponOutPm;

MV_U32  g_UponDebugMode = 0;
extern u8 mvMacAddr[CONFIG_MV_ETH_PORTS_NUM][MV_MAC_ADDR_SIZE];

/* Local Variables
------------------------------------------------------------------------------*/
#ifdef MV_GPON_STATIC_GEM_PORT
MV_U32 staticGemPortConfig[4096];
MV_U32 staticGemPortConfigFlag  = 0;
#endif /* MV_GPON_STATIC_GEM_PORT */

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

/* Local Functions
------------------------------------------------------------------------------*/
MV_STATUS onuGponApiGemPortIdConfig(MV_U32 gemPortid);

/******************************************************************************/
/* ========================================================================== */
/*                         Initialization Section                             */
/* ========================================================================== */
/******************************************************************************/
/*******************************************************************************
**
**  onuGponApiInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu gpon API
**
**  PARAMETERS:  MV_U8 *serialNumber
**               MV_U8 *password
**               MV_BOOL  disabled
**               MV_U32   sn_src
**               MV_U32 fecHyst
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiInit(MV_U8 *serialNumber, 
                         MV_U8 *password, 
                         MV_BOOL disabled, 
                         MV_U32 sn_src, 
                         MV_U32 fecHyst, 
                         MV_U32 couplingMode)
{
  MV_STATUS rcode;
  MV_U32    i;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiInit Serial number (%s) Password (%s)\n",
             __FILE_DESC__, __LINE__, serialNumber, password);
#endif /* MV_GPON_DEBUG_PRINT */

  onuGponDbPasswordSet(password);
  if (sn_src == 1)
  {
    /*the digit part of the serial number is taken from the 4lower pairs of the MAC address*/
    for (i = 0; i < 4; i++)
	{
      serialNumber[i+4] = mvMacAddr[2][i+2];
    }
  }

  rcode = onuGponSrvcSerialNumberSet(serialNumber);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponSrvcSerialNumberSet", __FILE_DESC__, __LINE__);
    return rcode;
  }

    rcode = mvOnuGponMacRxFecHysteresisSet(fecHyst);
    if (rcode != MV_OK)
    {
        mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
                   "ERROR: (%s:%d) mvOnuGponMacRxFecHysteresisSet", __FILE_DESC__, __LINE__);
        return rcode;
    }

    rcode = onuGponApiCouplingModeSet(couplingMode);
    if (rcode != MV_OK)
    {
        mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
                   "ERROR: (%s:%d) mvOnuGponMacCouplingModeSet", __FILE_DESC__, __LINE__);
        return rcode;
    }

  /*rcode = onuGponSrvcRangingRandomInit();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponRangingRandomInit", __FILE_DESC__, __LINE__);
    return rcode;
  }*/

  if (disabled == MV_TRUE)
  {
    /* update asic */
    rcode = mvOnuGponMacOnuStateSet(ONU_GPON_07_EMERGANCY_STOP);
    if (rcode != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
                 "ERROR: (%s:%d) mvOnuGponMacOnuStateSet", __FILE_DESC__, __LINE__);
      return(rcode);
    }

    /* update database */
    onuGponDbOnuStateSet(ONU_GPON_07_EMERGANCY_STOP);
  }

  memset(&g_OnuGponOutPm, 0, sizeof (S_GponPm));

  onuGponDbInitSet(MV_TRUE);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiAlarmNotifyRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register alarm callback function
**
**  PARAMETERS:  ALARMNOTIFYFUNC notifyCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiAlarmNotifyRegister(ALARMNOTIFYFUNC notifyCallBack)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiAlarmNotifyRegister\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponDbAlarmNotifySet(notifyCallBack);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiAlarmNotifyRegister", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiStatusNotifyRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register status callback function
**
**  PARAMETERS:  STATUSNOTIFYFUNC notifyCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiStatusNotifyRegister(STATUSNOTIFYFUNC notifyCallBack)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiStatusNotifyRegister\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponDbStatusNotifySet(notifyCallBack);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiStatusNotifyRegister", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiOmccNotifyRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register omcc callback function
**
**  PARAMETERS:  OMCCNOTIFYFUNC notifyCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiOmccNotifyRegister(OMCCNOTIFYFUNC notifyCallBack)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiOmccNotifyRegister\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponDbOmccNotifySet(notifyCallBack);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiOmccNotifyRegister", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiDisableNotifyRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register disable onu callback function
**
**  PARAMETERS:  DISABLENOTIFYFUNC notifyCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiDisableNotifyRegister(DISABLENOTIFYFUNC notifyCallBack)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiDisableNotifyRegister\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponDbDisableNotifySet(notifyCallBack);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiDisableNotifyRegister", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiTcontConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function validates and configures Alloc-Id to T-cont
**
**  PARAMETERS:  MV_U32 allocId
**               MV_U32 tcontId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiTcontConfig(MV_U32 allocId, MV_U32 tcontId)
{
  MV_STATUS  rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiTcontConfig alloc Id (%d) tcont (%d)\n",
             __FILE_DESC__, __LINE__, allocId, tcontId);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponAllocIdTcontSet(allocId,tcontId);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiTcontConfig", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiBerThresholdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures the SD / SF thresholds for GPON ONU
**
**  PARAMETERS:  MV_U32 sd
**               MV_U32 sf
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiBerThresholdConfig(MV_U32 sd, MV_U32 sf)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiBerThresholdConfig sd (%d) sf (%d)\n",
             __FILE_DESC__, __LINE__, sd, sf);
#endif /* MV_GPON_DEBUG_PRINT */

  if ((sf >= sd) ||
      (sf > ONU_GPON_MAX_SF_THRESHOLD) || (sf < ONU_GPON_MIN_SF_THRESHOLD) ||
      (sd > ONU_GPON_MAX_SD_THRESHOLD) || (sd < ONU_GPON_MIN_SD_THRESHOLD))
  {
    /* SD threshold must be higher than SF */
    return(MV_ERROR);
  }

  rcode = onuGponDbSdThresholdSet(sd);
  rcode |= onuGponDbSfThresholdSet(sf);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiBerThresholdConfig", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiBerIntervalConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures the ONU BER interval,
**               which defines the time the ONU send BER information
**
**  PARAMETERS:  MV_U32 interval
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK.
**
*******************************************************************************/
MV_STATUS onuGponApiBerIntervalConfig(MV_U32 interval)
{
#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiBerIntervalConfig interval (%d)\n",
             __FILE_DESC__, __LINE__, interval);
#endif /* MV_GPON_DEBUG_PRINT */

  onuGponBerIntervalSet(interval);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiBerCoefficientConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures the BER coefficient, which are used
**               in the BER Calculation formula
**
**  PARAMETERS:  MV_U32 denominator
**               MV_U32 numerator
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponApiBerCoefficientConfig(MV_U32 denominator, MV_U32 numerator)
{
  S_BerCoefficient coef;

  coef.denominator = denominator;
  coef.numerator   = numerator;
  onuGponBerCoefficientSet(&coef);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiTcontClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears all Alloc-Ids from T-cont
**
**  PARAMETERS:  MV_U32 tcontId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiTcontClear(MV_U32 tcontId)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiTcontClear tcontId (%d)\n",
             __FILE_DESC__, __LINE__, tcontId);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponAllocIdTcontClear(tcontId);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiTcontClear", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiTcontsReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears all Alloc-Ids from all T-conts
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiTcontsReset(void)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiTcontsReset\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponAllocIdTcontClearAll();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiTcontsReset", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiGemConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Adds or removes a gem port by the action
**
**  PARAMETERS:  gemmap bit map, corresponding action per this group
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemConfig(MV_U32* gemmap, E_GponIoctlGemAction action){

    MV_U32 index, bit, mask;
    MV_U32 portId;
    MV_STATUS rcode = MV_OK;

    for (index = 0; index < GPON_ONU_MAX_GEM_PORTS/32; index ++) {

                if (gemmap[index] != 0 ) {

            mask = 1;
            for (bit = 0 ; bit < 32 ; bit ++) {

                if (gemmap[index] & mask)
                {
                    portId = index*32+bit;
                    if (action != E_GEPON_IOCTL_GEM_REMOVE) {

                        rcode  = onuGponApiGemPortIdConfig(portId);
                        if (rcode != MV_OK)
                        {
                              mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
                                         "ERROR: (%s:%d) onuGponApiGemConfig", __FILE_DESC__, __LINE__);
                              break;
                        }
                        if (onuGponDbGemPortAesGet(portId) == MV_TRUE) {
                            /*update HW as well*/
                            mvOnuGponMacAesPortIdSet(portId,MV_TRUE);
                        }
                    }
                    else{
                        rcode  = onuGponApiGemPortIdClear(portId);
                        if (rcode != MV_OK)
                        {
                              mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
                                         "ERROR: (%s:%d) onuGponApiGemConfig", __FILE_DESC__, __LINE__);
                              break;
                        }
                        if (onuGponDbGemPortAesGet(portId) == MV_TRUE) {
                            /*remove HW configuration but keep SW encryption indication*/
                            mvOnuGponMacAesPortIdSet(portId,MV_FALSE);
                        }
                    }

                }
                mask = mask << 1;
            }
        }
    }

    return rcode;



}
/*******************************************************************************
**
**  onuGponApiGemClearAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function removes all gem port
**
**  PARAMETERS:  savePorts
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemClearAll(MV_BOOL savePorts)
{
	if (savePorts == MV_TRUE)
		onuGponDbGemPortSaveAll();

	onuGponDbGemPortClearAll();
	mvOnuGponMacGemInit();
	/*reconfigure omcc port*/
	onuGponApiGemPortIdConfig(onuGponDbOmccPortGet());

	return MV_OK;
}
/*******************************************************************************
**
**  onuGponApiGemRestoreAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function restores all previously saved gem ports
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemRestoreAll(void)
{
	MV_U32    gemPortId;
	MV_STATUS rcode = MV_OK;

	for (gemPortId = 0; gemPortId < GPON_ONU_MAX_GEM_PORTS; gemPortId++) {

		if (onuGponDbGemPortSavedValidGet(gemPortId) == MV_TRUE)
			rcode = onuGponApiGemPortIdConfig(gemPortId);

		if (rcode != MV_OK)
			break;
	}

	return (rcode);
}

/*******************************************************************************
**
**  onuGponApiGemOmccIdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure omcc port Id
**
**  PARAMETERS:  MV_U32 gemPortid
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemOmccIdConfig(MV_U32 gemPortid, MV_BOOL valid)
{
  MV_STATUS rcode;
#ifdef MV_GPON_STATIC_GEM_PORT
  MV_U32 index;
#endif /* MV_GPON_STATIC_GEM_PORT */

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiGemOmcctIdConfig gemPortid (%d) valid (%d)\n",
             __FILE_DESC__, __LINE__, gemPortid, valid);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = mvOnuGponMacGemOmciPortIdSet(gemPortid, (valid == MV_TRUE) ? (1) : (0)); /* Rx */
  rcode |= mvOnuGponMacUtmOmciPortIdSet(gemPortid, (valid == MV_TRUE) ? (1) : (0)); /* Tx */
  rcode |= mvOnuGponMacPortIdValidSet(gemPortid, valid);                         /* Gem Port-Id Valid Table */

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiGemOmcctIdConfig", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  onuGponDbGemPortValidSet(gemPortid, valid);

#ifdef MV_GPON_STATIC_GEM_PORT
  if (staticGemPortConfigFlag != 0)
  {
    for (index = 0; index < 4096; index++)
    {
      if (staticGemPortConfig[index] != 0)
      {
        onuGponApiGemPortIdConfig(index);
      }
    }
  }
#endif /* MV_GPON_STATIC_GEM_PORT */

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiGemPortIdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure gem port Id from MAC
**
**  PARAMETERS:  MV_U32 gemPortid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortIdConfig(MV_U32 gemPortid)
{
  MV_STATUS  rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiGemPortIdConfig gemPortid (%d)\n",
             __FILE_DESC__, __LINE__, gemPortid);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = mvOnuGponMacPortIdValidSet(gemPortid, MV_TRUE);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiGemPortIdConfig", __FILE_DESC__, __LINE__);
    return(rcode);
  }
  onuGponDbGemPortValidSet(gemPortid, MV_TRUE);

#ifdef MV_GPON_STATIC_GEM_PORT
  if (staticGemPortConfigFlag == 0)
  {
    if (gemPortid < 4096)
      staticGemPortConfig[gemPortid] = 1;
  }
#endif /* MV_GPON_STATIC_GEM_PORT */

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiGemPortIdClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears gem port Id from MAC
**
**  PARAMETERS:  MV_U32 gemPortid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortIdClear(MV_U32 gemPortid)
{
  MV_STATUS  rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiGemPortIdClear gemPortid (%d)\n",
             __FILE_DESC__, __LINE__, gemPortid);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = mvOnuGponMacPortIdValidSet(gemPortid, MV_FALSE);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiGemPortIdClear", __FILE_DESC__, __LINE__);
    return(rcode);
  }
  onuGponDbGemPortValidSet(gemPortid, MV_FALSE);

  return(rcode);
}

#ifdef MV_GPON_STATIC_GEM_PORT

/*******************************************************************************
**
**  onuGponApiGemPortIdStaticConfigReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears dummy gem port Id table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortIdStaticConfigFlag(MV_U32 flag)
{
   staticGemPortConfigFlag = flag;
   return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiGemPortIdStaticConfigReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears dummy gem port Id table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortIdStaticConfigReset(void)
{
  MV_U32 index;

  for(index = 0; index < 4096; index++)
  {
    staticGemPortConfig[index] = 0;
  }

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

/*******************************************************************************
**
**  onuGponApiInformationGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu info
**
**  PARAMETERS:  S_OnuInfo *onuInfo
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponApiInformationGet(S_OnuInfo *onuInfo)
{
  onuGponDbPasswordGet(onuInfo->password);
  onuGponDbSerialNumGet(onuInfo->serialNumber);
  onuInfo->onuId             = onuGponDbOnuIdGet();
  onuInfo->state             = onuGponDbOnuStateGet();
  onuInfo->sdThreshold       = onuGponDbSdThresholdGet();
  onuInfo->sfThreshold       = onuGponDbSfThresholdGet();
  onuInfo->localBerInterval  = onuGponDbBerCalcIntervalGet();
  onuInfo->remoteBerInterval = onuGponDbBerIntervalGet();
  onuInfo->omccPortId        = onuGponDbOmccPortGet();
  onuInfo->constDelay        = onuGponDbConstDelayGet();
  onuInfo->eqDelay           = onuGponDbEqualizationDelayGet();

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiAlarmsGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu alarms bit map
**
**  PARAMETERS:  MV_U32 *alarms
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiAlarmsGet(MV_U32 *alarms)
{
  MV_U32  i;
  MV_U32  status;

  *alarms = 0;
  for (i = ONU_GPON_ALARM_LOS ; i < ONU_GPON_MAX_ALARMS ; i++)
  {
    status = onuGponAlarmGet(i);
    if (status == ONU_GPON_ALARM_ON)
    {
      *alarms |= 1 << i;
    }
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponPmFecPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               FEC PM counters
**
**  PARAMETERS:  S_IoctlFecPm *fecPm
**               MV_BOOL      a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiPmFecPmGet(S_GponIoctlFecPm *fecPm, MV_BOOL a_clear)
{
  MV_STATUS rcode;
  S_RxFecPm inCounters;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiPmFecPmGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponPmFecPmGet(&inCounters);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiPmFecPmGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  fecPm->receivedBytes        = inCounters.receivedBytes        - g_OnuGponOutPm.rxFec.receivedBytes;
  fecPm->correctedBytes       = inCounters.correctedBytes       - g_OnuGponOutPm.rxFec.correctedBytes;
  fecPm->correctedBits        = inCounters.correctedBits        - g_OnuGponOutPm.rxFec.correctedBits;
  fecPm->receivedCodeWords    = inCounters.receivedCodeWords    - g_OnuGponOutPm.rxFec.receivedCodeWords;
  fecPm->uncorrectedCodeWords = inCounters.uncorrectedCodeWords - g_OnuGponOutPm.rxFec.uncorrectedCodeWords;

  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.rxFec.receivedBytes        = inCounters.receivedBytes;
    g_OnuGponOutPm.rxFec.correctedBytes       = inCounters.correctedBytes;
    g_OnuGponOutPm.rxFec.correctedBits        = inCounters.correctedBits;
    g_OnuGponOutPm.rxFec.receivedCodeWords    = inCounters.receivedCodeWords;
    g_OnuGponOutPm.rxFec.uncorrectedCodeWords = inCounters.uncorrectedCodeWords;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiPmRxPloamPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Rx Ploam counters
**
**  PARAMETERS:  S_IoctlPloamRxPm *rxPloamPm
**               MV_BOOL           a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiPmRxPloamPmGet(S_GponIoctlPloamRxPm *rxPloamPm, MV_BOOL a_clear)
{
  MV_STATUS   rcode;
  S_RxPloamPm inCounters;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiPmRxPloamPmGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponPmRxPloamPmGet(&inCounters);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiPmRxPloamPmGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  rxPloamPm->rxCrcErrorPloam      = inCounters.crcErrorPloamCounter          - g_OnuGponOutPm.rxPloam.crcErrorPloamCounter;
  rxPloamPm->rxBroadcastPloam     = inCounters.receivedBroadcastPloamCounter - g_OnuGponOutPm.rxPloam.receivedBroadcastPloamCounter;
  rxPloamPm->rxOnuIdPloam         = inCounters.receivedOnuIdPloamCounter     - g_OnuGponOutPm.rxPloam.receivedOnuIdPloamCounter;
  rxPloamPm->rxFifoOverErrorPloam = inCounters.fifoOverErrorPloamCounter     - g_OnuGponOutPm.rxPloam.fifoOverErrorPloamCounter;
  rxPloamPm->rxIdlePloam          = inCounters.idlePloamCounter              - g_OnuGponOutPm.rxPloam.idlePloamCounter;
  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.rxPloam.crcErrorPloamCounter          = inCounters.crcErrorPloamCounter;
    g_OnuGponOutPm.rxPloam.receivedBroadcastPloamCounter = inCounters.receivedBroadcastPloamCounter;
    g_OnuGponOutPm.rxPloam.receivedOnuIdPloamCounter     = inCounters.receivedOnuIdPloamCounter;
    g_OnuGponOutPm.rxPloam.fifoOverErrorPloamCounter     = inCounters.fifoOverErrorPloamCounter;
    g_OnuGponOutPm.rxPloam.idlePloamCounter              = inCounters.idlePloamCounter;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiPmTxPloamPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Tx Ploam counters
**
**  PARAMETERS:  S_TxPloamAdvApiPm *txPloamPm
**               S_RxPloamAdvApiPm *rxPloamPm
**               MV_BOOL              a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiAdvancedPloamsCounterGet(S_GponIoctlPloamTxPm *txPloamPm,
                                             S_GponIoctlPloamRxPm *rxPloamPm,
                                             MV_BOOL a_clear)
{
  MV_STATUS   status;
  S_TxPloamPm inCounters1;
  S_RxPloamPm inCounters2;
  MV_U32       numOfDsMsgIdIndex;
  MV_U32       numOfUsMsgIdIndex;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiAdvancedPloamsCounterGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  status  = onuGponPmTxPloamPmGet(&inCounters1);
  status |= onuGponPmRxPloamPmGet(&inCounters2);

  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiAdvancedPloamsCounterGet", __FILE_DESC__, __LINE__);
    return status;
  }

  txPloamPm->txMsgTotalPloam = inCounters1.txMsgTotalPloamCounter - g_OnuGponOutPm.txPloam.txMsgTotalPloamCounter;

  for (numOfUsMsgIdIndex = 1 ;numOfUsMsgIdIndex <= ONU_GPON_US_MSG_LAST ;numOfUsMsgIdIndex++)
  {
    txPloamPm->txMsgIdPloam[numOfUsMsgIdIndex]    = inCounters1.txMsgIdPloamCounter[numOfUsMsgIdIndex]    -
                                                    g_OnuGponOutPm.txPloam.txMsgIdPloamCounter[numOfUsMsgIdIndex];
    txPloamPm->txErrMsgIdPloam[numOfUsMsgIdIndex] = inCounters1.txErrMsgIdPloamCounter[numOfUsMsgIdIndex] -
                                                    g_OnuGponOutPm.txPloam.txErrMsgIdPloamCounter[numOfUsMsgIdIndex];
  }

  rxPloamPm->rxMsgTotalPloam = inCounters2.rxMsgTotalPloamCounter - g_OnuGponOutPm.rxPloam.rxMsgTotalPloamCounter;

  for (numOfDsMsgIdIndex = 0 ;numOfDsMsgIdIndex <= ONU_GPON_DS_MSG_LAST ;numOfDsMsgIdIndex++)
  {
    rxPloamPm->rxMsgIdPloam[numOfDsMsgIdIndex] = inCounters2.rxMsgIdPloamCounter[numOfDsMsgIdIndex]-
                                                 g_OnuGponOutPm.rxPloam.rxMsgIdPloamCounter[numOfDsMsgIdIndex];
  }

  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.txPloam.txMsgTotalPloamCounter = inCounters1.txMsgTotalPloamCounter;

    for (numOfUsMsgIdIndex = 0 ;numOfUsMsgIdIndex <= ONU_GPON_US_MSG_LAST ;numOfUsMsgIdIndex++)
    {
      g_OnuGponOutPm.txPloam.txErrMsgIdPloamCounter[numOfUsMsgIdIndex] = inCounters1.txErrMsgIdPloamCounter[numOfUsMsgIdIndex];
      g_OnuGponOutPm.txPloam.txMsgIdPloamCounter[numOfUsMsgIdIndex]    = inCounters1.txMsgIdPloamCounter[numOfUsMsgIdIndex];
    }

    g_OnuGponOutPm.rxPloam.rxMsgTotalPloamCounter = inCounters2.rxMsgTotalPloamCounter;

    for (numOfDsMsgIdIndex = 0 ;numOfDsMsgIdIndex <= ONU_GPON_DS_MSG_LAST ;numOfDsMsgIdIndex++)
    {
      g_OnuGponOutPm.rxPloam.rxMsgIdPloamCounter[numOfDsMsgIdIndex] = inCounters2.rxMsgIdPloamCounter[numOfDsMsgIdIndex];

    }
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiPmRxBwMapPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Rx Bw Map counters
**
**  PARAMETERS:  S_RxBwMapApiPm *rxBwMapPm
**               MV_BOOL           a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiPmRxBwMapPmGet(S_GponIoctlBwMapPm *rxBwMapPm, MV_BOOL a_clear)
{
  MV_STATUS   rcode;
  S_RxBwMapPm inCounters;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiPmRxBwMapPmGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponPmRxBwMapPmGet(&inCounters);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiPmRxBwMapPmGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  rxBwMapPm->allocCorrec              = inCounters.allocCorrec              - g_OnuGponOutPm.rxBwMap.allocCorrec;
  rxBwMapPm->allocCorrectableCrcErr   = inCounters.allocCorrectableCrcErr   - g_OnuGponOutPm.rxBwMap.allocCorrectableCrcErr;
  rxBwMapPm->allocCrcErr              = inCounters.allocCrcErr              - g_OnuGponOutPm.rxBwMap.allocCrcErr;
  rxBwMapPm->allocUnCorrectableCrcErr = inCounters.allocUnCorrectableCrcErr - g_OnuGponOutPm.rxBwMap.allocUnCorrectableCrcErr;
  rxBwMapPm->totalReceivedAllocBytes  = inCounters.totalReceivedAllocBytes  - g_OnuGponOutPm.rxBwMap.totalReceivedAllocBytes;

  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.rxBwMap.allocCorrec              = inCounters.allocCorrec;
    g_OnuGponOutPm.rxBwMap.allocCorrectableCrcErr   = inCounters.allocCorrectableCrcErr;
    g_OnuGponOutPm.rxBwMap.allocCrcErr              = inCounters.allocCrcErr;
    g_OnuGponOutPm.rxBwMap.allocUnCorrectableCrcErr = inCounters.allocUnCorrectableCrcErr;
    g_OnuGponOutPm.rxBwMap.totalReceivedAllocBytes  = inCounters.totalReceivedAllocBytes;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiPmRxBwMapPmDumpSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable dump BW MAP counters before
**               ONU state changing
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiPmRxBwMapPmDumpSet(MV_BOOL enable)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiPmRxBwMapPmDumpSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  if (enable == MV_TRUE)
  {
      onuPonTimerDisable(&onuPonResourceTbl_s.onuPonPmTimerId);
  }
  else
  {
      onuPonTimerEnable(&onuPonResourceTbl_s.onuPonPmTimerId);
  }

  rcode  = onuGponDbBwMapCntDumpSet(enable);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiExtendedBurstDelaySet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiPmRxBwMapPmDump
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu bw map counters
**
**  PARAMETERS:  MV_U32 currstate
**               MV_U32 newstate
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponApiPmRxBwMapPmDump(MV_U32 currstate, MV_U32 newstate)
{
  MV_STATUS          rcode;
  S_GponIoctlBwMapPm counters;

 // MV_U8 *counterText[] = {"Alloc Crc Error               ",
 //                         "Alloc Correctable Crc Error   ",
 //                         "Alloc UnCorrectable Crc Error ",
 //                         "Alloc Correct                 ",
 //                         "Total Received Alloc Bytes    "};

  rcode = onuGponApiPmRxBwMapPmGet(&counters, MV_TRUE);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_API_MODULE,
               "%s:%d, failed to get counters value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  //printk("\n");
  //printk("------------------------------------------------------------\n");
  printk("ONT STATE CHANGING: FROM [%d] TO [%d] - allocCor[%10u]\n",
          currstate, newstate, counters.allocCorrec);
  //printk("-------------------------------------------------------------\n");
  //printk("| BWMAP COUNTERS                  |   VALUE    |\n");
  //printk("------------------------------------------------\n");
  //printk(" %s   | %10u |\n", counterText[0],counters.allocCrcErr);
  //printk(" %s   | %10u |\n", counterText[1],counters.allocCorrectableCrcErr);
  //printk(" %s   | %10u |\n", counterText[2],counters.allocUnCorrectableCrcErr);
  //printk(" %s   | %10u |\n", counterText[3],counters.allocCorrec);
  //printk(" %s   | %10u |\n", counterText[4],counters.totalReceivedAllocBytes);
  //printk("------------------------------------------------\n");
}

/*******************************************************************************
**
**  onuGponApiPmRxStandardPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Rx Standard counters
**
**  PARAMETERS:  S_RxStandardApiPm *rxStandardPm
**               MV_BOOL              a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiPmRxStandardPmGet(S_RxStandardApiPm *rxStandardPm, MV_BOOL a_clear)
{
  MV_STATUS   rcode;
  S_RxBip8Pm  inCounter1;
  S_RxPlendPm inCounter2;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiPmRxStandardPmGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponPmRxBip8PmGet(&inCounter1);
  rcode |= onuGponPmRxPlendPmGet(&inCounter2);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiPmRxStandardPmGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  rxStandardPm->bip8  = inCounter1.bip8  - g_OnuGponOutPm.rxBip8.bip8;
  rxStandardPm->plend = inCounter2.plend - g_OnuGponOutPm.rxPlend.plend;

  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.rxBip8.bip8   = inCounter1.bip8;
    g_OnuGponOutPm.rxPlend.plend = inCounter2.plend;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiGemRxCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               GEM counters
**
**  PARAMETERS:  S_IoctlGemRxPm *gemPm
**               MV_BOOL         a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemRxCounterGet(S_GponIoctlGemRxPm *gemPm, MV_BOOL a_clear)
{
  MV_STATUS rcode;
  S_GemPm   inCounters;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiGemCounterGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = onuGponPmGemPmGet(&inCounters);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiGemCounterGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  gemPm->gemRxIdleGemFrames                              = inCounters.receivedIdleGemFrames               -
                                                           g_OnuGponOutPm.gem.receivedIdleGemFrames;
  gemPm->gemRxValidGemFrames                             = inCounters.receivedValidGemFrames              -
                                                           g_OnuGponOutPm.gem.receivedValidGemFrames;
  gemPm->gemRxUndefinedGemFrames                         = inCounters.receivedUndefinedGemFrames          -
                                                           g_OnuGponOutPm.gem.receivedUndefinedGemFrames;
  gemPm->gemRxOmciFrames                                 = inCounters.receivedOmciFrames                  -
                                                           g_OnuGponOutPm.gem.receivedOmciFrames;
  gemPm->gemRxDroppedGemFrames                           = inCounters.droppedGemFrames                    -
                                                           g_OnuGponOutPm.gem.droppedGemFrames;
  gemPm->gemRxDroppedOmciFrames                          = inCounters.droppedOmciFrames                   -
                                                           g_OnuGponOutPm.gem.droppedOmciFrames;
  gemPm->gemRxGemFramesWithUncorrHecErr                  = inCounters.receivedGemFramesWithUncorrHecErr   -
                                                           g_OnuGponOutPm.gem.receivedGemFramesWithUncorrHecErr;
  gemPm->gemRxGemFramesWithOneFixedHecErr                = inCounters.receivedGemFramesWithOneFixedHecErr -
                                                           g_OnuGponOutPm.gem.receivedGemFramesWithOneFixedHecErr;
  gemPm->gemRxGemFramesWithTwoFixedHecErr                = inCounters.receivedGemFramesWithTwoFixedHecErr -
                                                           g_OnuGponOutPm.gem.receivedGemFramesWithTwoFixedHecErr;
  gemPm->gemRxTotalByteCountOfReceivedValidGemFrames     = inCounters.totalByteCountOfReceivedValidGemFrames     -
                                                           g_OnuGponOutPm.gem.totalByteCountOfReceivedValidGemFrames;
  gemPm->gemRxTotalByteCountOfReceivedUndefinedGemFrames = inCounters.totalByteCountOfReceivedUndefinedGemFrames -
                                                           g_OnuGponOutPm.gem.totalByteCountOfReceivedUndefinedGemFrames;
  gemPm->gemRxGemReassembleMemoryFlush                   = inCounters.gemReassembleMemoryFlush            -
                                                           g_OnuGponOutPm.gem.gemReassembleMemoryFlush;
  gemPm->gemRxGemSynchLost                               = inCounters.gemSynchLost                        -
                                                           g_OnuGponOutPm.gem.gemSynchLost;
  gemPm->gemRxEthFramesWithCorrFcs                       = inCounters.receivedEthFramesWithCorrFcs        -
                                                           g_OnuGponOutPm.gem.receivedEthFramesWithCorrFcs;
  gemPm->gemRxEthFramesWithFcsError                      = inCounters.receivedEthFramesWithFcsError       -
                                                           g_OnuGponOutPm.gem.receivedEthFramesWithFcsError;
  gemPm->gemRxOmciFramesWithCorrCrc                      = inCounters.receivedOmciFramesWithCorrCrc       -
                                                           g_OnuGponOutPm.gem.receivedOmciFramesWithCorrCrc;
  gemPm->gemRxOmciFramesWithCrcError                     = inCounters.receivedOmciFramesWithCrcError      -
                                                           g_OnuGponOutPm.gem.receivedOmciFramesWithCrcError;
  if (a_clear == MV_TRUE)
  {
    g_OnuGponOutPm.gem.receivedIdleGemFrames                      = inCounters.receivedIdleGemFrames;
    g_OnuGponOutPm.gem.receivedValidGemFrames                     = inCounters.receivedValidGemFrames;
    g_OnuGponOutPm.gem.receivedUndefinedGemFrames                 = inCounters.receivedUndefinedGemFrames;
    g_OnuGponOutPm.gem.receivedOmciFrames                         = inCounters.receivedOmciFrames;
    g_OnuGponOutPm.gem.droppedGemFrames                           = inCounters.droppedGemFrames;
    g_OnuGponOutPm.gem.droppedOmciFrames                          = inCounters.droppedOmciFrames;
    g_OnuGponOutPm.gem.receivedGemFramesWithUncorrHecErr          = inCounters.receivedGemFramesWithUncorrHecErr;
    g_OnuGponOutPm.gem.receivedGemFramesWithOneFixedHecErr        = inCounters.receivedGemFramesWithOneFixedHecErr;
    g_OnuGponOutPm.gem.receivedGemFramesWithTwoFixedHecErr        = inCounters.receivedGemFramesWithTwoFixedHecErr;
    g_OnuGponOutPm.gem.totalByteCountOfReceivedValidGemFrames     = inCounters.totalByteCountOfReceivedValidGemFrames;
    g_OnuGponOutPm.gem.totalByteCountOfReceivedUndefinedGemFrames = inCounters.totalByteCountOfReceivedUndefinedGemFrames;
    g_OnuGponOutPm.gem.gemReassembleMemoryFlush                   = inCounters.gemReassembleMemoryFlush;
    g_OnuGponOutPm.gem.gemSynchLost                               = inCounters.gemSynchLost;
    g_OnuGponOutPm.gem.receivedEthFramesWithCorrFcs               = inCounters.receivedEthFramesWithCorrFcs;
    g_OnuGponOutPm.gem.receivedEthFramesWithFcsError              = inCounters.receivedEthFramesWithFcsError;
    g_OnuGponOutPm.gem.receivedOmciFramesWithCorrCrc              = inCounters.receivedOmciFramesWithCorrCrc;
    g_OnuGponOutPm.gem.receivedOmciFramesWithCrcError             = inCounters.receivedOmciFramesWithCrcError;
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiGemTxCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Tx counters
**
**  PARAMETERS:  S_TxApiPm *txPm
**               MV_BOOL       a_clear
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemTxCounterGet(S_GponIoctlGemTxPm *txPm, MV_BOOL a_clear)
{
	MV_STATUS  rcode;
	S_GponTxPm inCounters;
	MV_U32     tcont;
	MV_BOOL    exist;

#ifdef MV_GPON_DEBUG_PRINT
	mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
			   "DEBUG: (%s:%d) onuGponApiTxCounterGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

	rcode = onuGponPmTxPmGet(&inCounters);
	if (rcode != MV_OK) {
		mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
				   "ERROR: (%s:%d) onuGponApiTxCounterGet", __FILE_DESC__, __LINE__);
		return(rcode);
	}

	txPm->gemTxGemPtiTypeOneFrames  = inCounters.transmittedGemPtiTypeOneFrames  - g_OnuGponOutPm.tx.transmittedGemPtiTypeOneFrames;
	txPm->gemTxGemPtiTypeZeroFrames = inCounters.transmittedGemPtiTypeZeroFrames - g_OnuGponOutPm.tx.transmittedGemPtiTypeZeroFrames;
	txPm->gemTxIdleGemFrames        = inCounters.transmittedIdleGemFrames        - g_OnuGponOutPm.tx.transmittedIdleGemFrames;

	for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++) {
		rcode = onuGponDbBwTcontExist(tcont, &exist);
		if ((rcode == MV_OK) && (exist != MV_FALSE)) {
			txPm->gemTxEthFramesViaTconti[tcont]     = inCounters.transmittedEthFramesViaTconti[tcont]     - g_OnuGponOutPm.tx.transmittedEthFramesViaTconti[tcont];
			txPm->gemTxEthBytesViaTconti[tcont]      = inCounters.transmittedEthBytesViaTconti[tcont]      - g_OnuGponOutPm.tx.transmittedEthBytesViaTconti[tcont];
			txPm->gemTxGemFramesViaTconti[tcont]     = inCounters.transmittedGemFramesViaTconti[tcont]     - g_OnuGponOutPm.tx.transmittedGemFramesViaTconti[tcont];
			txPm->gemTxIdleGemFramesViaTconti[tcont] = inCounters.transmittedIdleGemFramesViaTconti[tcont] - g_OnuGponOutPm.tx.transmittedIdleGemFramesViaTconti[tcont];
		}
	}

	if (a_clear == MV_TRUE) {
		g_OnuGponOutPm.tx.transmittedGemPtiTypeOneFrames    = inCounters.transmittedGemPtiTypeOneFrames;
		g_OnuGponOutPm.tx.transmittedGemPtiTypeZeroFrames   = inCounters.transmittedGemPtiTypeZeroFrames;
		g_OnuGponOutPm.tx.transmittedIdleGemFrames          = inCounters.transmittedIdleGemFrames;

		for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++) {
			rcode = onuGponDbBwTcontExist(tcont, &exist);
			if ((rcode == MV_OK) && (exist != MV_FALSE)) {
				g_OnuGponOutPm.tx.transmittedEthFramesViaTconti[tcont]     = inCounters.transmittedEthFramesViaTconti[tcont];
				g_OnuGponOutPm.tx.transmittedEthBytesViaTconti[tcont]      = inCounters.transmittedEthBytesViaTconti[tcont];
				g_OnuGponOutPm.tx.transmittedGemFramesViaTconti[tcont]     = inCounters.transmittedGemFramesViaTconti[tcont];
				g_OnuGponOutPm.tx.transmittedIdleGemFramesViaTconti[tcont] = inCounters.transmittedIdleGemFramesViaTconti[tcont];
			}
		}
	}

	return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiResetAllCtr
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reset all ONU PM information
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponApiResetAllCtr(void)
{
  onuGponPmInPmInit();                                   /* reset pm counters */
  onuGponBerClear();                                     /* reset ber counters */
  memset(&(g_OnuGponOutPm), 0, sizeof (g_OnuGponOutPm)); /* reset api counters */
}

/*******************************************************************************
**
**  onuGponApiBurstConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures ONU TX Burst enable parameters
**
**  PARAMETERS:  S_apiBurstConfig *burstConfigSet
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiBurstConfigSet(S_apiBurstConfig *burstConfigSet)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiBurstConfigSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = mvOnuGponMacTxBurstEnParamSet(burstConfigSet->mask,
                                        burstConfigSet->polarity,
                                        burstConfigSet->order,
                                        burstConfigSet->stop,
                                        burstConfigSet->start);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiPmRxStandardPmGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiBurstConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function retrieves ONU TX Burst enable parameters
**
**  PARAMETERS:  S_apiBurstConfig *burstConfigSet
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiBurstConfigGet(S_apiBurstConfig *burstConfigGet)
{
  MV_STATUS rcode;
  MV_U32    mask;
  MV_U32    polarity;
  MV_U32    order;
  MV_U32    stop;
  MV_U32    start;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiBurstConfigGet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode = mvOnuGponMacTxBurstEnParamGet(&mask, &polarity,&order, &stop, &start);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiBurstConfigGet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  burstConfigGet->start    = start;
  burstConfigGet->stop     = stop;
  burstConfigGet->order    = order;
  burstConfigGet->polarity = polarity;
  burstConfigGet->mask     = mask;

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiExtendedBurstSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to override ONU Type 3 preamble
**               bytes assigned from the OLT with input values
**
**  PARAMETERS:  MV_BOOL   enable
**               MV_U32 range
**               MV_U32 oper
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiExtendedBurstSet(MV_BOOL enable, MV_U32 range, MV_U32 oper)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiExtendedBurstSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbExtendedBurstOverrideSet(enable);
  rcode |= onuGponDbExtendedBurstOverrideValueSet(range , oper);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiExtendedBurstSet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiExtendedBurstDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to add configured delay to ONU Type 3 preamble
**               bytes assigned from the OLT with input values
**
**  PARAMETERS:  MV_BOOL enable
**               MV_U32  syncDel
**               MV_U32  operDel
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiExtendedBurstDelaySet(MV_BOOL enable, MV_U32 syncDel, MV_U32 operDel)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiExtendedBurstDelaySet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbExtendedBurstDelayAddSet(enable);
  rcode |= onuGponDbExtendedBurstDelayValueSet(syncDel, operDel);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiExtendedBurstDelaySet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiDelimiterSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to override ONU delimiter
**               assigned from the OLT with input value
**
**  PARAMETERS:  MV_BOOL   enable
**               MV_U32 delimiter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiDelimiterSet(MV_BOOL enable, MV_U32 delimiter)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiDelimiterSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbDelimiterOverrideSet(enable);
  rcode |= onuGponDbDelimiterOverrideValueSet(delimiter);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiDelimiterSet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiOnuIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to override ONU ID assigned
**               from the OLT with input value
**
**  PARAMETERS:  MV_BOOL   enable
**               MV_U32 onuId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiOnuIdSet(MV_BOOL enable, MV_U32 onuId)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiOnuIdSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbOnuIdOverrideSet(enable);
  rcode |= onuGponDbOnuIdOverrideValueSet(onuId);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiOnuIdSet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiOmccPortIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to override ONU OMCC assigned
**               from the OLT with input value
**
**  PARAMETERS:  MV_BOOL   enable
**               MV_U32 portId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiOmccPortIdSet (MV_BOOL enable, MV_U32 portId)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiOmccPortIdSet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbOmccPortOverrideSet(enable);
  rcode |= onuGponDbOmccPortOverrideValueSet(portId);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiOmccPortIdSet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiEqualizationDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable to override ONU Equalization
**               Delay measured and assigned from the OLT with input value
**
**  PARAMETERS:  MV_BOOL   enable
**               MV_U32 eqD
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiEqualizationDelaySet(MV_BOOL enable, MV_U32 eqD)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiEqualizationDelaySet\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbEqualizationDelayOverrideSet(enable);
  rcode |= onuGponDbEqualizationDelayOverrideValueSet(eqD);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiEqualizationDelaySet", __FILE_DESC__, __LINE__);
    return(rcode);
  }

  return(rcode);
}

/*******************************************************************************
**
**  onuGponApiEqualizationDelayChange
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enables changes in the ONU Equalization Delay
**
**  PARAMETERS:  MV_U32 direction
**               MV_U32 size
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiEqualizationDelayChange(MV_U32 direction, MV_U32 size)
{
  MV_U32 eqD;
  MV_U32 newEqD;
  MV_U32 newFinalEqD;
  MV_U32 onuState = onuGponDbOnuStateGet();
  MV_U8  onuId;
  MV_U8  newEqDelay[5];

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiEqualizationDelayChange\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  if (onuState != ONU_GPON_05_OPERATION)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) EqD change failed. EqD can only be changed in state 05\n", __FILE_DESC__, __LINE__);
    return(MV_OK);
  }
  eqD    = onuGponDbEqualizationDelayGet();
  newEqD = (direction == 1) ? eqD + size : eqD - size;
  newFinalEqD = M_ONU_GPON_RANG_MSG_FINAL_DELAY(newEqD);

  if (newFinalEqD < GPON_TX_FINAL_DELAY_MIN || newFinalEqD > GPON_TX_FINAL_DELAY_MAX )
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) EqD change failed. New Final eqD value is out of range\n", __FILE_DESC__, __LINE__);
    return(MV_OK);
  }

  newEqDelay[4] = newEqD & 0xFF;        /* LSB */
  newEqDelay[3] = (newEqD >> 8 )& 0xFF;
  newEqDelay[2] = (newEqD >> 16)& 0xFF;
  newEqDelay[1] = (newEqD >> 24)& 0xFF; /* MSB */

  onuId = onuGponDbOnuIdGet();
  onuGponPonMngPloamProcess(onuId, ONU_GPON_DS_MSG_RANGING_TIME, newEqDelay);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiSnMaskConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure sn mask
**
**  PARAMETERS:  MV_BOOL enable
**               MV_BOOL match
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiSnMaskConfig(MV_BOOL enable, MV_BOOL match)
{
  MV_STATUS rcode;

#ifdef MV_GPON_DEBUG_PRINT
  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE,
             "DEBUG: (%s:%d) onuGponApiSnMaskConfig\n", __FILE_DESC__, __LINE__);
#endif /* MV_GPON_DEBUG_PRINT */

  rcode  = onuGponDbSnMaskSet(enable);
  rcode |= onuGponDbSerialNumberMaskEnableSet(enable);
  rcode |= onuGponDbSerialNumberMaskMatchSet (match);

  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponApiSnMaskConfig\n", __FILE_DESC__, __LINE__);
  }

  return(rcode);
}

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

/*******************************************************************************
**
**  onuGponApiGemPortPmConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures HW so that MIB Counter PM is activated
**               for a GEM port
**
**  PARAMETERS:  S_GponIoctlGemPortPmConfig *
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortPmConfig(S_GponIoctlGemPortPmConfig *gponIoctlGemPortPmConfig)
{
  MV_STATUS rcode = MV_ERROR;

  if (gponIoctlGemPortPmConfig->gem_port > GPON_MAX_GEMPORTID)
  {
      return MV_ERROR;
  }

  if (gponIoctlGemPortPmConfig->command == GEMPORTPMCMD_START)
  {
    rcode = onuGponPmGemPortPmStart(gponIoctlGemPortPmConfig->gem_port);
  }
  else if (gponIoctlGemPortPmConfig->command == GEMPORTPMCMD_STOP)
  {
    rcode = onuGponPmGemPortPmStop(gponIoctlGemPortPmConfig->gem_port);
  }
  return rcode;
}

/*******************************************************************************
**
**  onuGponApiGemPortPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function retrieves MIB Counter PM for GEM Port
**
**  PARAMETERS:  S_GponIoctlGemPortMibCounters *
**
**  OUTPUTS:     MIB counters copied
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortPmGet(S_GponIoctlGemPortMibCounters *gemPortMibCounters)
{
  MV_STATUS            rcode = MV_OK;

  if (gemPortMibCounters->gem_port > GPON_MAX_GEMPORTID)
  {
      return MV_ERROR;
  }

  rcode = onuGponPmGemPortPmGet(gemPortMibCounters->gem_port, gemPortMibCounters);

  return rcode;
}

/*******************************************************************************
**
**  onuGponApiGemPortPmReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Reset MIB Counter PM for GEM Port
**
**  PARAMETERS:  S_GponIoctlGemPortMibCounters *
**
**  OUTPUTS:     MIB counters copied
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiGemPortPmReset(void)
{
  MV_STATUS            rcode = MV_OK;


  rcode = onuGponPmGemPortPmReset();

  return rcode;
}

/*******************************************************************************
**
**  onuGponApiUponDebugSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: Set UPON debug flag
**
**  PARAMETERS:  MV_U32 mode
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void      onuGponApiUponDebugSet(MV_U32 mode)
{
    g_UponDebugMode = mode;
}

/*******************************************************************************
**
**  onuGponApiUponDebugGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: Get UPON debug flag
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_U32 mode
**
*******************************************************************************/
MV_U32 onuGponApiUponDebugGet(void)
{
    return g_UponDebugMode;
}

/*******************************************************************************
**
**  onuGponApiDgCallbackRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register Dying Gasp callback function
**
**  PARAMETERS:  DYINGGASPFUNC dgCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiDgCallbackRegister(DYINGGASPFUNC dgCallBack)
{
  MV_STATUS status;

  status = onuGponDbDgCallbackSet(dgCallBack);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE,
               "ERROR: (%s:%d) onuGponDbDgCallbackSet", __FILE_DESC__, __LINE__);
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponApiLinkStatusCallbackRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register Link Status callback function
**
**  PARAMETERS:  LINKSTATUSFUNC linkStatusCallBack
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponApiLinkStatusCallbackRegister(void)
{
  mv_pon_link_state_register(onuGponLinkIsUp,
  						     &onuGponDb_s.onuGponGenTbl_s.onuLinkStatusCallback);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponLinkIsUp
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function register Link Status callback function
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_TRUE or MV_FLASE
**
*******************************************************************************/
MV_BOOL onuGponLinkIsUp(void)
{
  if (onuGponDbOnuStateGet() == ONU_GPON_05_OPERATION) return(MV_TRUE);
  else                                                 return(MV_FALSE);
}

/*******************************************************************************
**
**  onuGponApiAdminStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure PON Admin state
**
**  PARAMETERS:  MV_U32 mode 0-Enable, 1 Disable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponApiAdminStateSet(MV_U32 mode)
{
  return onuGponAdminStateSet(mode);
}

/*******************************************************************************
**
**  onuGponApiFecStatusGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return FEC Status
**
**  PARAMETERS:  MV_U32 fecStatus 0-Off, 1-On
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponApiFecStatusGet(MV_U32 *fecMode)
{
  return mvOnuGponMacRxFecStatusGet(fecMode);
}

/*******************************************************************************
**
**  mvGponAipCouplingModeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures the coupling mode
**
**  PARAMETERS:  MV_U32 couplingMode 0 : DC, 1 : AC
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponApiCouplingModeSet(MV_U32 couplingMode)
{
    MV_STATUS status;
    MV_U32 devId;
    MV_U32 burstMode = 0;
    MV_U32 burstTime = 0;
    MV_U8  dataPattern1 = 0;
    MV_U8  dataPattern2 = 0;

    devId = mvCtrlModelGet();
	if (devId != MV_6601_DEV_ID)
	{
		return(MV_OK);
	}

    if (couplingMode == 1)  /* AC coupling mode */
    {
        burstMode = GPON_TX_AC_COUPL_BUST_MODE_0;
        burstTime = GPON_TX_AC_COUPL_PREACT_BURST_TIME;
        dataPattern1 = GPON_TX_AC_COUPL_DATA_PATTERN_1;
        dataPattern2 = GPON_TX_AC_COUPL_DATA_PATTERN_2;
    }

    status = mvOnuGponMacTxConfigAcCouplingSet(burstMode, burstTime, dataPattern1, dataPattern2);

    return (status);
}



