/*******************************************************************************
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.

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

/* Include Files
------------------------------------------------------------------------------*/
#include "mvTypes.h"
#include "mvOs.h"

#include "mvPonOnuDefines.h"
#include "mvPonOnuRegs.h"
#include "mvPonOnuMac.h"


/******************************************************************************/
/******************************************************************************/
/* ========================================================================== */
/* ========================================================================== */
/* ==                                                                      == */
/* ==           =========   =========   =========   ===       ==           == */
/* ==           =========   =========   =========   ====      ==           == */
/* ==           ==          ==     ==   ==     ==   == ==     ==           == */
/* ==           ==          ==     ==   ==     ==   ==  ==    ==           == */
/* ==           =========   =========   ==     ==   ==   ==   ==           == */
/* ==           =========   =========   ==     ==   ==    ==  ==           == */
/* ==           ==     ==   ==          ==     ==   ==     == ==           == */
/* ==           ==     ==   ==          ==     ==   ==      ====           == */
/* ==           =========   ==          =========   ==       ===           == */
/* ==           =========   ==          =========   ==        ==           == */
/* ==                                                                      == */
/* ========================================================================== */
/* ========================================================================== */
/******************************************************************************/
/******************************************************************************/

/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_hal/pon/mvPonOnuMac.c"

/* Global Variables
------------------------------------------------------------------------------*/

/* Local Variables
------------------------------------------------------------------------------*/
MV_U32	       onuGponPortAesStatusImage[GPON_ONU_MAX_GEM_PORTS/32];
MV_BOOL	       onuGponPortValidStatusImage[GPON_ONU_MAX_GEM_PORTS/32];
S_MacTxPloamPm mvOnuGponMacPloamCnt;
S_MacFifoCtrl  fifoCtrl;
MV_U32         fifoReadIdx  = 0;
MV_U32         fifoWriteIdx = 0;

MV_32          fifoAuditEnter   = 0;
MV_32          fifoAuditAction  = 0;
MV_32          fifoMacMsgSend   = 0;
MV_32          fifoMacMsgAdd    = 0;
MV_32          fifoMacMsgFree   = 0;
MV_32          fifoMacPloamSend = 0;
MV_32          fifoSupported    = 1;

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

/* Local Functions
------------------------------------------------------------------------------*/
static inline MV_STATUS mvOnuGponMacFifoMsgAlloc(MV_U32 **buffer, MV_U32 *bufferIndex);
static inline void      mvOnuGponMacFifoMsgSend(MV_U32 bufferIndex);
static inline MV_STATUS mvOnuGponMacFifoMsgRece(MV_U32 **buffer, MV_U32 *bufferIndex);
static inline void      mvOnuGponMacFifoMsgFree(MV_U32 bufferIndex);
static inline int       mvOnuGponMacFifoEmpty(void);

/******************************************************************************/
/* ========================================================================== */
/*                           RX Low Level Routines                            */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacVersionGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the asic version
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     asic version
**
*******************************************************************************/
MV_STATUS mvOnuGponMacVersionGet(MV_U32 *version)
{
  MV_STATUS rcode;

  rcode = asicOntGlbRegRead(mvAsicReg_GPON_GEN_MAC_VERSION, version, 0);

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacRxConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx config enable register
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxConfigSet(MV_BOOL enable)
{
  MV_STATUS status;
  MV_U32    enBit;

  enBit = (enable == MV_TRUE) ? 1 : 0;
  status = asicOntGlbRegWrite(mvAsicReg_GPON_RX_CONFIG_EN, enBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxConfigBitOrderSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx config bit order register
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxConfigBitOrderSet(MV_U32 value)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_RX_CONFIG_BIT_ORDER, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPsaConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx PSA config register
**
**  PARAMETERS:  MV_U32 syncFsmM1
**               MV_U32 syncFsmM2
**               MV_U32 syncFsmM3
**               MV_U32 fecHyst
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPsaConfigSet(MV_U32 syncFsmM1,
                                   MV_U32 syncFsmM2,
                                   MV_U32 syncFsmM3,
                                   MV_U32 fecHyst)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_PSA_CONFIG_SFM1, syncFsmM1, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PSA_CONFIG_SFM2, syncFsmM2, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PSA_CONFIG_SFM3, syncFsmM3, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PSA_CONFIG_FHM1, fecHyst, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxFecHysteresisSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx PSA FEC Hysteresis config register
**
**  PARAMETERS:  MV_U32 fecHyst
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecHysteresisSet(MV_U32 fecHyst)
{
    MV_STATUS status;

    status = asicOntGlbRegWrite(mvAsicReg_GPON_RX_PSA_CONFIG_FHM1, fecHyst, 0); 

    return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxFecConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx FEC config register
**
**  PARAMETERS:  MV_BOOL swIndication
**               MV_BOOL forceSw
**               MV_BOOL ignoreParity
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecConfigSet(MV_BOOL swIndication,
                                   MV_BOOL forceSw,
                                   MV_BOOL ignoreParity)
{
  MV_STATUS status;
  MV_U32    swiBit;
  MV_U32    fswBit;
  MV_U32    ipaBit;

  swiBit  = (swIndication == MV_TRUE) ? 1 : 0;
  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_FEC_CONFIG_SWVAL, swiBit, 0);
  fswBit  = (forceSw == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_FEC_CONFIG_FSW, fswBit, 0);
  ipaBit  = (ignoreParity == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_FEC_CONFIG_IGNP, ipaBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxFecStatusGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get Rx FEC Ind register
**
**  PARAMETERS:  MV_U32 *fecStatus
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecStatusGet(MV_U32 *fecStatus)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_FEC_CONFIG_IND, fecStatus, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamDataGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx Ploam data
**
**  PARAMETERS:  MV_U32 *ploamData
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamDataGet(MV_U32 *ploamData)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_DATA_READ, ploamData, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamDataUsedGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the Rx ploam fifo size
**
**  PARAMETERS:  MV_U32 *ploamFifoSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamDataUsedGet(MV_U32 *ploamFifoSize)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_DATA_USED, ploamFifoSize, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPlenConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx Plen config register
**
**  PARAMETERS:  MV_BOOL forceNum
**               MV_BOOL useForce
**               MV_BOOL ignDiff
**               MV_BOOL notFix
**               MV_BOOL ignCrc
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPlenConfigSet(MV_BOOL forceNum,
                                    MV_BOOL useForce,
                                    MV_BOOL ignDiff,
                                    MV_BOOL notFix,
                                    MV_BOOL ignCrc)
{
  MV_STATUS status;
  MV_U32    fnBit;
  MV_U32    ufBit;
  MV_U32    idBit;
  MV_U32    nfBit;
  MV_U32    icBit;

  fnBit   = (forceNum == MV_TRUE) ? 1 : 0;
  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLEND_CONFIG_FN, fnBit, 0);
  ufBit   = (useForce == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLEND_CONFIG_UF, ufBit, 0);
  idBit   = (ignDiff == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLEND_CONFIG_IGND, idBit, 0);
  nfBit   = (notFix == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLEND_CONFIG_DFIX, nfBit, 0);
  icBit   = (ignCrc == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLEND_CONFIG_IGNC, icBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPlenConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx Ploam config register
**
**  PARAMETERS:  MV_BOOL ignCrc
**               MV_BOOL ignBrd
**               MV_BOOL fwdAll
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamConfigSet(MV_BOOL ignCrc,
                                     MV_BOOL ignBrd,
                                     MV_BOOL fwdAll)
{
  MV_STATUS status;
  MV_U32    icBit;
  MV_U32    igBit;
  MV_U32    faBit;

  icBit   = (ignCrc == MV_TRUE) ? 1 : 0;
  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLOAMD_CONFIG_IGNC, icBit, 0);
  igBit   = (ignBrd == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLOAMD_CONFIG_IGNB, igBit, 0);
  faBit   = (fwdAll == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_PLOAMD_CONFIG_FALL, faBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxBwMapConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Rx BW Map config register
**
**  PARAMETERS:  MV_U32  minSaDelta
**               MV_BOOL notCrcFix
**               MV_BOOL ignCrc
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxBwMapConfigSet(MV_U32 minSaDelta,
                                     MV_BOOL notCrcFix,
                                     MV_BOOL ignCrc)
{
  MV_STATUS status;
  MV_U32    ncfBit;
  MV_U32    icBit;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_BWMAP_CONFIG_MSD, minSaDelta, 0);
  ncfBit  = (notCrcFix == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_BWMAP_CONFIG_DFIX, ncfBit, 0);
  icBit   = (ignCrc == MV_TRUE) ? 1 : 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_BWMAP_CONFIG_IGNC, icBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxBwMapSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu Tx bw map table
**
**  PARAMETERS:  MV_U32  entry
**               MV_U32  allocId
**               MV_U32  tcontCnt
**               MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxBwMapSet(MV_U32 entry,
                               MV_U32 allocId,
                               MV_U32 tcontCnt,
                               MV_BOOL enable)
{
  MV_STATUS status;
  MV_U32    enableVal;

  enableVal = (enable == MV_TRUE) ? 1 : 0;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_RX_BW_MAP_TCN, tcontCnt, entry);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_BW_MAP_EN, enableVal, entry);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_RX_BW_MAP_ALID, allocId, entry);

	return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxBwMapGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the onu Tx bw translation table
**
**  PARAMETERS:  MV_U32 entry,
**               MV_U32 *allocId,
**               MV_U32 *enable,
**               MV_U32 *tcontCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxBwMapGet(MV_U32 entry,
                               MV_U32 *allocId,
                               MV_BOOL *enable,
                               MV_U32 *tcontCnt)
{
  MV_STATUS status;
  MV_U32    enableVal;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_RX_BW_MAP_TCN, tcontCnt, entry);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_RX_BW_MAP_EN, &enableVal, entry);
  *enable = (enableVal == 0) ? MV_FALSE : MV_TRUE;
  status |= asicOntGlbRegRead(mvAsicReg_GPON_RX_BW_MAP_ALID, allocId, entry);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxEqualizationDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu equalization delay
**
**  PARAMETERS:  MV_U32 delay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxEqualizationDelaySet(MV_U32 delay)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_RX_EQULIZATION_DELAY, delay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxEqualizationDelayGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the onu equalization delay
**
**  PARAMETERS:  MV_U32 *delay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxEqualizationDelayGet(MV_U32 *delay)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_EQULIZATION_DELAY, delay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxInternalDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu const delay
**
**  PARAMETERS:  MV_U32 txConstDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxInternalDelaySet(MV_U32 delay)
{
  MV_STATUS  status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_RX_INTERNAL_DELAY, delay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxInternalDelayGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the onu const delay
**
**  PARAMETERS:  MV_U32 *txConstDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxInternalDelayGet(MV_U32 *delay)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_INTERNAL_DELAY, delay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRxSuperFrameCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reads Super Frame Counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxSuperFrameCounterGet(MV_U32 *counter)
{
	return(asicOntGlbRegRead(mvAsicReg_GPON_RX_SFRAME_COUNTER, counter, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacRxSuperFrameCounterSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets Super Frame Counter
**
**  PARAMETERS:  MV_U32 counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxSuperFrameCounterSet(MV_U32 counter)
{
	return(asicOntGlbRegWrite(mvAsicReg_GPON_RX_SFRAME_COUNTER, counter, 0));
}

/******************************************************************************/
/* ========================================================================== */
/*                           TX Low Level Routines                            */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacTxDelimiterSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx delimiter
**
**  PARAMETERS:  MV_U32 delimiterPattern
**               MV_U32 delimiterSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxDelimiterSet(MV_U32 delimiterPattern, MV_U32 delimiterSize)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_TX_DELIMITER_PAT, delimiterPattern, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_DELIMITER_SIZE, delimiterSize, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxDelimiterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the Tx delimiter
**
**  PARAMETERS:  MV_U32 *pattern
**               MV_U32 *size
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxDelimiterGet(MV_U32 *pattern, MV_U32 *size)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_TX_DELIMITER_PAT, pattern, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_TX_DELIMITER_SIZE, size, 0);

	return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxPloamDataFifoSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx ploam data fifo - one entry
**
**  PARAMETERS:  MV_U32 txPloamData
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxPloamDataFifoSet(MV_U32 txPloamData)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_PLOAM_DATA_WRITE, txPloamData, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxPloamDataFreeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the Tx ploam data fifo size
**
**  PARAMETERS:  MV_U32 *ploamFifoSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxPloamDataFreeGet(MV_U32 *ploamFifoSize)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_PLOAM_DATA_WRITE_FREE, ploamFifoSize, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacBurstEnParamSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the burst enable parameters
**
**  PARAMETERS:  MV_U32 mask
**               MV_U32 polarity
**               MV_U32 delay
**               MV_U32 enStop
**               MV_U32 enStart
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxBurstEnParamSet(MV_U32 mask,
                                      MV_U32 polarity,
                                      MV_U32 delay,
                                      MV_U32 enStop,
                                      MV_U32 enStart)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_STR, enStart, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_STP, enStop, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_DLY, delay, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_P, polarity, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_MASK, mask, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxBurstEnPolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the burst enable polarity
**
**  PARAMETERS:  MV_U32 polarity
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxBurstEnPolaritySet(MV_U32 polarity)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_BURST_EN_PARAM_P, polarity, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxBurstEnParamGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the burst enable parameters
**
**  PARAMETERS:  MV_U32 *mask
**               MV_U32 *polarity
**               MV_U32 *delay
**               MV_U32 *enStop
**               MV_U32 *enStart
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxBurstEnParamGet(MV_U32 *mask,
                                      MV_U32 *polarity,
                                      MV_U32 *order,
                                      MV_U32 *enStop,
                                      MV_U32 *enStart)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_TX_BURST_EN_PARAM_STR, enStart, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_TX_BURST_EN_PARAM_STP, enStop, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_TX_BURST_EN_PARAM_DLY, order, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_TX_BURST_EN_PARAM_P, polarity, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_TX_BURST_EN_PARAM_MASK, mask, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxFinalDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx final delay
**
**  PARAMETERS:  MV_U32 txFinalDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxFinalDelaySet(MV_U32 txFinalDelay)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_FDELAY, txFinalDelay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxFinalDelayGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the Tx final delay
**
**  PARAMETERS:  MV_U32 *txFinalDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxFinalDelayGet(MV_U32 *txFinalDelay)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_FDELAY, txFinalDelay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxPreambleSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx preamble type (1,2,3)
**
**  PARAMETERS:  MV_U32 preamType
**               MV_U32 preamCnt
**               MV_U32 preamVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxPreambleSet(MV_U32 type, MV_U32 pattern, MV_U32 size)
{
  MV_STATUS status;

  if (type >= 3)
  {
    return(MV_ERROR);
  }

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_TX_PREAMBLE_PATT, pattern, type);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_PREAMBLE_SIZE, size, type);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxPlsSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx PLS
**
**  PARAMETERS:  MV_U32 pattern
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxPlsSet(MV_U32 pattern)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_PLS_CONSTANT, pattern, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxConstIdleMsgSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx const data ram - one entry
**
**  PARAMETERS:  MV_U32 onuId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxConstIdleMsgSet(MV_U32 onuId)
{
  MV_STATUS status;
  MV_U32    dataWord;

  dataWord = ((onuId & 0xFF) << 24) | (ONU_GPON_US_MSG_NO_MESSAGE << 16);

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_IDLE, dataWord, 0);
  dataWord = 0;
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_IDLE, dataWord, 1);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_IDLE, dataWord, 2);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxConstIdleMsgSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx const data ram - one entry
**
**  PARAMETERS:  MV_U32 onuId
**               MV_U8  *serialNumber
**               MV_U32 randomDelay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxConstSerialNumberMsgSet(MV_U32 onuId,
                                              MV_U8 *serialNumber,
                                              MV_U32 randomDelay)
{
  MV_STATUS status;
  MV_U32    dataWord;

  dataWord = ((onuId & 0xFF) << 24) | (ONU_GPON_US_MSG_SN_ONU << 16) |
             (((MV_U32)(serialNumber[0])) << 8) | (MV_U32)(serialNumber[1]);
  status  = asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_SN, dataWord, 0);

  dataWord = (((MV_U32)(serialNumber[2])) << 24) | (((MV_U32)(serialNumber[3])) << 16) |
             (((MV_U32)(serialNumber[4])) << 8) | (MV_U32)(serialNumber[5]);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_SN, dataWord, 1);

  dataWord = (((MV_U32)(serialNumber[6])) << 24) | (((MV_U32)(serialNumber[7])) << 16) |
             (((randomDelay >> 4) & 0xFF) << 8) | ((randomDelay & 0xF) << 4 | 5);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONST_DATA_RAM_SN, dataWord, 2);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxDbrBlockSizeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the Tx DBR Block size
**
**  PARAMETERS:  MV_U32 blockSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxDbrBlockSizeSet(MV_U32 blockSize)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_DBR_REPORT_BLOCK_IDX, blockSize, 0);

  return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                           General Low Level Routines                       */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacOnuIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the ONU ID
**
**  PARAMETERS:  MV_U32 onuId
**               MV_BOOL   valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacOnuIdSet(MV_U32 onuId, MV_BOOL valid)
{
  MV_STATUS status;
  MV_U32    validBit;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_ONU_ID_OID, onuId, 0);

  validBit = (valid == MV_TRUE) ? 1 : 0;

  status |= asicOntGlbRegWrite(mvAsicReg_GPON_ONU_ID_V, validBit, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacOnuStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu state
**
**  PARAMETERS:  MV_U32 onuState
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacOnuStateSet(MV_U32 onuState)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_ONU_STATE, onuState, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacSerialNumberSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set 2 bytes of Serial Number
**				 it is for ASIC random value creation - so the 2 last bytes
**				 should be put here
**
**  PARAMETERS:  MV_U32 serialNum
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacSerialNumberSet(MV_U32 serialNum)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_SERIAL_NUMBER, serialNum, 0);

  return(status);
}


/******************************************************************************/
/* ========================================================================== */
/*                           Gem Low Level Routines                           */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacGemPayloadLenSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the max gem payload length
**
**  PARAMETERS:  MV_U32 payloadlen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemPayloadLenSet(MV_U32 payloadlen)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_PLI, payloadlen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemPayloadLenGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the max gem payload length
**
**  PARAMETERS:  MV_U32 *payloadlen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemPayloadLenGet(MV_U32 *payloadlen)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_PLI, payloadlen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemEthFrameLenSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the max / min ethernet frame length
**
**  PARAMETERS:  MV_U32 maxFrameLen
**               MV_U32 minFrameLen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemEthFrameLenSet(MV_U32 maxFrameLen, MV_U32 minFrameLen)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_ETH_FRAME_LEN_MAX, maxFrameLen, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_ETH_FRAME_LEN_MIN, minFrameLen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemEthFrameLenGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the max / min ethernet frame length
**
**  PARAMETERS:  MV_U32 maxFrameLen
**               MV_U32 minFrameLen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemEthFrameLenGet(MV_U32 *maxFrameLen, MV_U32 *minFrameLen)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_ETH_FRAME_LEN_MAX, maxFrameLen, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_ETH_FRAME_LEN_MIN, minFrameLen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemOmciFrameLenSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the max / min omci frame length
**
**  PARAMETERS:  MV_U32 maxFrameLen
**               MV_U32 minFrameLen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemOmciFrameLenSet(MV_U32 maxFrameLen, MV_U32 minFrameLen)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_OMCI_FRAME_LEN_MAX, maxFrameLen, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_OMCI_FRAME_LEN_MIN, minFrameLen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemOmciFrameLenGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the max / min omci frame length
**
**  PARAMETERS:  MV_U32 maxFrameLen
**               MV_U32 minFrameLen
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemOmciFrameLenGet(MV_U32 *maxFrameLen, MV_U32 *minFrameLen)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_OMCI_FRAME_LEN_MAX, maxFrameLen, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_OMCI_FRAME_LEN_MIN, minFrameLen, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemOmciPortIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the omci port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemOmciPortIdSet(MV_U32 portId, MV_U32 valid)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_OMCI_PORT_ID,    portId, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_OMCI_PORT_VALID, valid, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemOmciPortIdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the omci port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemOmciPortIdGet(MV_U32 *portId, MV_U32 *valid)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_OMCI_PORT_ID,    portId, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_GEM_CONFIG_OMCI_PORT_VALID, valid, 0);

  return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                           UTM Low Level Routines                           */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacUtmOmciPortIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the omci port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmOmciPortIdSet(MV_U32 portId, MV_U32 valid)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_GPON_UTM_CONFIG_OMCI_PORT_ID,    portId, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_GPON_UTM_CONFIG_OMCI_PORT_VALID, valid, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacUtmOmciPortIdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the omci port Id
**
**  PARAMETERS:  MV_U32 *portId
**               MV_U32 *valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmOmciPortIdGet(MV_U32 *portId, MV_U32 *valid)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_UTM_CONFIG_OMCI_PORT_ID,    portId, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_UTM_CONFIG_OMCI_PORT_VALID, valid, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacUtmTcPeriodSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the TC period
**
**  PARAMETERS:  MV_U32 period
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmTcPeriodSet(MV_U32 period)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_UTM_CONFIG_TC_PERIOD, period, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacUtmTcValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the TC valid
**
**  PARAMETERS:  MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmTcValidSet(MV_U32 valid)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_UTM_CONFIG_TC_PERIOD_VALID, valid, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacUtmTcConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the TC configuration
**
**  PARAMETERS:  MV_U32 *period
**               MV_U32 *valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmTcConfigGet(MV_U32 *period, MV_U32 *valid)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_GPON_UTM_CONFIG_TC_PERIOD,       period, 0);
  status |= asicOntGlbRegRead(mvAsicReg_GPON_UTM_CONFIG_TC_PERIOD_VALID, valid, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacUtmActiveTxBitmapSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the active TX bitmap
**
**  PARAMETERS:  MV_U32 bitmap
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmActiveTxBitmapSet(MV_U32 bitmap)
{
	return(asicOntGlbRegWrite(mvAsicReg_GPON_UTM_ACTIVE_TX_BITMAP, bitmap, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacUtmActiveTxBitmapValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the active TX bitmap valid
**
**  PARAMETERS:  MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmActiveTxBitmapValidSet(MV_U32 valid)
{
	return(asicOntGlbRegWrite(mvAsicReg_GPON_UTM_ACTIVE_TX_BITMAP_VALID, valid, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacUtmActiveTxBitmapConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the active TX bitmap configuration
**
**  PARAMETERS:  MV_U32 *bitmap
**               MV_U32 *valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacUtmActiveTxBitmapConfigGet(MV_U32 *bitmap, MV_U32 *valid)
{
	MV_STATUS status;

	status  = asicOntGlbRegRead(mvAsicReg_GPON_UTM_ACTIVE_TX_BITMAP,       bitmap, 0);
	status |= asicOntGlbRegRead(mvAsicReg_GPON_UTM_ACTIVE_TX_BITMAP_VALID, valid, 0);

	return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                           Interrupt Low Level Routines                     */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacPonInterruptGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the interrupt event
**
**  PARAMETERS:  MV_U32 *interrupt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPonInterruptGet(MV_U32 *interrupt)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_INTERRUPT_PON, interrupt, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacPonInterruptMaskGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the interrupt mask
**
**  PARAMETERS:  MV_U32 *mask
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPonInterruptMaskGet(MV_U32 *mask)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_INTERRUPT_PON_MASK, mask, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacPonInterruptMaskSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the interrupt mask
**
**  PARAMETERS:  MV_U32 *mask
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPonInterruptMaskSet(MV_U32 mask)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_INTERRUPT_PON_MASK, mask, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacBipStatusValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the BIP8 general counter
**
**  PARAMETERS:  MV_U32 *value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacBipStatusValueGet(MV_U32 *value)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_BIP_STATUS, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacBipInterruptIntervalSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the BIP8 interrupt interval (in frames)
**
**  PARAMETERS:  MV_U32 interval
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacBipInterruptIntervalSet(MV_U32 interval)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_BIP_INTR_INTERVAL, interval, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacBipStatusValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the BIP8 interrupt counter
**
**  PARAMETERS:  MV_U32 *value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacBipInterruptStatusValueGet(MV_U32 *value)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_RX_BIP_STATUS_FOR_INTERRUPT, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacBipInterruptIntervalSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set ram test configuration
**
**  PARAMETERS:  MV_U32 interval
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRamTestCfgSet(MV_U32 config)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_RAM_TEST_CONFIG, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacRamTestCfgGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return ram test configuration
**
**  PARAMETERS:  MV_U32 *value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRamTestCfgGet(MV_U32 *config)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_RAM_TEST_CONFIG, config, 0);

  return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                           Statistics Low Level Routines                    */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                       GEM Statistics Low Level Routines                    */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdIdleGemFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received idle gem frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdIdleGemFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_IDLE_GEM_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdValidGemFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received valid gem frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdValidGemFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_VALID_GEM_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdUndefGemFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received undefined gem frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdUndefGemFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_UNDEF_GEM_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdOmciFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received omci frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdOmciFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_VALID_OMCI_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemDropGemFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received dropped gem frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemDropGemFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_DROPPED_GEM_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemDropOmciFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received dropped omci frames counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemDropOmciFramesCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_DROPPED_OMCI_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdGemFramesWithUncorrHecErrCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received gem frames with uncorrect hec error counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdGemFramesWithUncorrHecErrCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_ERROR_GEM_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdGemFramesWithOneFixedHecErrCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received gem frames with one fixed hec error counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdGemFramesWithOneFixedHecErrCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_ONE_FIXED_HEC_ERR_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdGemFramesWithTwoFixedHecErrCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received gem frames with two fixed hec error counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdGemFramesWithTwoFixedHecErrCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_TWO_FIXED_HEC_ERR_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdValidGemFramesTotalByteCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received valid gem frames total bytes counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdValidGemFramesTotalByteCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_VALID_GEM_PAYLOAD_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdUndefGemFramesTotalByteCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received undefined gem frames total bytes counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdUndefGemFramesTotalByteCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_UNDEF_GEM_PAYLOAD_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemReassembleMemoryFlushCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received gem reassemble memory flush counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemReassembleMemoryFlushCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_RSMBL_MEM_FLUSH_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemSynchLostCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return gem synch lost counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemSynchLostCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_LCDGi_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdEthFramesWithCorrFcsCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received ethernet frames with correct FCS counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdEthFramesWithCorrFcsCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_CORR_ETH_FRAME_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdEthFramesWithFcsErrCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received ethernet frames with FCS error counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdEthFramesWithFcsErrCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_ERR_ETH_FRAME_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdOmciFramesWithCorrCrcCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received omci frames with correct CRC counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdOmciFramesWithCorrCrcCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_CORR_OMCI_FRAME_CNT, cntValue, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacGemRcvdOmciFramesWithCrcErrCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received omci frames with CRC error counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemRcvdOmciFramesWithCrcErrCounterGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_GEM_STAT_ERR_OMCI_FRAME_CNT, cntValue, 0);

  return(status);
}

/* ========================================================================== */
/*                  Rx PLOAM Statistics Low Level Routines                    */
/* ========================================================================== */

/******************************************************************************
**
**  mvOnuGponMacRxPloamLostCrcCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx ploam lost crc counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamLostCrcCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  *counter = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_LOST_CRC_STATUS, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamLostFullCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx ploam lost full counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamLostFullCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  *counter = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_LOST_FULL_STATUS, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamRcvdIdleCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx ploam received idle counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamRcvdIdleCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  *counter = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_RCVD_IDLE_STATUS, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamRcvdBroadCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx ploam received broadcast counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamRcvdBroadCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  *counter = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_RCVD_BROAD_STATUS, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxPloamRcvdOnuIdCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx ploam received Onu Id counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxPloamRcvdOnuIdCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  *counter = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLOAMD_RCVD_MYID_STATUS, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/* ========================================================================== */
/*                        Tx Statistics Low Level Routines                    */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuGponMacTxGemPtiTypeOneFrameCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the num of trans gem frames with pti = 1
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxGemPtiTypeOneFrameCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_GEM_PTI1, counter, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxGemPtiTypeZeroFrameCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the num of trans gem frames with pti = 0
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxGemPtiTypeZeroFrameCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_GEM_PTI0, counter, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxIdleGemFramesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the num of trans idle gem frames
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxIdleGemFramesCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_GEM_IDLE, counter, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxTxEnableCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the num of cycles with tx enable asserted
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxTxEnableCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_TX_EN_CNT, counter, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxTxEnableCounterThresholdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return tx enable counter threshold
**
**  PARAMETERS:  MV_U32 *threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxTxEnableCounterThresholdGet(MV_U32 *threshold)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_CONFIG_EN_THRESHOLD, threshold, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxTxEnableCounterThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set tx enable counter threshold
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxTxEnableCounterThresholdSet(MV_U32 threshold)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_CONFIG_EN_THRESHOLD, threshold, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxGseTransCounterThresholdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GSE threshold for starting forwarding data to
**               the TX burst FIFO
**
**  PARAMETERS:  MV_U32 *threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxGseTransCounterThresholdGet(MV_U32 *threshold)
{
   MV_STATUS status;

   status = asicOntGlbRegRead(mvAsicReg_GPON_TX_GSE_TRANS_THRESHOLD, threshold, 0);

   return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxGseTransCounterThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set GSE threshold for starting forwarding data to
**               the TX burst FIFO
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxGseTransCounterThresholdSet(MV_U32 threshold)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_GPON_TX_GSE_TRANS_THRESHOLD, threshold, 0);

  return(status);
}


/*******************************************************************************
**
**  mvOnuGponMacTxGseTransConfigAcCouplingSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set GSE Transmit Configuration AC coupling
**
**  PARAMETERS:  MV_U32 busrtMode          - GPON_TX_AC_COUPL_BUST_MODE_0 or
**					     GPON_TX_AC_COUPL_BUST_MODE_1
**		 MV_U32 preActiveBurstTime - time from burst to TX pattern2
**		 MV_U8  dataPattern1       - Pattern1
**		 MV_U8  dataPattern2       - Pattern2
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxConfigAcCouplingGet(MV_U32 *busrtMode,
					    MV_U32 *preActiveBurstTime,
					    MV_U8  *dataPattern1,
					    MV_U8  *dataPattern2)
{
	MV_STATUS status;
	MV_U32    reg;

	status = asicOntGlbRegRead(mvAsicReg_GPON_TX_CFG_AC_COUPLING, &reg, 0);
	if (status == MV_OK) {
		*busrtMode           = (reg >> 30) & 0x3;
		*preActiveBurstTime  = (reg >> 16) & 0x3FFF;
		*dataPattern2        = (reg >>  8) & 0xFF;
		*dataPattern1        = reg & 0xFF;
	}

	return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxGseTransConfigAcCouplingSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set GSE Transmit Configuration AC coupling
**
**  PARAMETERS:  MV_U32 busrtMode          - GPON_TX_AC_COUPL_BUST_MODE_0 or
**					     GPON_TX_AC_COUPL_BUST_MODE_1
**		 MV_U32 preActiveBurstTime - time from burst to TX pattern2
**		 MV_U8  dataPattern1       - Pattern1
**		 MV_U8  dataPattern2       - Pattern2
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxConfigAcCouplingSet(MV_U32 busrtMode,
					    MV_U32 preActiveBurstTime,
					    MV_U8  dataPattern1,
					    MV_U8  dataPattern2)
{
	MV_U32 reg = 0;

	if (busrtMode != GPON_TX_AC_COUPL_BUST_MODE_0)
		reg = 1 << 30;

	reg |= (preActiveBurstTime & 0x3FFF) << 16;
	reg |= dataPattern1 | (dataPattern2 << 8);

	return(asicOntGlbRegWrite(mvAsicReg_GPON_TX_CFG_AC_COUPLING, reg, 0));
}


/*******************************************************************************
**
**  mvOnuGponMacTxEthFramesTcontiCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return number of trans ethernet frames via tcont
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxEthFramesTcontiCounterGet(MV_U32 tcontNum, MV_U32 *counter)
{
  MV_STATUS status;

  if (tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS)
      return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_TCONT_i_ETH_FRAMES, counter, tcontNum);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxEthBytesTcontiCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return number of trans ethernet bytes via tcont
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxEthBytesTcontiCounterGet(MV_U32 tcontNum, MV_U32 *counter)
{
  MV_STATUS status;

  if (tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS)
      return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_TCONT_i_ETH_BYTES, counter, tcontNum);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxGemFramesTcontiCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return number of trans gem frames via tcont
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxGemFramesTcontiCounterGet(MV_U32 tcontNum, MV_U32 *counter)
{
  MV_STATUS status;

  if (tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS)
      return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_TCONT_i_GEM_FRAMES, counter, tcontNum);

  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacTxIdleGemFramesTcontiCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return number of trans idle gem frames via tcont
**
**  PARAMETERS:  MV_U32 tcontNum
**               MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxIdleGemFramesTcontiCounterGet(MV_U32 tcontNum, MV_U32 *counter)
{
  MV_STATUS status;

  if (tcontNum >= ONU_GPON_MAX_NUM_OF_T_CONTS)
      return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_GPON_TX_STAT_TCONT_i_IDLE_GEM, counter, tcontNum);

  return(status);
}

/* ========================================================================== */
/*                       FEC Statistics Low Level Routines                    */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuGponMacRxFecBytesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx FEC Bytes counter
**
**  PARAMETERS:  MV_U32 *counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecBytesCounterGet(MV_U32 *counter)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_FEC_STAT0, counter, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxFecCorrectBytesCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx FEC correct Bytes counter
**
**  PARAMETERS:  MV_U32 *bytes
**               MV_U32 *bits
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecCorrectCounterGet(MV_U32 *bytes, MV_U32 *bits)
{
  MV_STATUS status;
  MV_U32    regVal;

  *bytes = 0;
  *bits  = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_FEC_STAT1, &regVal, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  *bits  =  regVal & 0xFFFF;
  *bytes = (regVal >> 16) & 0xFFFF;

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxFecInorrectCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx FEC Incorrect Bytes counter
**
**  PARAMETERS:  MV_U32 *bytes
**               MV_U32 *bits
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxFecInorrectCounterGet(MV_U32 *bytes, MV_U32 *bits)
{
  MV_STATUS status;
  MV_U32    regVal;

  *bytes = 0;
  *bits  = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_FEC_STAT2, &regVal, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  *bits  = regVal & 0xFFFF;
  *bytes = (regVal >> 16) & 0xFFFF;

  return(MV_OK);
}

/* ========================================================================== */
/*                    Bw Map Statistics Low Level Routines                    */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuGponMacRxBwMapAllocatrionsCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx Bw Map allocation counters
**
**  PARAMETERS:  MV_U32 *cor
**               MV_U32 *incor
**               MV_U32 *crcCor
**               MV_U32 *errCrc
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxBwMapAllocatrionsCounterGet(MV_U32 *cor,
                                                    MV_U32 *incor,
                                                    MV_U32 *crcCor,
                                                    MV_U32 *errCrc)
{
  MV_STATUS status;
  MV_U32    regVal;

  *cor    = 0;
  *incor  = 0;
  *crcCor = 0;
  *errCrc = 0;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_BWMAP_STATUS0, &regVal, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  *incor  = regVal & 0xFF;
  *crcCor = (regVal >> 8) & 0xFF;
  *cor    = (regVal >> 16) & 0xFF;
  *errCrc = (regVal >> 24) & 0xFF;

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacRxBwMapTotalBwGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx Bw total Bw counter
**
**  PARAMETERS:  MV_U32 *bw
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacRxBwMapTotalBwGet(MV_U32 *bw)
{
  MV_STATUS status;
  MV_U32    regVal;

  *bw = 0;
  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_BWMAP_STATUS1, &regVal, 0);
  if (status != MV_OK)
  {
    return(status);
  }

  *bw = regVal & 0x7FFFF;

  return(MV_OK);
}

/* ========================================================================== */
/*                     Plend Statistics Low Level Routines                    */
/* ========================================================================== */

/*******************************************************************************
**
**  onuGponInComingPlendCntGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return InComing Plend counter
**
**  PARAMETERS:  MV_U32 *cntValue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacInComingPlendCntGet(MV_U32 *cntValue)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_GPON_RX_PLEND_STATUS, cntValue, 0);

  return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                         High-Level MAC Section                             */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacMessageReceive
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function read message from the message fifo
**               The ploam size is 12 octets - each read get 32 bits
**               3 read actions needed
**
**  PARAMETERS:  msgData  - 10 bytes (buffer is allocated by calling)
**               msgOnuId - the ONU ID on the message
**               msgId    - the message ID on the message
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacMessageReceive(MV_U8 *msgOnuId, MV_U8 *msgId, MV_U8 *msgData)
{
  MV_STATUS rcode;
  MV_U32    ploamFifoData_1;
  MV_U32    ploamFifoData_2;
  MV_U32    ploamFifoData_3;

  rcode  = mvOnuGponMacRxPloamDataGet(&ploamFifoData_1);
  rcode |= mvOnuGponMacRxPloamDataGet(&ploamFifoData_2);
  rcode |= mvOnuGponMacRxPloamDataGet(&ploamFifoData_3);

  if (rcode != MV_OK)
    return(rcode);

  /* Outputs */
  *msgOnuId  = (MV_U8)((ploamFifoData_1 >> 24) & UINT8_MASK);  /* MSB */
  *msgId     = (MV_U8)((ploamFifoData_1 >> 16) & UINT8_MASK);
  msgData[0] = (MV_U8)((ploamFifoData_1 >> 8)  & UINT8_MASK);
  msgData[1] = (MV_U8) (ploamFifoData_1        & UINT8_MASK);  /* LSB */
  msgData[2] = (MV_U8)((ploamFifoData_2 >> 24) & UINT8_MASK);  /* MSB */
  msgData[3] = (MV_U8)((ploamFifoData_2 >> 16) & UINT8_MASK);
  msgData[4] = (MV_U8)((ploamFifoData_2 >> 8)  & UINT8_MASK);
  msgData[5] = (MV_U8) (ploamFifoData_2        & UINT8_MASK);  /* LSB */
  msgData[6] = (MV_U8)((ploamFifoData_3 >> 24) & UINT8_MASK);  /* MSB */
  msgData[7] = (MV_U8)((ploamFifoData_3 >> 16) & UINT8_MASK);
  msgData[8] = (MV_U8)((ploamFifoData_3 >> 8)  & UINT8_MASK);
  msgData[9] = (MV_U8) (ploamFifoData_3        & UINT8_MASK);  /* LSB */

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacTxPloamSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function writes PLOAM message to HW FIFO
**
**  PARAMETERS:  msgData  - 10 bytes (buffer is allocated by calling)
**               msgOnuId - the ONU ID on the message
**               msgId    - the message ID on the message
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxPloamSend(MV_U8 msgOnuId, MV_U8 msgId, MV_U8 *msgData)
{
  MV_STATUS rcode;
  MV_U32    ploamFifoData;

  fifoMacPloamSend++;

  /* Write ONU ID and Message ID and data[0:1] */
  ploamFifoData =  (((MV_U32)msgOnuId) << 24) | (((MV_U32)msgId) << 16) |
                   (((MV_U32)msgData[0]) << 8) |(((MV_U32)msgData[1]) << 0);
  rcode = mvOnuGponMacTxPloamDataFifoSet(ploamFifoData);

  /* Write data[2:5] */
  ploamFifoData =  (((MV_U32)msgData[2]) << 24) | (((MV_U32)msgData[3]) << 16) |
                   (((MV_U32)msgData[4]) << 8) |(((MV_U32)msgData[5]) << 0);
  rcode |= mvOnuGponMacTxPloamDataFifoSet(ploamFifoData);

  /* Write data[6:9] */
  ploamFifoData =  (((MV_U32)msgData[6]) << 24) | (((MV_U32)msgData[7]) << 16) |
                   (((MV_U32)msgData[8]) << 8) |(((MV_U32)msgData[9]) << 0);
  rcode |= mvOnuGponMacTxPloamDataFifoSet(ploamFifoData);

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacMessageAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function adds message to the SW FIFO
**
**  PARAMETERS:  msgData  - 10 bytes (buffer is allocated by calling)
**               msgOnuId - the ONU ID on the message
**               msgId    - the message ID on the message
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_FULL
**
*******************************************************************************/
MV_STATUS mvOnuGponMacMessageAdd(MV_U8 msgOnuId, MV_U8 msgId, MV_U8 *msgData)
{
  MV_STATUS rcode;
  MV_U8     *buffer;
  MV_U32    bufferIndex;

  /* Get pointer to and index of the free SW FIFO entry */
  rcode = mvOnuGponMacFifoMsgAlloc((MV_U32**)&buffer, &bufferIndex);
  if (rcode == MV_OK)
  {
    buffer[0] = msgOnuId;
    buffer[1] = msgId;
    memcpy(&buffer[2], msgData, GPON_PLOAM_MSG_BYTES - 2);

    mvOnuGponMacFifoMsgSend(bufferIndex);
  }

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function write message to the message fifo
**
**  PARAMETERS:  msgData  - 10 bytes (buffer is allocated by calling)
**               msgOnuId - the ONU ID on the message
**               msgId    - the message ID on the message
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK, MV_FULL or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacMessageSend(MV_U8 msgOnuId, MV_U8 msgId, MV_U8 *msgData)
{
  MV_STATUS rcode;
  MV_U32    ploamFifoSize;
  MV_U8     *buffer;
  MV_U32    bufferIndex;
  int       i, moved_num;

  fifoMacMsgSend++;

  /* Check first if PLOAM FIFO has free place */
  rcode = mvOnuGponMacTxPloamDataFreeGet(&ploamFifoSize);

  if (rcode != MV_OK)
    return(rcode);

  /* SW FIFO is not supported */
  if (!fifoSupported)
  {
    if (ploamFifoSize < GPON_PLOAM_MSG_WORDS)
      return(MV_ERROR);

    return mvOnuGponMacTxPloamSend(msgOnuId, msgId, msgData);
  }

  /* There is no free entries in  HW FIFO */
  if (ploamFifoSize < GPON_PLOAM_MSG_WORDS)
  {
    rcode = mvOnuGponMacMessageAdd(msgOnuId, msgId, msgData);
  }
  else
  {
    /* HW FIFO has free entries. Verify whether SW FIFO is empty */
    if (mvOnuGponMacFifoEmpty())
    {
        rcode = mvOnuGponMacTxPloamSend(msgOnuId, msgId, msgData);
    }
    else
    {
      /* Add received PLOAM to SW FIFO */
      rcode = mvOnuGponMacMessageAdd(msgOnuId, msgId, msgData);

      /* Move up to GPON_MAX_US_MSG_MOVING (3) PLOAMs from SW to HW FIFO */
      moved_num = ploamFifoSize/GPON_PLOAM_MSG_WORDS;
      if (moved_num > GPON_MAX_US_MSG_MOVING) {
          moved_num = GPON_MAX_US_MSG_MOVING;
      }

      for (i=0; i<moved_num; i++)
      {
        rcode = mvOnuGponMacFifoMsgRece((MV_U32**)&buffer, &bufferIndex);
        if (rcode == MV_EMPTY)
          break;

        rcode = mvOnuGponMacTxPloamSend(buffer[0], buffer[1], &buffer[2]);
        if(rcode != MV_OK)
          break;

        mvOnuGponMacFifoMsgFree(bufferIndex);
      }
    }
  }

  return rcode;
}

/*******************************************************************************
**
**  mvOnuGponMacMessageCleanSwFifo
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clean the SW transmit message fifo
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK, MV_FULL or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacMessageCleanSwFifo(void)
{
  MV_STATUS rcode;
  MV_U8     *buffer;
  MV_U32    bufferIndex;

  do
  {
    rcode = mvOnuGponMacFifoMsgRece((MV_U32**)&buffer, &bufferIndex);
    if (rcode == MV_EMPTY)
      break;

    mvOnuGponMacFifoMsgFree(bufferIndex);

  } while (1);

  return MV_OK;
}

/*******************************************************************************
**
**  mvOnuGponMacPreambleSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu overhead preamble bytes
**
**  PARAMETERS:  preamType1Val - preamble type 1 value
**               preamType1Cnt - preamble type 1 count
**               preamType2Val - preamble type 2 value
**               preamType2Cnt - preamble type 2 count
**               preamType3Val - preamble type 3 value
**               preamType3Cnt - preamble type 3 count
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPreambleSet(MV_U32 preamType1Val,
                                MV_U32 preamType1Cnt,
                                MV_U32 preamType2Val,
                                MV_U32 preamType2Cnt,
                                MV_U32 preamType3Val,
                                MV_U32 preamType3Cnt)
{
  MV_STATUS rcode;

  rcode = mvOnuGponMacTxPreambleSet(ONU_GPON_PREM_TYPE_01, preamType1Val, preamType1Cnt);
  if (rcode != MV_OK)
  {
    return(rcode);
  }

  rcode = mvOnuGponMacTxPreambleSet(ONU_GPON_PREM_TYPE_02, preamType2Val, preamType2Cnt);
  if (rcode != MV_OK)
  {
    return(rcode);
  }

  rcode = mvOnuGponMacTxPreambleSet(ONU_GPON_PREM_TYPE_03, preamType3Val, preamType3Cnt);
  if (rcode != MV_OK)
  {
    return(rcode);
  }

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacPreambleType3Set
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set the onu overhead preamble type3
**
**  PARAMETERS:  preamType3Val - preamble type 3 value
**               preamType3Cnt - preamble type 3 count
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPreambleType3Set(MV_U32 preamType3Val, MV_U32 preamType3Cnt)
{
  MV_STATUS rcode;

  rcode = mvOnuGponMacTxPreambleSet(ONU_GPON_PREM_TYPE_03, preamType3Val, preamType3Cnt);
  if (rcode != MV_OK)
  {
    return(rcode);
  }

  return(MV_OK);
}

/******************************************************************************/
/* ========================================================================== */
/*                      Upstream Messages MAC Section                         */
/* ========================================================================== */
/******************************************************************************/
#ifndef PON_FPGA
/*******************************************************************************
**
**  mvOnuGponMacDgMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sends dying gasp message in the US direction
**
**  PARAMETERS:  MV_U8  onuId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacDgMessageSend(MV_U8 onuId)
{
  MV_U32    i;
  MV_STATUS rcode;
  MV_U8     data[12];

  for (i = 0; i < 3; i++)
  {
    rcode = mvOnuGponMacMessageSend(onuId, ONU_GPON_US_MSG_DYING_GASP, data);
    if (rcode != MV_OK)
    {
      mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_DYING_GASP, MV_FALSE);
      return(rcode);
    }
    else
    {
      mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_DYING_GASP, MV_TRUE);
    }
  }
  return(MV_OK);
}
#endif /* PON_FPGA */

/*******************************************************************************
**
**  mvOnuGponMacPasswordMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sends password message in the US direction
**
**  PARAMETERS:  MV_U8  onuId
**               MV_U8  *password
**               MV_U32 counter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPasswordMessageSend(MV_U8 onuId, MV_U8 *password, MV_U32 counter)
{
  MV_U32    time;
  MV_U32    i;
  MV_STATUS rcode;
  time = (counter > 3) ? 3 : counter;

  for (i = 0; i < time; i++)
  {
    rcode = mvOnuGponMacMessageSend(onuId, ONU_GPON_US_MSG_PASSWORD, password);
    if (rcode != MV_OK)
    {
      mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_PASSWORD, MV_FALSE);
      return(rcode);
    }
    else
    {
      mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_PASSWORD, MV_TRUE);
    }
  }
  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacReiMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sends dying gasp message in the US direction
**
**  PARAMETERS:  MV_U8 onuId
**               MV_U8 errorsCounter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacReiMessageSend(MV_U8 onuId, MV_U32 errorsCounter)
{
  MV_STATUS     rcode;
  static MV_U8 sequenceNumber = 0;
  MV_U8        data[12];

  data[0] = (MV_U8)((errorsCounter >> 24) & 0xFF);
  data[1] = (MV_U8)((errorsCounter >> 16) & 0xFF);
  data[2] = (MV_U8)((errorsCounter >> 8) & 0xFF);
  data[3] = (MV_U8)(errorsCounter & 0xFF);
  data[4] = sequenceNumber;

  sequenceNumber++;
  if (sequenceNumber > 0xF) sequenceNumber = 0;

  rcode = mvOnuGponMacMessageSend(onuId, ONU_GPON_US_MSG_REI, data);
  if (rcode != MV_OK)
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_REI, MV_FALSE);
    return(rcode);
  }
  else
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_REI, MV_TRUE);
  }

	return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacAcknowledgeMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sends acknowledge message in the US direction
**
**  PARAMETERS:  MV_U8 onuId
**               MV_U8 errorsCounter
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAcknowledgeMessageSend(MV_U8 onuId, MV_U8 dmId, MV_U8 *dmByte)
{
  MV_STATUS rcode;
  MV_U8    data[12];

  data[0] = dmId;

  data[1] = onuId;
  data[2] = dmId;
  data[3] = dmByte[0];
  data[4] = dmByte[1];
  data[5] = dmByte[2];
  data[6] = dmByte[3];
  data[7] = dmByte[4];
  data[8] = dmByte[5];
  data[9] = dmByte[6];

  rcode = mvOnuGponMacMessageSend(onuId, ONU_GPON_US_MSG_ACK, data);
  if (rcode != MV_OK)
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_ACK, MV_FALSE);
    return(rcode);
  }
  else
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_ACK, MV_TRUE);
  }

	return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacEncryptionKeyMessageSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sends encryption key message in the US direction
**
**  PARAMETERS:  MV_U8 onuId
**               MV_U8 KeyIndex
**               MV_U8 fragIndex
**               MV_U8 *key
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacEncryptionKeyMessageSend(MV_U8 onuId,
                                             MV_U8 KeyIndex,
                                             MV_U8 fragIndex,
                                             MV_U8 *key)
{
  MV_STATUS rcode;
  MV_U8    data[12];

  data[0] = KeyIndex;
  data[1] = fragIndex;
  data[2] = key[0];
  data[3] = key[1];
  data[4] = key[2];
  data[5] = key[3];
  data[6] = key[4];
  data[7] = key[5];
  data[8] = key[6];
  data[9] = key[7];

  rcode = mvOnuGponMacMessageSend(onuId, ONU_GPON_US_MSG_ENCRYPT_KEY, data);
  if (rcode != MV_OK)
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_ENCRYPT_KEY, MV_FALSE);
    return(rcode);
  }
  else
  {
    mvOnuGponMacTxSwCountersAdd(ONU_GPON_US_MSG_ENCRYPT_KEY, MV_TRUE);
  }

	return(rcode);
}

/******************************************************************************/
/* ========================================================================== */
/*                              AES Support                                   */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacAesInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu AES
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAesInit(void)
{
  MV_U32    i;
  MV_STATUS rcode = MV_OK;

  for (i = 0 ; i < (GPON_ONU_MAX_GEM_PORTS/32) ; i++)
  {
    onuGponPortAesStatusImage[i] = 0;
    rcode |= asicOntGlbRegWrite(mvAsicReg_GPON_GEM_AES_PID_TABLE, onuGponPortAesStatusImage[i], i);
  }

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacAesEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable onu AES
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAesEnableSet(MV_BOOL enable)
{
  MV_STATUS rcode = MV_OK;
  MV_U32    enableBit;

  enableBit = (enable == MV_TRUE) ? 1 : 0;

  rcode = asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CONFIG_AES , enableBit, 0);

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacAesPortIdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function AES for port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_BOOL   status
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAesPortIdSet(MV_U32 portId, MV_BOOL status)
{
  MV_STATUS rcode;
  MV_U32    group;
  MV_U32    groupOffset;
  MV_U32    regData;
  MV_U32    statusBit;

  group       = portId / 32;
  groupOffset = portId % 32;
  statusBit   = (status == MV_TRUE) ? 1 : 0;

  /* Get Image */
  regData = onuGponPortAesStatusImage[group];

  /* Update the bit */
  regData &= ~(1 << groupOffset);                 /* Clear the bit */
  regData |= (statusBit << groupOffset);          /* Set the status */
  onuGponPortAesStatusImage[group] = regData;   /* Update the Image */
  rcode = asicOntGlbRegWrite (mvAsicReg_GPON_GEM_AES_PID_TABLE , regData, group);

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacAesPortIdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return port Id AES state
**
**  PARAMETERS:  MV_U32 portId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_BOOL mvOnuGponMacAesPortIdGet(MV_U32 portId)
{
  MV_U32  group;
  MV_U32  groupOffset;
  MV_U32  statusBit;
  MV_BOOL status;

  group       = portId / 32;
  groupOffset = portId % 32;
  statusBit = (onuGponPortAesStatusImage[group] >> groupOffset) & 1;

  status = (statusBit == 0) ? MV_FALSE : MV_TRUE;
  return(status);
}

/*******************************************************************************
**
**  mvOnuGponMacAesKeyShadowWrite
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function write AES key to GPON MAC
**
**  PARAMETERS:  MV_U8 *key
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAesKeyShadowWrite(MV_U8 *key)
{
  MV_U32    i;
  MV_U32    regData;
  MV_STATUS rcode = MV_OK;

  for (i = 0 ; i < 4 ; i++)
  {
    regData = (((MV_U32)(key[i * 4]))     << 24) |
              (((MV_U32)(key[i * 4 + 1])) << 16) |
              (((MV_U32)(key[i * 4 + 2])) <<  8) |
               ((MV_U32)(key[i * 4 + 3]));
    rcode |= asicOntGlbRegWrite (mvAsicReg_GPON_GEM_AES_SHADOW_KEY, regData, i);
  }

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacIpgValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets IPG value
**
**  PARAMETERS:  MV_U32 ipgVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacIpgValueSet(MV_U32 ipgVal)
{
	return(asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CFG_IPG_VALUE , ipgVal, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacIpgValueGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns IPG value
**
**  PARAMETERS:  MV_U32 *ipgVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacIpgValueGet(MV_U32 *ipgVal)
{
	return(asicOntGlbRegRead(mvAsicReg_GPON_GEM_CFG_IPG_VALUE, ipgVal, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacIpgValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enables IPG value settings
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacIpgValidSet(MV_BOOL enable)
{
	MV_U32    enableBit = (enable == MV_TRUE) ? 1 : 0;

	return(asicOntGlbRegWrite(mvAsicReg_GPON_GEM_CFG_IPG_VALID , enableBit, 0));
}

/*******************************************************************************
**
**  mvOnuGponMacIpgValidGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get IPG value inabled/disabled status
**
**  PARAMETERS:  MV_BOOL *enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacIpgValidGet(MV_BOOL *enable)
{
	MV_STATUS rcode = MV_OK;
	MV_U32    enableBit;

	if (enable == 0)
		return(MV_BAD_PARAM);

	rcode  = asicOntGlbRegRead(mvAsicReg_GPON_GEM_CFG_IPG_VALID , &enableBit, 0);
	if (rcode == MV_OK)
		*enable = (enableBit == 0) ? MV_FALSE : MV_TRUE;

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacGemInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init onu Gem
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacGemInit(void)
{
  MV_U32    i;
  MV_STATUS rcode = MV_OK;

  for (i = 0 ; i < (GPON_ONU_MAX_GEM_PORTS/32) ; i++)
  {
    onuGponPortValidStatusImage[i] = 0;
    rcode |= asicOntGlbRegWrite (mvAsicReg_GPON_GEM_VALID_PID_TABLE, onuGponPortValidStatusImage[i], i);
  }

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacPortIdValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set valid for port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_BOOL   status
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacPortIdValidSet(MV_U32 portId, MV_BOOL status)
{
  MV_STATUS rcode;
  MV_U32    group;
  MV_U32    groupOffset;
  MV_U32    regData;
  MV_U32    statusBit;

  group       = portId / 32;
  groupOffset = portId % 32;
  statusBit   = (status == MV_TRUE) ? 1 : 0;

  /* Get Image */
  regData = onuGponPortValidStatusImage[group];

  /* Update the bit */
  regData &= ~(1 << groupOffset);                 /* Clear the bit */
  regData |= (statusBit << groupOffset);          /* Set the status */
  onuGponPortValidStatusImage[group] = regData;   /* Update the Image */
  rcode = asicOntGlbRegWrite (mvAsicReg_GPON_GEM_VALID_PID_TABLE , regData, group);

  return(rcode);
}

/*******************************************************************************
**
**  mvOnuGponMacPortIdValidGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return port Id valid state
**
**  PARAMETERS:  MV_U32 portId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_BOOL mvOnuGponMacPortIdValidGet(MV_U32 portId)
{
  MV_U32  group;
  MV_U32  groupOffset;
  MV_U32  statusBit;
  MV_BOOL status;

  group       = portId / 32;
  groupOffset = portId % 32;
  statusBit   = (onuGponPortValidStatusImage[group] >> groupOffset) & 1;

  status = (statusBit == 0) ? MV_FALSE : MV_TRUE;

  return(status);
}

/******************************************************************************/
/* ========================================================================== */
/*                        SW FIFO                                             */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  mvOnuGponMacFifoInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function inits SW FIFO
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoInit(void)
{
  fifoCtrl.fifoReadIndex    = 0;
  fifoCtrl.fifoWriteIndex   = 0;
  fifoCtrl.fifoReparoundNum = 0;

  memset(fifoCtrl.fifoData, 0, GPON_SW_FIFO_SIZE * sizeof(S_MacPloamMsg));
}

/*******************************************************************************
**
**  mvOnuGponMacFifoMsgAlloc
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function allocates a buffer from the FIFO
**
**  PARAMETERS:  None
**
**  OUTPUTS:     MV_U32 **buffer
**               MV_U32 *bufferIndex
**
**  RETURNS:     MV_OK or MV_FULL
**
*******************************************************************************/
static inline MV_STATUS mvOnuGponMacFifoMsgAlloc(MV_U32 **buffer,
                                                 MV_U32 *bufferIndex)
{
  MV_U32  nextWriteIndex;

  nextWriteIndex = fifoCtrl.fifoWriteIndex + 1;

  /* roll over */
  if (nextWriteIndex >= GPON_SW_FIFO_SIZE)
  {
    nextWriteIndex = 0;
    fifoCtrl.fifoReparoundNum++;
  }

  if (nextWriteIndex != fifoCtrl.fifoReadIndex)
  {
    *buffer      = (MV_U32*)(&(fifoCtrl.fifoData[nextWriteIndex]));
    *bufferIndex = nextWriteIndex;

    return (MV_OK);
  }

   return(MV_FULL);
}

/*******************************************************************************
**
**  mvOnuGponMacFifoMsgSend
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets the buffer (message) for transmission
**
**  PARAMETERS:  MV_U32 bufferIndex
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
static inline void  mvOnuGponMacFifoMsgSend(MV_U32 bufferIndex)
{
  fifoCtrl.fifoWriteIndex = bufferIndex;
  fifoMacMsgAdd++;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoMsgRece
**  ____________________________________________ ________________________________
**
**  DESCRIPTION: The function receives a message  from the FIFO
**
**  PARAMETERS:  None
**
**  OUTPUTS:     MV_U32 **buffer
**               MV_U32 *bufferIndex
**
**  RETURNS:     MV_OK or MV_EMPTY
**
*******************************************************************************/
static inline MV_STATUS mvOnuGponMacFifoMsgRece(MV_U32 **buffer,
                                                MV_U32 *bufferIndex)
{
  MV_U32  nextReadIndex;

  if (fifoCtrl.fifoReadIndex != fifoCtrl.fifoWriteIndex)
  {
    nextReadIndex = fifoCtrl.fifoReadIndex + 1;

    /* roll over */
    if (nextReadIndex >= GPON_SW_FIFO_SIZE)
        nextReadIndex = 0;

    *buffer      = (MV_U32*)(&(fifoCtrl.fifoData[nextReadIndex]));
    *bufferIndex = nextReadIndex;

    return(MV_OK);
  }

  return (MV_EMPTY);
}

/*******************************************************************************
**
**  mvOnuGponMacFifoMsgFree
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns a buffer to the FIFO
**
**  PARAMETERS:  MV_U32 bufferIndex
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
static inline void  mvOnuGponMacFifoMsgFree(MV_U32 bufferIndex)
{
  fifoCtrl.fifoReadIndex = bufferIndex;
  fifoMacMsgFree++;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoEmpty
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns an answer whether the FIFO is empty
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     1 - SW FIFO is empty
**               0 - SW FIFO includes PLOAM messages
**
*******************************************************************************/
static inline int mvOnuGponMacFifoEmpty(void)
{
  return(fifoCtrl.fifoReadIndex == fifoCtrl.fifoWriteIndex);
}

/*******************************************************************************
**
**  mvOnuGponMacFifoGetInfo
**  ____________________________________________________________________________
**
**  DESCRIPTION: Debug function
**
**  PARAMETERS:
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoGetInfo(S_MacFifoCtrl **ptr, MV_32 *supported)
{
  *ptr = &fifoCtrl;
  *supported = fifoSupported;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoGetStat
**  ____________________________________________________________________________
**
**  DESCRIPTION: Debug function
**
**  PARAMETERS:
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoGetStat(MV_32 *callCnt, MV_32 *addSwCnt, MV_32 *freeSwCnt, MV_32 *sendHwCnt)
{
  *callCnt   = fifoMacMsgSend;
  *addSwCnt  = fifoMacMsgAdd;
  *freeSwCnt = fifoMacMsgFree;
  *sendHwCnt = fifoMacPloamSend;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoAuditGetStat
**  ____________________________________________________________________________
**
**  DESCRIPTION: Debug function
**
**  PARAMETERS:
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoAuditGetStat(MV_32 *enterCnt, MV_32 *actionCnt)
{
  *enterCnt  = fifoAuditEnter;
  *actionCnt = fifoAuditAction;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoSupportSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: Debug function
**
**  PARAMETERS:
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoSupportSet(MV_32 value)
{
  fifoSupported = value;
}

/*******************************************************************************
**
**  mvOnuGponMacFifoCountersSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: Debug function
**
**  PARAMETERS:
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponMacFifoCountersSet(MV_U32 value)
{
  fifoMacMsgSend   = value;
  fifoMacMsgAdd    = value;
  fifoMacMsgFree   = value;
  fifoMacPloamSend = value;
  fifoAuditEnter   = value;
  fifoAuditAction  = value;
}

/*******************************************************************************
**
**  mvOnuGponFifoAuditTimerExpireHndl
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function moves PLOAMs from SW to HW FIFO in case there is
**               no new DS PLOAMs
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void mvOnuGponFifoAuditTimerExpireHndl(void)
{
  MV_STATUS rc;
  MV_U32    hwFifoFreeEntries;
  MV_32     i;
  MV_U8     *buffer;
  MV_U32    bufferIndex;

  fifoAuditEnter++;

  if (fifoAuditEnter <= 0)
  {
    fifoAuditEnter  = 0;
    fifoAuditAction = 0;
  }

  /* Verify whether SW FIFO is empty */
  if (mvOnuGponMacFifoEmpty())
    return;

  /* Verify whether HW FIFO has free place */
  rc = mvOnuGponMacTxPloamDataFreeGet(&hwFifoFreeEntries);

  if((rc != MV_OK) || (hwFifoFreeEntries < GPON_PLOAM_MSG_WORDS))
    return;

  /* Verify whether FIFO indexes have been changed from the last Audit cycle */
  if ((fifoReadIdx  == fifoCtrl.fifoReadIndex) &&
      (fifoWriteIdx == fifoCtrl.fifoWriteIndex))
  {
    fifoAuditAction++;

    /* Lock GPON interrupt */
    /*onuPonIrqLock(onuPonResourceTbl_s.onuPonIrqId);   */

    for (i=0; i<GPON_MAX_US_MSG_TO_PROCESS; i++)
    {
        if (mvOnuGponMacFifoMsgRece((MV_U32**)&buffer, &bufferIndex) == MV_EMPTY)
          break;

        if (mvOnuGponMacTxPloamSend(buffer[0], buffer[1], &buffer[2]) != MV_OK)
          break;

        mvOnuGponMacFifoMsgFree(bufferIndex);
    }

    /* Unlock GPON interrupt */
    /*onuPonIrqUnlock(onuPonResourceTbl_s.onuPonIrqId); */
    fifoReadIdx = fifoCtrl.fifoReadIndex;
  }
  else
  {
    /* Save current values of the FIFO indexes */
    fifoReadIdx  = fifoCtrl.fifoReadIndex;
    fifoWriteIdx = fifoCtrl.fifoWriteIndex;
  }
}

/******************************************************************************/
/* ========================================================================== */
/*                         Low-Level MAC Section                              */
/* ========================================================================== */
/******************************************************************************/

/******************************************************************************/
/* ========================================================================== */
/*                            GENERAL Routines                                */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuGponMacAsicVersionGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the onu asic version
**
**  PARAMETERS:  MV_U32 *asicVer
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacAsicVersionGet(MV_U32 *asicVer)
{
  MV_STATUS rcode;
  MV_U32    asicVerVal;

  rcode = asicOntGlbRegRead (mvAsicReg_GPON_GEN_MAC_VERSION, &asicVerVal, 0);
  if (rcode != MV_OK) return(rcode);
  else *asicVer = asicVerVal;

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacMicroSecCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return the onu micro sec counter
**
**  PARAMETERS:  MV_U32 *microSec
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacMicroSecCounterGet(MV_U32 *microSec)
{
  MV_STATUS rcode;
  MV_U32    asicVerVal;

  rcode = asicOntGlbRegRead (mvAsicReg_GPON_GEN_MICRO_SEC_CNT, &asicVerVal, 0);
  if (rcode != MV_OK) return(rcode);
  else *microSec = asicVerVal;

  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacDyingGaspConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enables and sets GPIO and DeBouncer registers to allow
**               Dying Gasp interrupt.
**
**  PARAMETERS:  id- Dying Gasp 0 or 1.
**               disableEnable 0 Disable 1 Enable.
**               threshold - The number of sampling values in the debouncer before an input is asserted.
**                           1 = 6.4n sec.
**               polarity - 1= active on high, 3 = active on low.
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuGponMacDyingGaspConfigSet(MV_U32 id,
                                       MV_U32 disableEnable,
                                       MV_U32 polarity,
                                       MV_U32 threshold)
{
  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacXvrReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function execute xvr reset sequence
**
**  PARAMETERS:  MV_U32 xvrType
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS mvOnuGponMacXvrReset(MV_U32 xvrType)
{
  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacXvrActivate
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function activates xvr
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS mvOnuGponMacXvrActivate(void)
{
  return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuGponMacTxSwCountersAdd
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function updates Tx Ploam message counters
**
**  PARAMETERS:  MV_U8   msgId
**               MV_BOOL sucsses
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxSwCountersAdd(MV_U8 msgId, MV_BOOL sucsses)
{
  mvOnuGponMacPloamCnt.txMsgTotalPloamCounter++;

  if (sucsses == MV_FALSE) mvOnuGponMacPloamCnt.txErrMsgIdPloamCounter[msgId]++;
  else                     mvOnuGponMacPloamCnt.txMsgIdPloamCounter[msgId]++;

  return(MV_OK);
}

/*******************************************************************************
**
**  ponOnuMacTxSwCountersGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function updates Tx Ploam message counters
**
**  PARAMETERS:  MV_U8   msgId
**               MV_BOOL sucsses
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS mvOnuGponMacTxSwCountersGet(void* txPloamPm)
{
  MV_U32 numOfMsgIdIndex;
  S_MacTxPloamPm *outTxPloamPm = (S_MacTxPloamPm*)txPloamPm;

  outTxPloamPm->txMsgTotalPloamCounter = mvOnuGponMacPloamCnt.txMsgTotalPloamCounter;

  for (numOfMsgIdIndex = ONU_GPON_US_MSG_SN_ONU;
       numOfMsgIdIndex <= ONU_GPON_US_MSG_ACK;
       numOfMsgIdIndex++)
  {
    outTxPloamPm->txMsgIdPloamCounter[numOfMsgIdIndex]    = mvOnuGponMacPloamCnt.txMsgIdPloamCounter[numOfMsgIdIndex];
    outTxPloamPm->txErrMsgIdPloamCounter[numOfMsgIdIndex] = mvOnuGponMacPloamCnt.txErrMsgIdPloamCounter[numOfMsgIdIndex];
  }

  return(MV_OK);
}

/******************************************************************************/
/******************************************************************************/
/* ========================================================================== */
/* ========================================================================== */
/* ==                                                                      == */
/* ==           =========   =========   =========   ===       ==           == */
/* ==           =========   =========   =========   ====      ==           == */
/* ==           ==          ==     ==   ==     ==   == ==     ==           == */
/* ==           ==          ==     ==   ==     ==   ==  ==    ==           == */
/* ==           =========   =========   ==     ==   ==   ==   ==           == */
/* ==           =========   =========   ==     ==   ==    ==  ==           == */
/* ==           ==          ==          ==     ==   ==     == ==           == */
/* ==           ==          ==          ==     ==   ==      ====           == */
/* ==           =========   ==          =========   ==       ===           == */
/* ==           =========   ==          =========   ==        ==           == */
/* ==                                                                      == */
/* ========================================================================== */
/* ========================================================================== */
/******************************************************************************/
/******************************************************************************/

/* ========================================================================== */
/*                        Interrupt Functions Section                         */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacPonInterruptGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return interrupt status
**
**  PARAMETERS:  MV_U32 *interrupt
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPonInterruptGet(MV_U32 *interrupt)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_INTR_REG, interrupt, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPonInterruptrMaskGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return interrupt mask
**
**  PARAMETERS:  MV_U32 *mask
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPonInterruptMaskGet(MV_U32 *mask)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_INTR_MASK, mask, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPonInterruptrMaskSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set interrupt mask
**
**  PARAMETERS:  MV_U32 mask
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPonInterruptMaskSet(MV_U32 mask)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_INTR_MASK, mask, 0);

  return(status);
}

/* ========================================================================== */
/*                        General Functions Section                           */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacVersionGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return mac version
**
**  PARAMETERS:  MV_U32 *version
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacVersionGet(MV_U32 *version)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_GEN_MAC_VERSION_ADDR, version, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsRxEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PcsRxEnable register
**
**  PARAMETERS:  MV_U32 rxEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsRxEnableSet(MV_U32 rxEnable)
{
    MV_STATUS status;

    status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION_RX_ENABLE, rxEnable, 0);

    return (status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsTxEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets PcsTxEnable register
**
**  PARAMETERS:  MV_U32 txEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsTxEnableSet(MV_U32 txEnable)
{
    MV_STATUS status;

    status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION_TX_ENABLE, txEnable, 0);

    return (status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Rx & Tx enable
**
**  PARAMETERS:  MV_U32 rxEnable
**               MV_U32 txEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuEnableSet(MV_U32 rxEnable, MV_U32 txEnable)
{
    MV_STATUS status;

    status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION_RX_ENABLE, rxEnable, 0);
    status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_RX_ENABLE, rxEnable, 0);

    status |= asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION_TX_ENABLE, txEnable, 0);
    status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_TX_ENABLE, txEnable, 0);

    return (status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuRxEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Rx enable
**
**  PARAMETERS:  MV_U32 rxEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuRxEnableSet(MV_U32 rxEnable)
{
    MV_STATUS status;

    status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION_RX_ENABLE, rxEnable, 0);

    status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_RX_ENABLE, rxEnable, 0);

    return (status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuTxEnableSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu Rx & Tx enable
**
**  PARAMETERS:  MV_U32 txEnable
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuTxEnableSet(MV_U32 txEnable, MV_U32 macId)
{
  MV_STATUS status;
  MV_U32    currOnuTxEnable;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_ONT_TX_ENABLE, &currOnuTxEnable, 0);

  if (txEnable == 0) currOnuTxEnable &= ~(1 << macId);
  else               currOnuTxEnable |=  (1 << macId);

  status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_TX_ENABLE, currOnuTxEnable, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu state
**
**  PARAMETERS:  MV_U32 onuState
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuStateSet(MV_U32 onuState, MV_U32 macId)
{
  MV_STATUS status;
  MV_U32    currOnuState;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_ONT_STATE_REG, &currOnuState, 0);

  if (onuState == 0) currOnuState &= ~(1 << macId);
  else               currOnuState |=  (1 << macId);

  status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_STATE_REG, currOnuState, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu state
**
**  PARAMETERS:  MV_U32 *onuState
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuStateGet(MV_U32 *onuState, MV_U32 macId)
{
  MV_STATUS status;
  MV_U32    currOnuState;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_ONT_STATE_REG, &currOnuState, 0);

  *onuState = ((currOnuState >> macId) & (0x1));

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuRegAutoUpdateStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu register auto update params
**
**  PARAMETERS:  MV_U32 value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuRegAutoUpdateStateSet(MV_U32 value)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_STATE_REG_AUTO_EN, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuReRegAutoUpdateStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu re-register auto update params
**
**  PARAMETERS:  MV_U32 value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuReRegAutoUpdateStateSet(MV_U32 value)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_STATE_REREG_AUTO_EN, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuDeRegAutoUpdateStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu de-register auto update params
**
**  PARAMETERS:  MV_U32 value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuDeRegAutoUpdateStateSet(MV_U32 value)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_STATE_DEREG_AUTO_EN, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacOnuNackAutoUpdateStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu nack auto update params
**
**  PARAMETERS:  MV_U32 value
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacOnuNackAutoUpdateStateSet(MV_U32 value)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_STATE_NACK_AUTO_EN, value, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenTqSizeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu TQ size
**
**  PARAMETERS:  MV_U32 tqRxSize
**               MV_U32 tqTxSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenTqSizeSet(MV_U32 tqRxSize, MV_U32 tqTxSize)
{
  MV_STATUS status;
  MV_U32    tqSize;

  tqSize = ((tqTxSize & 0xF) << 4) |
            (tqRxSize & 0xF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_TQ_SIZE, tqSize, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenLaserParamSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu laser params
**
**  PARAMETERS:  MV_U32 onOffTime
**               MV_U32 onTime
**               MV_U32 offTime
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenLaserParamSet(MV_U32 onOffTime, MV_U32 onTime, MV_U32 offTime)
{
  MV_STATUS status;
  MV_U32    lazerTime;

  lazerTime =  ((onOffTime & 0xFF) << 16) |
                 ((offTime & 0xFF) << 8)  |
                   (onTime & 0xFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_LASER_PARAM, lazerTime, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenLaserParamGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return laser params
**
**  PARAMETERS:  MV_U32 *onOffTime
**               MV_U32 *onTime
**               MV_U32 *offTime
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenLaserParamGet(MV_U32 *onOffTime, MV_U32 *onTime, MV_U32 *offTime)
{
  MV_STATUS status;
  MV_U32    lazerTime;

  status = asicOntGlbRegRead(mvAsicReg_EPON_GEN_LASER_PARAM, &lazerTime, 0);

  *onTime    =  (lazerTime        & 0xFF);
  *offTime   = ((lazerTime >>  8) & 0xFF);
  *onOffTime = ((lazerTime >> 16) & 0xFF);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenProcessingTimeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu processing time
**
**  PARAMETERS:  MV_U32 packetTailGuard
**               MV_U32 tailGuard
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenTailGuardSet(MV_U32 packetTailGuard, MV_U32 tailGuard)
{
  MV_STATUS status;
  MV_U32    guard;

  guard =  ((packetTailGuard  & 0xFF) << 8)  |
                  (tailGuard  & 0xFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_TAIL_GUARD, guard, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSyncTimeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu sync time
**
**  PARAMETERS:  MV_U32 syncTime
**               MV_U32 addSyncTime
**               MV_U32 forceSwUpdate
**               MV_U32 disAutoUpdate
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSyncTimeSet(MV_U32 syncTime,
                                     MV_U32 addSyncTime,
                                     MV_U32 forceSwUpdate,
                                     MV_U32 disGateAutoUpdate,
                                     MV_U32 disDiscoveryAutoUpdate)
{
  MV_STATUS status;
  MV_U32    sync;

  sync =         ((addSyncTime   & 0x00FF) << 24) |
        ((disDiscoveryAutoUpdate & 0x0001) << 18) |
             ((disGateAutoUpdate & 0x0001) << 17) |
                ((forceSwUpdate  & 0x0001) << 16) |
                      (syncTime  & 0xFFFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SYNC_TIME, sync, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSyncTimeGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu sync time
**
**  PARAMETERS:  MV_U32 *syncTime
**               MV_U32 *addSyncTime
**               MV_U32 *forceSwUpdate
**               MV_U32 *disAutoUpdate
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSyncTimeGet(MV_U32 *syncTime,
                                     MV_U32 *addSyncTime,
                                     MV_U32 *forceSwUpdate,
                                     MV_U32 *disGateAutoUpdate,
                                     MV_U32 *disDiscoveryAutoUpdate)
{
  MV_STATUS status;
  MV_U32    sync;

  status = asicOntGlbRegRead(mvAsicReg_EPON_GEN_SYNC_TIME, &sync, 0);

  *addSyncTime            = ((sync >> 24) & 0x00FF);
  *disDiscoveryAutoUpdate = ((sync >> 18) & 0x0001);
  *disGateAutoUpdate      = ((sync >> 17) & 0x0001);
  *forceSwUpdate          = ((sync >> 16) & 0x0001);
  *syncTime               = ((sync)       & 0xFFFF);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenBcastAddrSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu mac broadcast address
**
**  PARAMETERS:  MV_U32 bcastMacAddrHigh
**               MV_U32 bcastMacAddrLow
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenBcastAddrSet(MV_U32 bcastMacAddrHigh, MV_U32 bcastMacAddrLow)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_BROADCAST_ADDR_LOW,  bcastMacAddrLow, 0);
  status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_BROADCAST_ADDR_HIGH, bcastMacAddrHigh & 0xFFFF, 0);

  return(status);
}

 /*******************************************************************************
**
**  mvOnuEponMacGenSyncTimeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu configuration
**
**  PARAMETERS:  MV_U32 rxFec
**               MV_U32 txFec
**               MV_U32 reportAutoResponse
**               MV_U32 ackAutoResponse
**               MV_U32 requestAutoResponse
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenOnuConfigSet(MV_U32 rxPcsFecEn,
                                      MV_U32 txPcsFecEn,
                                      MV_U32 reportAutoResponse,
                                      MV_U32 ackAutoResponse,
                                      MV_U32 requestAutoResponse,
                                      MV_U32 txFecEn)
{
  MV_STATUS status;
  MV_U32    config;

  config =             ((txFecEn & 0x00FF) << 8) |
           ((requestAutoResponse & 0x0001) << 6) |
               ((ackAutoResponse & 0x0001) << 5) |
            ((reportAutoResponse & 0x0001) << 4) |
                    ((rxPcsFecEn & 0x0001) << 1) |
                     (txPcsFecEn & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_CONFIGURATION, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenOnuConfigAutoReportSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu configuration auto report
**
**  PARAMETERS:  MV_U32 reportAutoResponse
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenOnuConfigAutoReportSet(MV_U32 reportAutoResponse)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_CONFIGURATION_AUTO_REPORT, reportAutoResponse, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenOnuConfigAutoAckSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu configuration auto ack
**
**  PARAMETERS:  MV_U32 ackAutoResponse
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenOnuConfigAutoAckSet(MV_U32 ackAutoResponse)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_CONFIGURATION_AUTO_ACK, ackAutoResponse, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenOnuConfigAutoRequestSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu configuration auto response
**
**  PARAMETERS:  MV_U32 requestAutoResponse
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenOnuConfigAutoRequestSet(MV_U32 requestAutoResponse)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_CONFIGURATION_AUTO_REQUEST, requestAutoResponse, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSldSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SLD
**
**  PARAMETERS:  MV_U32 sld
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSldSet(MV_U32 sld)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SLD, sld, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenCtrlTypeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set control type (Ether type)
**
**  PARAMETERS:  MV_U32 sld
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenCtrlTypeSet(MV_U32 type)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_MAC_CONTROL_TYPE, type, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenLocalTimeStampSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu local timestamp
**
**  PARAMETERS:  MV_U32 timeStamp
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenLocalTimeStampSet(MV_U32 timeStamp)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_LOCAL_TIMESTAMP, timeStamp, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenLocalTimeStampGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu local timestamp
**
**  PARAMETERS:  MV_U32 *timeStamp
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenLocalTimeStampGet(MV_U32 *timeStamp)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_LOCAL_TIMESTAMP, timeStamp, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenPendGrantSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu pending grants
**
**  PARAMETERS:  MV_U32 grant
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenPendGrantSet(MV_U32 grant)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_NUM_OF_PENDING_GRANTS, grant, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenPendGrantSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SGL status
**
**  PARAMETERS:  MV_U32 *status
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSglStatusGet(MV_U32 *sglStatus)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_SGL_STATUS, sglStatus, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenPonPhyDbgSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu PON phy debug
**
**  PARAMETERS:  MV_U32 ponDebug
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenPonPhyDbgSet(MV_U32 ponDebug)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_PON_PHY_DEBUG, ponDebug, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenPonPhyDbgGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu PON phy debug
**
**  PARAMETERS:  MV_U32 *ponDebug
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenPonPhyDbgGet(MV_U32 *ponDebug)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_PON_PHY_DEBUG, ponDebug, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSglSwReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu SGL sw reset
**
**  PARAMETERS:  MV_U32 swReset
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSglSwReset(MV_U32 swReset)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SGL_SW_RESET, swReset, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSglConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SGL configuration
**
**  PARAMETERS:  startThreshold
**               dataAlignment
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSglConfig(MV_U32 startThreshold,
                                   MV_U32 dataAlignment)
{
  MV_STATUS status;
  MV_U32    config;

  config = ((dataAlignment  & 0x0001) << 4) |
            (startThreshold & 0x000F);

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SGL_CONFIG, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSglDebounceConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SGL Debounce configuration
**
**  PARAMETERS:  MV_U32 polarity
**               MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSglDebounceConfig(MV_U32 polarity,
                                           MV_U32 threshold)
{
  MV_STATUS status;
  MV_U32    config;

  config = ((polarity  & 0x0001) << 16) |
            (threshold & 0xFFFF);

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SGL_DEBOUNCE_CONFIG, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenSglDebounceEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu SGL Debounce enable
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenSglDebounceEnable(MV_U32 enable)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_SGL_DEBOUNCE_ENABLE, enable, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenChurningKeySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu churning key
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenChurningKeySet(MV_U32 key)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_TCH_CHURNING_KEY, key, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenOpcodeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu additional opcode
**
**  PARAMETERS:  MV_U32 opcodeType
**               MV_U32 value
**               MV_U32 index
**               MV_U32 timestamp
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenOpcodeSet(MV_U32 opcodeType,
                                   MV_U32 value,
                                   MV_U32 index,
                                   MV_U32 timestamp,
                                   MV_U32 valid)
{
  MV_STATUS status = MV_OK;
  MV_U32    opcode;

  opcode =     ((valid & 0x0001) << 20) |
           ((timestamp & 0x0001) << 19) |
               ((index & 0x0007) << 16) |
                (value & 0xFFFF);

  if      (opcodeType == ADDITIONAL_OPCODE_1)
    status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ADDITIONAL_OPCODE1, opcode, 0);
  else if (opcodeType == ADDITIONAL_OPCODE_2)
    status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ADDITIONAL_OPCODE2, opcode, 0);
  else if (opcodeType == ADDITIONAL_OPCODE_3)
    status = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ADDITIONAL_OPCODE3, opcode, 0);

  return(status);
}
#ifdef PON_Z2
/*******************************************************************************
**
**  mvOnuEponMacGenTimestampConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu timestamp configuration
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenTimestampConfig(MV_U32 gpmAddSyncTimeToTimestamp,
                                         MV_U32 gpmAimestampOffset,
                                         MV_U32 txmAddSyncTimeToTimestamp,
                                         MV_U32 txmUseTimestampImage,
                                         MV_U32 txmTimestampOffset)
{
  MV_STATUS status;
  MV_U32    timestampConfig;

  timestampConfig = ((gpmAddSyncTimeToTimestamp & 0x0001) << 31) |
                           ((gpmAimestampOffset & 0x07FF) << 16) |
                    ((txmAddSyncTimeToTimestamp & 0x0001) << 15) |
                         ((txmUseTimestampImage & 0x0001) << 14) |
                            (txmTimestampOffset & 0x07FF);

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_TIMESTAMP_CONFIG, timestampConfig, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenRxTimestampConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu RX timestamp configuration
**
**  PARAMETERS:
**		MV_U32 rxpTimestampSelect	- 0 or 1
**		MV_U32 rxpTimestampSign		- 0 or 1
**		MV_U32 rxpTimestampOffset	- 0 to 0x7FF
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenRxTimestampConfigSet(MV_U32 rxpTimestampSelect,
						MV_U32 rxpTimestampSign,
						MV_U32 rxpTimestampOffset)
{
	MV_U32		timestampConfig;

	timestampConfig = ((rxpTimestampSelect & 0x1) << 15) |
			((rxpTimestampSign & 0x1) << 11) |
			(rxpTimestampOffset & 0x07FF);

	return(asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_RX_TIMESTAMP_CONFIG, timestampConfig, 0));
}

/*******************************************************************************
**
**  mvOnuEponMacGenRxTimestampConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reads onu RX timestamp configuration
**
**  PARAMETERS:
**		MV_U32 *rxpTimestampSelect	- 0 or 1
**		MV_U32 *rxpTimestampSign	- 0 or 1
**		MV_U32 *rxpTimestampOffset	- 0 to 0x7FF
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenRxTimestampConfigGet(MV_U32 *rxpTimestampSelect,
											MV_U32 *rxpTimestampSign,
											MV_U32 *rxpTimestampOffset)
{
	MV_STATUS	status;
	MV_U32		timestampConfig;

	if ((rxpTimestampSelect == 0) || (rxpTimestampSign == 0) || (rxpTimestampOffset == 0))
		return(MV_BAD_PARAM);

	status = asicOntGlbRegRead(mvAsicReg_EPON_GEN_ONT_RX_TIMESTAMP_CONFIG, &timestampConfig, 0);

	if (status == MV_OK) {
		*rxpTimestampSelect = (timestampConfig >> 15) & 0x1;
		*rxpTimestampSign = (timestampConfig >> 11) & 0x1;
		*rxpTimestampOffset = timestampConfig & 0x7FF;
	}

	return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenRegPacketPaddingGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function gets onu packet padding
**
**  PARAMETERS:
**		MV_U32 regAckPadding	- padding value for Ack (0 - 0xFF)
**		MV_U32 regReqPadding	- padding value for Request (0 - 0xFF)
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenRegPacketPaddingGet(MV_U32 *regAckPadding, MV_U32 *regReqPadding)
{
	MV_STATUS	status;
	MV_U32		paddingConfig;

	if ((regAckPadding == 0) || (regReqPadding == 0))
		return(MV_BAD_PARAM);

	status = asicOntGlbRegRead(mvAsicReg_EPON_GEN_ONT_REGISTER_PACKET_PADDING, &paddingConfig, 0);

	if (status == MV_OK) {
		*regAckPadding = (paddingConfig >> 8) & 0xFF;
		*regReqPadding = paddingConfig & 0xFF;
	}

	return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenRegPacketPaddingSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets onu packet padding
**
**  PARAMETERS:
**		MV_U32 *regAckPadding	- padding value for Ack
**		MV_U32 *regReqPadding	- padding value for Request
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenRegPacketPaddingSet(MV_U32 regAckPadding, MV_U32 regReqPadding)
{
	MV_U32		paddingConfig;

	paddingConfig = ((regAckPadding & 0xFF) << 8) | (regReqPadding & 0xFF);

	return(asicOntGlbRegWrite(mvAsicReg_EPON_GEN_ONT_REGISTER_PACKET_PADDING, paddingConfig, 0));
}

#endif /* PON_Z2 */
/*******************************************************************************
**
**  mvOnuEponMacGenDriftThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu drift threshold
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenDriftThresholdSet(MV_U32 threshold)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_DRIFT_THRESHOLD, threshold, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenTimeStampForIntrSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu timestamp for interrupt
**
**  PARAMETERS:  MV_U32 timestamp
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenTimeStampForIntrSet(MV_U32 timestamp)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_TIMESTAMP_VAL_FOR_INTR, timestamp, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenTimeStampForIntrGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get onu timestamp for interrupt
**
**  PARAMETERS:  MV_U32 *timestamp
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenTimeStampForIntrGet(MV_U32 *timestamp)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_GEN_TIMESTAMP_VAL_FOR_INTR, timestamp, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenUcastAddrSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu mac address
**
**  PARAMETERS:  MV_U32 ucastMacAddrHigh
**               MV_U32 ucastMacAddrLow
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenUcastAddrSet(MV_U32 ucastMacAddrHigh, MV_U32 ucastMacAddrLow, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_MAC_ADDR_LOW,  ucastMacAddrLow, macId);
  status |= asicOntGlbRegWrite(mvAsicReg_EPON_GEN_MAC_ADDR_HIGH, ucastMacAddrHigh & 0xFFFF, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenUtmTcPeriodSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu TC period
**
**  PARAMETERS:  MV_U32 tcPeriod
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenUtmTcPeriodSet(MV_U32 tcPeriod)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_UTM_TC_PERIOD, tcPeriod, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenUtmTcPeriodEnSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu TC period enable
**
**  PARAMETERS:  MV_U32 tcPeriodEnable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenUtmTcPeriodEnSet(MV_U32 tcPeriodEnable)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_UTM_TC_PERIOD_VALID, tcPeriodEnable, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenGemIpgValueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu IPG value
**
**  PARAMETERS:  MV_U32 ipgVal
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenGemIpgValueSet(MV_U32 ipgVal)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_GEM_IPG_VAL, ipgVal, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGenGemIpgValueEnSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu IPG value enable
**
**  PARAMETERS:  MV_U32 ipgValEn
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGenGemIpgValueEnSet(MV_U32 ipgValEn)
{
  MV_STATUS status;

  status  = asicOntGlbRegWrite(mvAsicReg_EPON_GEN_GEM_IPG_VAL_VALID, ipgValEn, 0);

  return(status);
}

/* ========================================================================== */
/*                        RXP Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketSizeLimitSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set packet min / mac size
**
**  PARAMETERS:  MV_U32 minSize
**               MV_U32 maxSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketSizeLimitSet(MV_U32 minSize,
                                            MV_U32 maxSize)
{
  MV_STATUS status;
  MV_U32    size;

  size = ((maxSize & 0x0FFF) << 16) |
          (minSize & 0x0FFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_PACKET_SIZE_LIMIT, size, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketSizeLimitGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return packet min / mac size
**
**  PARAMETERS:  MV_U32 *minSize
**               MV_U32 *maxSize
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketSizeLimitGet(MV_U32 *minSize,
                                            MV_U32 *maxSize)
{
  MV_STATUS status;
  MV_U32    size;

  status = asicOntGlbRegRead(mvAsicReg_EPON_RXP_PACKET_SIZE_LIMIT, &size, 0);

  *minSize =  size        & 0x0FFF;
  *maxSize = (size >> 16) & 0x0FFF;

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketFilterSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set packet filtering
**
**  PARAMETERS:  MV_U32 ignoreLlidCrcError
**               MV_U32 ignoreFcsError
**               MV_U32 ignoreGmiiError
**               MV_U32 ignoreLengthError
**               MV_U32 forwardAllLlid
**               MV_U32 forwardBc0FFF
**               MV_U32 forwardBc1FFF
**               MV_U32 forwardBc1xxx
**               MV_U32 dropBc1nnn
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketFilterSet(MV_U32 ignoreLlidCrcError,
                                         MV_U32 ignoreFcsError,
                                         MV_U32 ignoreGmiiError,
                                         MV_U32 ignoreLengthError,
                                         MV_U32 forwardAllLlid,
                                         MV_U32 forwardBc0FFF,
                                         MV_U32 forwardBc1FFF,
                                         MV_U32 forwardBc1xxx,
                                         MV_U32 dropBc1nnn)
{
  MV_STATUS status;
  MV_U32    filter;

  filter =        ((dropBc1nnn & 0x0001) << 8) |
               ((forwardBc1xxx & 0x0001) << 7) |
               ((forwardBc1FFF & 0x0001) << 6) |
               ((forwardBc0FFF & 0x0001) << 5) |
              ((forwardAllLlid & 0x0001) << 4) |
           ((ignoreLengthError & 0x0001) << 3) |
             ((ignoreGmiiError & 0x0001) << 2) |
              ((ignoreFcsError & 0x0001) << 1) |
           (ignoreLlidCrcError & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_PACKET_FILTER, filter, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketFilterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return packet filtering
**
**  PARAMETERS:  MV_U32 *ignoreLlidCrcError
**               MV_U32 *ignoreFcsError
**               MV_U32 *ignoreGmiiError
**               MV_U32 *ignoreLengthError
**               MV_U32 *forwardAllLlid
**               MV_U32 *forwardBc0FFF
**               MV_U32 *forwardBc1FFF
**               MV_U32 *forwardBc1xxx
**               MV_U32 *dropBc1nnn
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketFilterGet(MV_U32 *ignoreLlidCrcError,
                                         MV_U32 *ignoreFcsError,
                                         MV_U32 *ignoreGmiiError,
                                         MV_U32 *ignoreLengthError,
                                         MV_U32 *forwardAllLlid,
                                         MV_U32 *forwardBc0FFF,
                                         MV_U32 *forwardBc1FFF,
                                         MV_U32 *forwardBc1xxx,
                                         MV_U32 *dropBc1nnn)
{
  MV_STATUS status;
  MV_U32    filter;

  status = asicOntGlbRegRead(mvAsicReg_EPON_RXP_PACKET_FILTER, &filter, 0);

  *dropBc1nnn         = ((filter >> 8) & 0x0001);
  *forwardBc1xxx      = ((filter >> 7) & 0x0001);
  *forwardBc1FFF      = ((filter >> 6) & 0x0001);
  *forwardBc0FFF      = ((filter >> 5) & 0x0001);
  *forwardAllLlid     = ((filter >> 4) & 0x0001);
  *ignoreLengthError  = ((filter >> 3) & 0x0001);
  *ignoreGmiiError    = ((filter >> 2) & 0x0001);
  *ignoreFcsError     = ((filter >> 1) & 0x0001);
  *ignoreLlidCrcError = ( filter       & 0x0001);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketForwardSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set packet forwarding
**
**  PARAMETERS:  MV_U32 ctrlFrameToDataQueue
**               MV_U32 ctrlFrameToCtrlQueue
**               MV_U32 rprtFrameToDataQueue
**               MV_U32 rprtFrameToRprtQueue
**               MV_U32 slowFrameToRprtQueue
**               MV_U32 slowFrameToCtrlQueue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketForwardSet(MV_U32 ctrlFrameToDataQueue,
                                          MV_U32 ctrlFrameToCtrlQueue,
                                          MV_U32 rprtFrameToDataQueue,
                                          MV_U32 rprtFrameToRprtQueue,
                                          MV_U32 slowFrameToRprtQueue,
                                          MV_U32 slowFrameToCtrlQueue)
{
  MV_STATUS status;
  MV_U32    forward;

  forward = ((slowFrameToCtrlQueue & 0x0001) << 5) |
            ((slowFrameToRprtQueue & 0x0001) << 4) |
            ((rprtFrameToRprtQueue & 0x0001) << 3) |
            ((rprtFrameToDataQueue & 0x0001) << 2) |
            ((ctrlFrameToCtrlQueue & 0x0001) << 1) |
             (ctrlFrameToDataQueue & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_CTRL_FRAME_FORWARD, forward, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpPacketForwardGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return packet forwarding
**
**  PARAMETERS:  MV_U32 *ctrlFrameToDataQueue
**               MV_U32 *ctrlFrameToCtrlQueue
**               MV_U32 *rprtFrameToDataQueue
**               MV_U32 *rprtFrameToRprtQueue
**               MV_U32 *slowFrameToRprtQueue
**               MV_U32 *slowFrameToCtrlQueue
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpPacketForwardGet(MV_U32 *ctrlFrameToDataQueue,
                                          MV_U32 *ctrlFrameToCtrlQueue,
                                          MV_U32 *rprtFrameToDataQueue,
                                          MV_U32 *rprtFrameToRprtQueue,
                                          MV_U32 *slowFrameToRprtQueue,
                                          MV_U32 *slowFrameToCtrlQueue)
{
  MV_STATUS status;
  MV_U32    forward;

  status = asicOntGlbRegRead(mvAsicReg_EPON_RXP_CTRL_FRAME_FORWARD, &forward, 0);

  *slowFrameToCtrlQueue = ((forward >> 5) & 0x0001);
  *slowFrameToRprtQueue = ((forward >> 4) & 0x0001);
  *rprtFrameToRprtQueue = ((forward >> 3) & 0x0001);
  *rprtFrameToDataQueue = ((forward >> 2) & 0x0001);
  *ctrlFrameToCtrlQueue = ((forward >> 1) & 0x0001);
  *ctrlFrameToDataQueue = ( forward       & 0x0001);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpLlidDataSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set LLID Data entry
**
**  PARAMETERS:  MV_U32 llid
**               MV_U32 index
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpLlidDataSet(MV_U32 llid, MV_U32 index)
{
  MV_STATUS status;

  if (index >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_LLT_LLID_DATA, llid, index);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpLlidDataGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return LLID Data entry
**
**  PARAMETERS:  MV_U32 *llid
**               MV_U32 index
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpLlidDataGet(MV_U32 *llid, MV_U32 index)
{
  MV_STATUS status;

  if (index >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_RXP_LLT_LLID_DATA, llid, index);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpEncConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Encryption configuration
**
**  PARAMETERS:  MV_U32 config
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpEncConfigSet(MV_U32 config)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_ENCRYPTION_CONFIG, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpEncConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Encryption configuration
**
**  PARAMETERS:  MV_U32 *config
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpEncConfigGet(MV_U32 *config)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_RXP_ENCRYPTION_CONFIG, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpEncKeySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Encryption key
**
**  PARAMETERS:  MV_U32 key
**               MV_U32 index
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpEncKeySet(MV_U32 key, MV_U32 index, MV_U32 macId)
{
  MV_STATUS status = MV_OK;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  if (index == 0)
  {
    status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_ENCRYPTION_KEY0, key, macId);
  }
  else if (index == 1)
  {
    status = asicOntGlbRegWrite(mvAsicReg_EPON_RXP_ENCRYPTION_KEY1, key, macId);
  }

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpEncKeyGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set Encryption key
**
**  PARAMETERS:  MV_U32 *keyIndex0
**               MV_U32 *keyIndex1
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpEncKeyGet(MV_U32 *keyIndex0, MV_U32 *keyIndex1, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status  = asicOntGlbRegRead(mvAsicReg_EPON_RXP_ENCRYPTION_KEY0, keyIndex0, macId);
  status |= asicOntGlbRegRead(mvAsicReg_EPON_RXP_ENCRYPTION_KEY1, keyIndex1, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxpDataFifoThresholdSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets Data FIFO Threshold
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpDataFifoThresholdSet(MV_U32 threshold)
{
	return(asicOntGlbRegWrite(mvAsicReg_EPON_RXP_DATA_FIFO_THRESH, threshold, 0));
}

/*******************************************************************************
**
**  mvOnuEponMacRxpDataFifoThresholdGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function gets Data FIFO Threshold
**
**  PARAMETERS:  MV_U32 *threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxpDataFifoThresholdGet(MV_U32 *threshold)
{
	return(asicOntGlbRegRead(mvAsicReg_EPON_RXP_DATA_FIFO_THRESH, threshold, 0));
}


/* ========================================================================== */
/*                        GPM Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacGpmMacFutureGrantTimeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set future grants
**
**  PARAMETERS:  MV_U32 grant
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmMacFutureGrantTimeSet(MV_U32 grant)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GPM_MAX_FUTURE_GRANT_TIME, grant, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmMinProcessingTimeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set min processing time
**
**  PARAMETERS:  MV_U32 processingTime
**               MV_U32 effectiveLength
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmMinProcessingTimeSet(MV_U32 processingTime, MV_U32 effectiveLength)
{
  MV_STATUS status;
  MV_U32    minProcTime;

  minProcTime = ((effectiveLength & 0x00FF) << 16) |
                 (processingTime  & 0xFFFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GPM_MIN_PROCESSING_TIME, minProcTime, 0);

  return(status);
}
#ifdef PON_Z2
/*******************************************************************************
**
**  mvOnuEponMacGpmDiscoveryGrantLengthSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set discovery grant length
**
**  PARAMETERS:  MV_U32 grantLength
**               MV_U32 addOffsetForCalc
**               MV_U32 grantLengthMultiTq
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmDiscoveryGrantLengthSet(MV_U32 grantLength,
                                                 MV_U32 addOffsetForCalc,
                                                 MV_U32 grantLengthMultiTq)
{
  MV_STATUS status;
  MV_U32    discoveryGrantLength;

  discoveryGrantLength = ((grantLengthMultiTq & 0x0FFF) << 16) |
                           ((addOffsetForCalc & 0x000F) << 12) |
                                (grantLength  & 0x0FFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GPM_DISCOVERY_GRANT_LENGTH, discoveryGrantLength, 0);

  return(status);
}

#endif /* PON_Z2 */
#ifdef PON_Z1
/*******************************************************************************
**
**  mvOnuEponMacGpmDiscoveryGrantLengthSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set discovery grant length
**
**  PARAMETERS:  MV_U32 grantLength
**               MV_U32 grantLengthMultiTq
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmDiscoveryGrantLengthSet(MV_U32 grantLength, MV_U32 grantLengthMultiTq)
{
  MV_STATUS status;
  MV_U32    discoveryGrantLength;

  discoveryGrantLength = ((grantLengthMultiTq & 0x0FFF) << 16) |
                                (grantLength  & 0x0FFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_GPM_DISCOVERY_GRANT_LENGTH, discoveryGrantLength, 0);

  return(status);
}
#endif /* PON_Z1 */
/*******************************************************************************
**
**  mvOnuEponMacGpmRxSyncGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return Rx sync time
**
**  PARAMETERS:  MV_U32 *syncTime
**               MV_U32 *syncTimeUpdateInd
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmRxSyncGet(MV_U32 *syncTime, MV_U32 *syncTimeUpdateInd)
{
  MV_STATUS status;
  MV_U32    time;

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_RX_SYNC_TIME, &time, 0);

  *syncTimeUpdateInd = ((time >> 16) & 0x0001);
  *syncTime          =  (time        & 0xFFFF);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmGrantValidCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmGrantValidCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_GRANT_VALID, counter, macId);

  return(status);
}

/*****************************************************S**************************
**
**  mvOnuEponMacGpmGrantMaxFutureTimeErrorCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmGrantMaxFutureTimeErrorCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_GRANT_MAX_FUTURE_TIME_ERR, counter, macId);

  return(status);
}
/*******************************************************************************
**
**  mvOnuEponMacGpmMinProcTimeErrorCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmMinProcTimeErrorCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_MIN_PROC_TIME_ERR, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmLengthErrorCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmLengthErrorCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_LENGTH_ERR, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmDiscoveryAndRegisterCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmDiscoveryAndRegisterCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_DISCOVERY_AND_REGISTERED_ERR, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmFifoFullErrorCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmFifoFullErrorCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_FIFO_FULL_ERR, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmOpcDiscoveryNotRegisterBcastCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcDiscoveryNotRegisterBcastCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_DISC_NOT_REG_BCAST, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmOpcRegisterNotDiscoveryCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcRegisterNotDiscoveryCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_REG_NOT_DISC, counter, macId);

  return(status);
}
/*******************************************************************************
**
**  mvOnuEponMacGpmOpcDiscoveryNotRegisterNotBcastCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcDiscoveryNotRegisterNotBcastCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_DISC_NOT_REG_NOT_BCAST, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmOpcDropGrantCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcDropGrantCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_DROPED_GRANT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmOpcHiddenGrantCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcHiddenGrantCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_HIDDEN_GRANT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacGpmOpcBackToBackCounterGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return GPM counters
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacGpmOpcBackToBackCounterGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_GPM_OPC_BACK_TO_BACK_GRANT, counter, macId);

  return(status);
}

/* ========================================================================== */
/*                        TXM Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacTxmOverheadSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX module overhead
**
**  PARAMETERS:  MV_U32 overhead
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmOverheadSet(MV_U32 overhead)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_DEFAULT_OVERHEAD, overhead, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmOverheadGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get TX module overhead
**
**  PARAMETERS:  None
**
**  OUTPUTS:     MV_U32 overhead
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmOverheadGet(MV_U32 *overhead)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_TXM_DEFAULT_OVERHEAD, overhead, 0);

  return(status);
}

#ifdef PON_Z2
/*******************************************************************************
**
**  mvOnuEponMacTxmConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX configuration
**
**  PARAMETERS:  MV_U32 mode
**               MV_U32 alignment
**               MV_U32 priority
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmConfigSet(MV_U32 tFec1Cfg, MV_U32 tFec2Cfg, MV_U32 ctrlFifoDisFcs,
                                   MV_U32 maskGmiiSignal, MV_U32 blockDataFromDataPath,
                                   MV_U32 addIpgToLenCalc, MV_U32 mode, MV_U32 alignment,
                                   MV_U32 priority)
{
  MV_STATUS status;
  MV_U32    config;

  config =              ((tFec1Cfg & 0x0007) << 13) |
                        ((tFec2Cfg & 0x0007) << 10) |
                  ((ctrlFifoDisFcs & 0x0001) <<  8) |
                  ((maskGmiiSignal & 0x0001) <<  7) |
           ((blockDataFromDataPath & 0x0001) <<  6) |
                 ((addIpgToLenCalc & 0x0001) <<  5) |
                            ((mode & 0x0003) <<  3) |
                       ((alignment & 0x0003) <<  1) |
                         (priority & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CONFIGURATION, config, 0);

  return(status);
}
#endif /* PON_Z2 */
#ifdef PON_Z1
/*******************************************************************************
**
**  mvOnuEponMacTxmConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX configuration
**
**  PARAMETERS:  MV_U32 mode
**               MV_U32 alignment
**               MV_U32 priority
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmConfigSet(MV_U32 mode, MV_U32 alignment, MV_U32 priority)
{
  MV_STATUS status;
  MV_U32    config;

  config =      ((mode & 0x0003) << 3) |
           ((alignment & 0x0003) << 1) |
             (priority & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CONFIGURATION, config, 0);

  return(status);
}
#endif /* PON_Z1 */

/*******************************************************************************
**
**  mvOnuEponMacTxmLlidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX LLID
**
**  PARAMETERS:  MV_U32 llid
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmLlidSet(MV_U32 llid, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_TX_LLID, llid, macId);

  return(status);
}
#ifdef PON_Z2
/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report configuration
**
**  PARAMETERS:  MV_U32 config
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportConfig(MV_U32 queueReportQ2, MV_U32 reportBitmapQ2,
                                         MV_U32 queueReport, MV_U32 queueSet,
                                         MV_U32 reportBitmap, MV_U32 macId)
{
  MV_STATUS status;
  MV_U32    config;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  config = ((queueReportQ2 & 0x00FF) << 18) |
          ((reportBitmapQ2 & 0x0001) << 16) |
             ((queueReport & 0x00FF) << 2)  |
                ((queueSet & 0x0003) << 1)  |
             (reportBitmap & 0x0001);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_CONFIG, config, macId);

  return(status);
}
#endif /* PON_Z2 */
#ifdef PON_Z1
/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report configuration
**
**  PARAMETERS:  MV_U32 config
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportConfig(MV_U32 config, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_CONFIG, config, macId);

  return(status);
}
#endif /* PON_Z1 */
/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportBitMap
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report Bit Map
**
**  PARAMETERS:  MV_U32 bitMap
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportBitMap(MV_U32 bitMap, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, bitMap, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportBitMapGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report Bit Map
**
**  PARAMETERS:  MV_U32 bitMap
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportBitMapGet(MV_U32 *bitMap, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, bitMap, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueueSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report Queue Set
**
**  PARAMETERS:  MV_U32 queueSet
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueueSet(MV_U32 queueSet, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_SET, queueSet, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueueSetGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue Set
**
**  PARAMETERS:  MV_U32 *queueSet
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueueSetGet(MV_U32 *queueSet, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_SET, queueSet, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue0
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue0(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue1
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue1(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue2
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue2(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue3
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue3(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue4
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue4(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue5
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue5(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue6
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue6(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueue7
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueue7(MV_U32 queue, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, queue, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportQueueX
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue 0 - 7
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportQueueX(MV_U32 queueNum, MV_U32 queueCfg, MV_U32 macId)
{
  MV_STATUS status = MV_OK;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  if      (queueNum == 0) {status |= mvOnuEponMacTxmCppReportQueue0(queueCfg, macId); }
  else if (queueNum == 1) {status |= mvOnuEponMacTxmCppReportQueue1(queueCfg, macId); }
  else if (queueNum == 2) {status |= mvOnuEponMacTxmCppReportQueue2(queueCfg, macId); }
  else if (queueNum == 3) {status |= mvOnuEponMacTxmCppReportQueue3(queueCfg, macId); }
  else if (queueNum == 4) {status |= mvOnuEponMacTxmCppReportQueue4(queueCfg, macId); }
  else if (queueNum == 5) {status |= mvOnuEponMacTxmCppReportQueue5(queueCfg, macId); }
  else if (queueNum == 6) {status |= mvOnuEponMacTxmCppReportQueue6(queueCfg, macId); }
  else if (queueNum == 7) {status |= mvOnuEponMacTxmCppReportQueue7(queueCfg, macId); }

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportUpdate
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return TX CPP Report Queue
**
**  PARAMETERS:  MV_U32 queue
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportUpdate(MV_U32 validQueueReport, MV_U32 highestReportQueue, MV_U32 macId)
{
  MV_STATUS status;
  MV_U32    queueNum;

  if (macId >= EPON_MAX_MAC_NUM)
	return (MV_ERROR);

  status  = mvOnuEponMacTxmCppReportConfig(0xFF,   /* Queueset2 not supported - set to 0xFF (queueReportQ2) */
    					   0x1,    /* Queueset2 not supported - set to 0x1, Software (reportBitmapQ2) */
    					   ~(validQueueReport & 0xFF),    /* Queueset1 supported - set to 0, means all 8 queues are active (queueReport) */
    					   0x1,    /* Number of queueSet - support for 1 queueset */
    					   0x1,    /* Queueset1 supported - set to 0x1, Software (reportBitmap) */
    					   macId);
  status |= mvOnuEponMacTxmCppReportBitMap(validQueueReport & 0xFF, macId); /* Queueset1 - 8 queues enabled(0xFF) , Queueset1 - 8 queues disabled(0x00) */
  status |= mvOnuEponMacTxmCppReportQueueSet(0x1, macId);  /* Number of queuesets - support for 1 queueset */

  for (queueNum = 0; queueNum < ONU_DBA_MAX_QUEUE; queueNum++)
  {
    if (validQueueReport & (1 << queueNum))
    {
      if (queueNum == highestReportQueue) {status |= mvOnuEponMacTxmCppReportQueueX(queueNum, 0x000053ff, macId); }
      else                                {status |= mvOnuEponMacTxmCppReportQueueX(queueNum, 0x000003ff, macId); }
    }
    else
    {
      status |= mvOnuEponMacTxmCppReportQueueX(queueNum, 0x0, macId);
    }
  }

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxmCppReportFecConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set TX CPP Report FEC config
**
**  PARAMETERS:  MV_U32 fecConst1
**               MV_U32 fecConst2
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxmCppReportFecConfig(MV_U32 fecConst1, MV_U32 fecConst2)
{
  MV_STATUS status;
  MV_U32    config;

  config = ((fecConst2 & 0x00FF) << 16) |
            (fecConst1 & 0xFFFF);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_TXM_CPP_RPRT_FEC_CONFIG, config, 0);

  return(status);
}

/* ========================================================================== */
/*                        PCS Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacPcsConfigSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set PCS configuration
**
**  PARAMETERS:  MV_U32 config
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsConfigSet(MV_U32 config)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_CONFIGURATION, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsConfigGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get PCS configuration
**
**  PARAMETERS:  None
**
**  OUTPUTS:     MV_U32 config
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsConfigGet(MV_U32 *config)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_PCS_CONFIGURATION, config, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set PCS delay
**
**  PARAMETERS:  MV_U32 delay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsDelaySet(MV_U32 delay)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_PCS_DELAY_CONFIG, delay, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsStatsGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get PCS stats (0,1,2,3,4)
**
**  PARAMETERS:
**		MV_U32 *legalFrameCnt,
**		MV_U32 *maxFrameSizeErrCnt,
**		MV_U32 *parityLenErrCnt,
**		MV_U32 *longGateErrCnt,
**		MV_U32 *protocolErrCnt,
**		MV_U32 *minFrameSizeErrCnt,
**		MV_U32 *legalFecFrameCnt,
**		MV_U32 *legalNonFecFrameCnt
**  OUTPUTS:
**		Counter values assigned to input parameters
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsStatsGet(MV_U32 *legalFrameCnt,
				MV_U32 *maxFrameSizeErrCnt,
				MV_U32 *parityLenErrCnt,
				MV_U32 *longGateErrCnt,
				MV_U32 *protocolErrCnt,
				MV_U32 *minFrameSizeErrCnt,
				MV_U32 *legalFecFrameCnt,
				MV_U32 *legalNonFecFrameCnt)
{
	MV_U32			regVal;
  MV_STATUS status;

	if ((legalFrameCnt == 0) || (maxFrameSizeErrCnt == 0) ||
		(parityLenErrCnt == 0) || (longGateErrCnt == 0) ||
		(protocolErrCnt == 0) || (minFrameSizeErrCnt == 0) ||
		(legalFecFrameCnt == 0) || (legalNonFecFrameCnt == 0))
		return(MV_BAD_PARAM);

	status = asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_0, &regVal, 0);
	*legalFrameCnt = regVal;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_1, &regVal, 0);
	*maxFrameSizeErrCnt = (regVal >> 16) & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_1, &regVal, 0);
	*parityLenErrCnt = regVal & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_2, &regVal, 0);
	*longGateErrCnt = (regVal >> 16) & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_2, &regVal, 0);
	*protocolErrCnt = regVal & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_3, &regVal, 0);
	*minFrameSizeErrCnt = regVal & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_4, &regVal, 0);
	*legalFecFrameCnt = (regVal >> 16) & 0xFFFF;

	status |= asicOntGlbRegRead(mvAsicReg_EPON_PCS_STATS_4, &regVal, 0);
	*legalNonFecFrameCnt = regVal & 0xFFFF;

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacPcsFrameSizeLimitsSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set PCS frame size  limits
**
**  PARAMETERS:  MV_U32 size      - maximum frame size
**               MV_U32 latency   - FEC decoder latency
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsFrameSizeLimitsSet(MV_U32 size, MV_U32 latency)
{
	MV_U32    reg_val;

	reg_val  = size & 0xFFF;
	reg_val |= (latency & 0x1FFF) << 16;

	return(asicOntGlbRegWrite(mvAsicReg_EPON_PCS_FRAME_SZ_LIMITS, reg_val, 0));
}

/*******************************************************************************
**
**  mvOnuEponMacPcsFrameSizeLimitsGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get PCS frime size limits
**
**  PARAMETERS:  None
**
**  OUTPUTS:     MV_U32 *size      - maximum framce size
**               MV_U32 *latency   - FEC decoder latency
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacPcsFrameSizeLimitsGet(MV_U32 *size, MV_U32 *latency)
{
	MV_STATUS status;
	MV_U32    reg_val;

	status = asicOntGlbRegRead(mvAsicReg_EPON_PCS_FRAME_SZ_LIMITS, &reg_val, 0);
	if (status == MV_OK) {
		*size = reg_val & 0xFFF;
		*latency = (reg_val >> 16) & 0x1FFF;
	}

	return(status);
}

/* ========================================================================== */
/*                        DDM Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacDdmDelaySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set DDM delay
**
**  PARAMETERS:  MV_U32 delay
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacDdmDelaySet(MV_U32 delay)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_DDM_DELAY_CONFIG, delay, 0);

  return(status);
}
#ifdef PON_Z2
/*******************************************************************************
**
**  mvOnuEponMacDdmTxPolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set DDM polarity
**
**  PARAMETERS:  MV_U32 txEnable
**               MV_U32 polarity
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacDdmTxPolaritySet(MV_U32 txEnable, MV_U32 polarity)
{
  MV_STATUS status;
  MV_U32    config;

  config = ((txEnable & 0x3) << 1)  |
            (polarity & 0x1);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_DDM_TX_POLARITY, config, 0);

  return(status);
}
#elif defined PON_Z1
/*******************************************************************************
**
**  mvOnuEponMacDdmTxPolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set DDM polarity
**
**  PARAMETERS:  MV_U32 polarity
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacDdmTxPolaritySet(MV_U32 polarity)
{
  MV_STATUS status;

  status = asicOntGlbRegWrite(mvAsicReg_EPON_DDM_TX_POLARITY, polarity, 0);

  return(status);
}
#else
/*******************************************************************************
**
**  mvOnuEponMacDdmTxPolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set DDM polarity
**
**  PARAMETERS:  MV_U32 txEnable       - mask TX enabled with TX allowed
**               MV_U32 txPolarity     - TX polarity (0 - active high)
**               MV_U32 serdesPolarity - SERDES shutdown polarity (0 - active low)
**               MV_U32 xvrPolarity    - XVR shutdown polarity (0 - active low)
**               MV_U32 burstEnabl     - burst enable mode
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacDdmTxPolaritySet(MV_U32 txEnable,
				       MV_U32 txPolarity,
				       MV_U32 serdesPolarity,
				       MV_U32 xvrPolarity,
				       MV_U32 burstEnable)
{
	MV_U32    config;

	config = ((burstEnable & 0x1)    << 5) |
		 ((xvrPolarity & 0x1)    << 4) |
		 ((serdesPolarity & 0x1) << 3) |
		 ((txEnable & 0x3)       << 1) |
		 (txPolarity & 0x1);

	return(asicOntGlbRegWrite(mvAsicReg_EPON_DDM_TX_POLARITY, config, 0));
}
#endif

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

/*******************************************************************************
**
**  mvOnuEponMacRxStatsFcsErrorGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received with FCS error counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsFcsErrorGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_FCS_ERROR_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsShortErrorGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received short packets error counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsShortErrorGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_SHORT_ERROR_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsLongErrorGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received long packets error counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsLongErrorGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_LONG_ERROR_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsDataFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received data frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsDataFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_DATA_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsCtrlFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received control frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsCtrlFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_CTRL_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsReportFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received report frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsReportFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_REPORT_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacRxStatsGateFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return received gate frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacRxStatsGateFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_RXP_GATE_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxStatsCtrlRegReqFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return transmitted REGISTER REQUEST frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxStatsCtrlRegReqFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_TXP_CTRL_REG_REQ_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxStatsCtrlRegAckFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return transmitted REGISTER ACK frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxStatsCtrlRegAckFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_TXP_CTRL_REG_ACK_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxStatsCtrlReportFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return transmitted report frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxStatsCtrlReportFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_TXP_CTRL_REPORT_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxStatsDataFrameGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return transmitted data frames counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxStatsDataFrameGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_TXP_DATA_FRAMES_CNT, counter, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacTxStatsTxAllowedByteCountGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return transmitted Tx Allowed byte counter
**
**  PARAMETERS:  MV_U32 *counter
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacTxStatsTxAllowedByteCountGet(MV_U32 *counter, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
	return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_STAT_TXP_TX_ALLOWED_BYTE_CNT, counter, macId);

  return(status);
}

/* ========================================================================== */
/*                        CPQ Functions Section                               */
/* ========================================================================== */

/*******************************************************************************
**
**  mvOnuEponMacCpqRxCtrlHeaderQueueUsedCountGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control header queue used count
**
**  PARAMETERS:  MV_U32 *usedCount
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxCtrlHeaderQueueUsedCountGet(MV_U32 *usedCount)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_CTRL_HQ_USED, usedCount, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxCtrlHeaderQueueReadData
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control header queue data
**
**  PARAMETERS:  MV_U32 *dataLow
**               MV_U32 *dataHigh
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxCtrlHeaderQueueReadData(MV_U32 *dataLow, MV_U32 *dataHigh)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_CTRL_HQ_READ_L, dataLow, 0);
  status |= asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_CTRL_HQ_READ_H, dataHigh, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxCtrlQueueUsedCountGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control queue used count
**
**  PARAMETERS:  MV_U32 *usedCount
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxCtrlQueueUsedCountGet(MV_U32 *usedCount)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_CTRL_Q_USED, usedCount, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxCtrlQueueReadData
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control queue data
**
**  PARAMETERS:  MV_U32 *data
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxCtrlQueueReadData(MV_U32 *data)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_CTRL_Q_READ, data, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxRprtHeaderQueueUsedCountGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return report header queue used count
**
**  PARAMETERS:  MV_U32 *usedCount
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxRprtHeaderQueueUsedCountGet(MV_U32 *usedCount)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_RPRT_HQ_USED, usedCount, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxRprtHeaderQueueReadData
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return report header queue data
**
**  PARAMETERS:  MV_U32 *dataLow
**               MV_U32 *dataHigh
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxRprtHeaderQueueReadData(MV_U32 *dataLow, MV_U32 *dataHigh)
{
  MV_STATUS status;

  status  = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_RPRT_HQ_READ_L, dataLow, 0);
  status |= asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_RPRT_HQ_READ_H, dataHigh, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxRprtQueueUsedCountGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return report queue used count
**
**  PARAMETERS:  MV_U32 *usedCount
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxRprtQueueUsedCountGet(MV_U32 *usedCount)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_RPRT_Q_USED, usedCount, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqRxRprtQueueReadData
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return report queue data
**
**  PARAMETERS:  MV_U32 *data
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqRxRprtQueueReadData(MV_U32 *data)
{
  MV_STATUS status;

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_RX_RPRT_Q_READ, data, 0);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqTxCtrlHeaderQueueFree
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control header queue free count
**
**  PARAMETERS:  MV_U32 *freeCount
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqTxCtrlHeaderQueueFree(MV_U32 *freeCount, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_TX_CTRL_HQ_FREE, freeCount, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqTxCtrlHeaderQueueWrite
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function write control header queue data
**
**  PARAMETERS:  MV_U32 data
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqTxCtrlHeaderQueueWrite(MV_U32 data, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_CPQ_TX_CTRL_HQ_WRITE, data, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqTxCtrlQueueFree
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return control queue free count
**
**  PARAMETERS:  MV_U32 *freeCount
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqTxCtrlQueueFree(MV_U32 *freeCount, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegRead(mvAsicReg_EPON_CPQ_TX_CTRL_Q_FREE, freeCount, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacCpqTxCtrlQueueWrite
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function write control queue data
**
**  PARAMETERS:  MV_U32 data
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacCpqTxCtrlQueueWrite(MV_U32 data, MV_U32 macId)
{
  MV_STATUS status;

  if (macId >= EPON_MAX_MAC_NUM)
    return(MV_ERROR);

  status = asicOntGlbRegWrite(mvAsicReg_EPON_CPQ_TX_CTRL_Q_WRITE, data, macId);

  return(status);
}

/*******************************************************************************
**
**  mvOnuEponMacSerdesPuRxWrite
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function write to serdes power up receiver 
**
**  PARAMETERS:  enable - 0: power down, 1:  power up
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS mvOnuEponMacSerdesPuRxWrite(MV_U32 enable)
{
    MV_STATUS status;

    status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_0_PU_RX, enable, 0);

    return(status);
}


/******************************************************************************/
/******************************************************************************/
/* ========================================================================== */
/* ========================================================================== */
/* ==                                                                      == */
/* ==           ==     ==   =========   =========   ==        ==           == */
/* ==           ==     ==   =========   =========   ===       ==           == */
/* ==           ==     ==   ==     ==   ==     ==   == ==     ==           == */
/* ==           ==     ==   ==     ==   ==     ==   ==  ==    ==           == */
/* ==           ==     ==   =========   ==     ==   ==   ==   ==           == */
/* ==           ==     ==   =========   ==     ==   ==    ==  ==           == */
/* ==           ==     ==   ==          ==     ==   ==     == ==           == */
/* ==           ==     ==   ==          ==     ==   ==      ====           == */
/* ==           =========   ==          =========   ==       ===           == */
/* ==           =========   ==          =========   ==        ==           == */
/* ==                                                                      == */
/* ========================================================================== */
/* ========================================================================== */
/******************************************************************************/
/******************************************************************************/
#ifndef PON_FPGA
/*******************************************************************************
**
**  mvOnuPonMacDgInterruptEn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure Dying Gasp interrupt
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuPonMacDgInterruptEn(MV_U32 dgPol)
{
  MV_STATUS status;

  status  = asicOntMiscRegWrite(mvAsicReg_PON_DG_CTRL_EN, 0x1, 0); /* Enable */
  if (status != MV_OK)
    return(status);

  status  = asicOntMiscRegWrite(mvAsicReg_PON_DG_CTRL_POLARITY, dgPol, 0); /* Active High/Low */
  if (status != MV_OK)
      return(status);

  status  = asicOntMiscRegWrite(mvAsicReg_PON_DG_THRESHOLD, 0x61A80, 0); /* Threshold */
  if (status != MV_OK)
      return(status);

  return(status);
}

/*******************************************************************************
**
**  mvOnuPonMacDgInterruptDis
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function disable Dying Gasp interrupt
**
**  PARAMETERS:  void
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuPonMacDgInterruptDis(void)
{
  MV_STATUS status;

  status  = asicOntMiscRegWrite(mvAsicReg_PON_DG_CTRL_EN, 0x0, 0); /* Disable */
  if (status != MV_OK)
    return(status);

  return(status);
}
#endif /* PON_FPGA */
