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

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

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

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

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

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

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

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

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

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

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

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

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

/******************************************************************************
**  FILE        : ponOnuBoard.c                                              **
**                                                                           **
**  DESCRIPTION : This file implements ONU Board specific                    **
*******************************************************************************
*                                                                             *
*  MODIFICATION HISTORY:                                                      *
*                                                                             *
*   29Oct06  Oren Ben Hayun   created                                         *
* =========================================================================== *
******************************************************************************/

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

/* Local Constant
------------------------------------------------------------------------------*/

/* Global Variables
------------------------------------------------------------------------------*/
S_OnuP2PDb onuP2PDb_s;
t_ponXvrFuncPtr ponXvrFunc;

/* Global functions
------------------------------------------------------------------------------*/
MV_U32 prbsUserDefinedPattern[3] = {0xA5A5A5A5, /* [31:00] */
				    0xA5A5A5A5, /* [63:32] */
				    0xA5A5};    /* [79:64] */

/* Local Variables
------------------------------------------------------------------------------*/
extern spinlock_t onuPonIrqLock;

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

/* Local Functions
------------------------------------------------------------------------------*/
MV_STATUS onuPonPatternBurstEnable(bool on);

#ifndef PON_FPGA

MV_U32  time_interval_up   = 0;
MV_U32  time_interval_down = 0;
MV_BOOL transmit_up;

/*******************************************************************************
**
**  onuPonLedInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init led operation
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuPonLedInit(void)
{
	MV_STATUS status;
	MV_U32    gpioGroup, gpioMask;

	PON_GPIO_GET(BOARD_GPP_SYS_LED, gpioGroup, gpioMask);
	if (gpioMask != PON_GPIO_NOT_USED) {
		status = mvGppTypeSet(gpioGroup, gpioMask, 0/*output*/);
		if (status != MV_OK)
			return(status);
	}

	PON_GPIO_GET(BOARD_GPP_PON_LED, gpioGroup, gpioMask);
	if (gpioMask != PON_GPIO_NOT_USED) {
		status = mvGppTypeSet(gpioGroup, gpioMask, 0/*output*/);
		if (status != MV_OK)
			return(status);
	}

	status  = asicOntMiscRegWrite(mvAsicReg_PON_LED_BLINK_FREQ_A_ON, 0x30000000, 0);
	if (status != MV_OK)
		return(status);

	status  = asicOntMiscRegWrite(mvAsicReg_PON_LED_BLINK_FREQ_A_OFF, 0x30000000, 0);
	if (status != MV_OK)
		return(status);

	status  = asicOntMiscRegWrite(mvAsicReg_PON_LED_BLINK_FREQ_B_ON, 0x15000000, 0);
	if (status != MV_OK)
		return(status);

	status  = asicOntMiscRegWrite(mvAsicReg_PON_LED_BLINK_FREQ_B_OFF, 0x15000000, 0);

	return(status);
}

/*******************************************************************************
**
**  onuPonLedHandler
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handles led operation
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuPonLedHandler(MV_U32 led, MV_U32 action)
{
	MV_STATUS status;
	MV_U32    gpioGroup = 0;
	MV_U32    gpioMask = 0;

	if (led == ONU_PON_SYS_LED) {

		PON_GPIO_GET(BOARD_GPP_SYS_LED, gpioGroup, gpioMask);
		if (gpioMask != PON_GPIO_NOT_USED) {
			status = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
			if (status != MV_OK)
				return(status);
		}

	} else if (led == ONU_PON_SYNC_LED) {

		PON_GPIO_GET(BOARD_GPP_PON_LED, gpioGroup, gpioMask);
		if (gpioMask != PON_GPIO_NOT_USED) {
			switch (action) {
			case ACTIVE_LED_OFF:
				status  = mvGppValueSet(gpioGroup, gpioMask, ~gpioMask);
				if (status != MV_OK)
					return(status);
				break;

			case ACTIVE_LED_BLINK_SLOW:
				status  = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
				if (status != MV_OK)
					return(status);
				status  = mvGppBlinkEn(gpioGroup, gpioMask, gpioMask);
				if (status != MV_OK)
					return(status);
				status  = asicOntMiscRegWrite(mvAsicReg_PON_SYNC_LED_BLINK_FREQ, 0, 0);
				if (status != MV_OK)
					return(status);
				break;

			case ACTIVE_LED_BLINK_FAST:
				status  = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
				if (status != MV_OK)
					return(status);
				status  = mvGppBlinkEn(gpioGroup, gpioMask, gpioMask);
				if (status != MV_OK)
					return(status);
				status  = asicOntMiscRegWrite(mvAsicReg_PON_SYNC_LED_BLINK_FREQ, 1, 0);
				if (status != MV_OK)
					return(status);
				break;

			case ACTIVE_LED_ON:
				status  = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
				if (status != MV_OK)
					return(status);
				status  = mvGppBlinkEn(gpioGroup, gpioMask, ~gpioMask);
				if (status != MV_OK)
					return(status);
				break;
			}
		}
	}

	return(MV_OK);
}

/*******************************************************************************
**
**  onuPonDyingGaspProcess
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function process dying gasp function, kill VoIP
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonDyingGaspProcess(void)
{
	MV_STATUS status;
	MV_U32 boardType;

	/* GPON/EPON configuration of Dying Gasp */
	/* ===================================== */
	boardType = mvBoardIdGet();

	switch (boardType) {
	case RD_88F6510_SFU_ID:
	case RD_88F6560_GW_ID:
	case RD_88F6530_MDU_ID:
		status  = asicOntMiscRegWrite(mvAsicReg_PON_MPP_24, 0, 0); /* power down voip */
		break;
	default:
		status = MV_ERROR;
	}

	return(status);
}

/*******************************************************************************
**
**  onuPonDyingGaspExit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function forces system reset after dying gasp
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonDyingGaspExit(void)
{
	if (mvBoardIdGet() == DB_88F6535_BP_ID) {
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "\n\n\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "=========================================\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "======= Dying Gasp Detected =============\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "======= System Need To Reboot !!!!! =====\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "=========================================\n");
	}

	return(MV_OK);
}

/*******************************************************************************
**
**  mvOnuPonMacPrbsUserDefinedPatternSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init User defined PRBS pattern
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
void mvOnuPonMacPrbsUserDefinedPatternSet(MV_U32 *prbsUserPattern)
{
  prbsUserDefinedPattern[0] = prbsUserPattern[0];
  prbsUserDefinedPattern[1] = prbsUserPattern[1];
  prbsUserDefinedPattern[2] = prbsUserPattern[2];
}

/*******************************************************************************
**
**  mvOnuPonMacPrbsUserDefinedPatternGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return User defined PRBS pattern
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
void mvOnuPonMacPrbsUserDefinedPatternGet(MV_U32 *prbsUserPattern)
{
  prbsUserPattern[0] = prbsUserDefinedPattern[0];
  prbsUserPattern[1] = prbsUserDefinedPattern[1];
  prbsUserPattern[2] = prbsUserDefinedPattern[2];
}

/*******************************************************************************
**
**  mvOnuPonMacBurstEnableInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init Burst Enable MPP
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS mvOnuPonMacBurstEnableInit(void)
{
	MV_U32    gpioGroup, gpioMask;
	MV_STATUS status = MV_OK;

	if (MV_6601_DEV_ID == mvCtrlModelGet())
	{
	       /* PHY control register - output status set */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				  "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
		       return(MV_ERROR);
	       }

	       /* Set SW BEN control for MC tranciever */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_HW_SELECT, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			"ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl select\n\r");
		       return(MV_ERROR);
	       }

	       /* PHY control register - force disable */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_FORCE, 0, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			     "ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl not force\n\r");
		       return(MV_ERROR);
	       }
	}
	else
	{
		if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* KW2 ASIC Rev Z2 */
		/* =============== */
		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
		if (gpioMask == PON_GPIO_NOT_USED)
			return MV_ERROR;

		status = mvGppTypeSet(gpioGroup, gpioMask, ~gpioMask/* 0-output allow transsmit*/);

		if (status == MV_OK)
			status = mvGppValueSet(gpioGroup, gpioMask, ~gpioMask/*0-disable signal*/);
		else
			return(status);

		if (status == MV_OK)
			status = mvGppTypeSet(gpioGroup, gpioMask, gpioMask /* 0-input NOT allow transsmit*/);

		}
		else if (mvCtrlRevGet() == ONU_ASIC_REV_A0) {

		/* KW2 ASIC Rev A0 */
		/* =============== */
		/* PHY control register - output status set */
			status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
			if (status != MV_OK) {
				mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
					   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
				return(MV_ERROR);
			}

			/* PHY control register - force disable */
			status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_EN, 0, 0);
			if (status != MV_OK) {
				mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
					   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl not force\n\r");
				return(MV_ERROR);
			}
		}
	}

	return(status);
}

MV_STATUS EponXvrSDPolarityHighStatus(MV_U32 interruptStatus, MV_U32 statusMask)
{
    return ((interruptStatus & statusMask) ? MV_FALSE : MV_TRUE);
}

MV_STATUS EponXvrSDPolarityLowStatus(MV_U32 interruptStatus, MV_U32 statusMask)
{
    return ((~interruptStatus & statusMask) ? MV_FALSE : MV_TRUE);
}

MV_STATUS GponXvrSDPolarityHighStatus(MV_U32 interruptStatus, MV_U32 statusMask)
{
    return ((interruptStatus & statusMask) ? MV_TRUE : MV_FALSE);
}

MV_STATUS GponXvrSDPolarityLowStatus(MV_U32 interruptStatus, MV_U32 statusMask)
{
    return ((~interruptStatus & statusMask) ? MV_TRUE : MV_FALSE);
}

t_ponXvrFuncPtr funcEponXvrSDStatus(MV_U32 polarity)
{
    if (polarity == 0)
    {
        return EponXvrSDPolarityHighStatus;
    }
    else
    {
        return EponXvrSDPolarityLowStatus;
    }
}

t_ponXvrFuncPtr funcGponXvrSDStatus(MV_U32 polarity)
{
    if (polarity == 0)
    {
        return GponXvrSDPolarityHighStatus;
    }
    else
    {
        return GponXvrSDPolarityLowStatus;
    }
}

/*******************************************************************************
**
**  onuPonPatternBurstTransmit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function turn on or off actuacl burst transmission
**
**  PARAMETERS:  when on  == true  transmission is on
**               when off == false transmission is off
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstTransmit(MV_BOOL on)
{
	MV_STATUS status;
	MV_U32    gpioGroup, gpioMask;
	MV_U32    trans_value = 0;

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* ASIC Rev Z2 */
		/* =========== */
		PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
		if (gpioMask == PON_GPIO_NOT_USED)
			return(MV_ERROR);

		trans_value = (on == MV_TRUE ? ~gpioMask /*0*/: gpioMask /*1*/);

		status = mvGppTypeSet(gpioGroup, gpioMask, trans_value);
		if (status != MV_OK)
			return(MV_ERROR);

	} else if ((mvCtrlRevGet() == ONU_ASIC_REV_A0) || (MV_6601_DEV_ID == mvCtrlModelGet())) {

		/* ASIC Rev A0 and MC */
		/* ================== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
		if (status != MV_OK) {
			mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl enable - output\n\r");
			return(MV_ERROR);
		}
	}

	transmit_up = on;
	return(MV_OK);
}

/*******************************************************************************
**
**  onuPonPatternBurstEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION:
**
**  PARAMETERS:  bool on
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstEnable(bool on)
{
	MV_STATUS status;
	MV_U32    gpioGroup, gpioMask;
	MV_U32    trans_value = 0;
	MV_U32    polarity;

	if (MV_6601_DEV_ID == mvCtrlModelGet())
	{
	       /* PHY control register - force enable */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_FORCE, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
			     "ERROR: asicOntMiscRegWrite failed for PON phy SW ctrl force\n\r");
		       return(MV_ERROR);
	       }

	       /* PHY control register - force enable value - according to polarity */
	       status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_SW_VALUE, 1, 0);
	       if (status != MV_OK) {
		       mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
				  "ERROR: asicOntMiscRegWrite failed for PON phy ctrl SW force value %d\n\r",
				  trans_value);
		       return(MV_ERROR);
	       }

	}
	else
	{
		if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

			/* ASIC Rev Z2 */
			/* =========== */
			PON_GPIO_GET(BOARD_GPP_PON_XVR_TX, gpioGroup, gpioMask);
			if (gpioMask == PON_GPIO_NOT_USED)
				return MV_ERROR;

			trans_value = ((on == MV_TRUE) ? (gpioMask/*1*/) : (~gpioMask/*0*/));

			status = mvGppValueSet(gpioGroup, gpioMask, trans_value);
			if (status != MV_OK)
				return(MV_ERROR);
		}
		else if	(mvCtrlRevGet() == ONU_ASIC_REV_A0) {

			/* ASIC Rev A0 */
			/* =========== */
			/* PHY control register - force enable */
			status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_EN, 1, 0);
			if (status != MV_OK) {
				mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
					   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl force\n\r");
				return(MV_ERROR);
			}

			polarity = onuP2PDbXvrBurstEnablePolarityGet();

			/* XVR polarity */
			/* XVR polarity == 0, Active High, transmit 1 to the line  */
			/* XVR polarity == 1, Active Low, transmit 0 to the line  */

			/* P2P mode */
			/* Force Value == 0, transmit 0 to the line  */
			/* Force Value == 1, transmit 1 to the line  */

			/* Setting P2P should be reversed from XVR polarity */
			/* XVR polarity == 0, Active High, write 1 for Force Value */
			/* XVR polarity == 1, Active Low, write 0 for Force Value */

			/* PHY control register - force enable value - according to polarity */
			status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_FORCE_BEN_IO_VAL, polarity, 0);
			if (status != MV_OK) {
				mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
					   "ERROR: asicOntMiscRegWrite failed for PON phy ctrl force value %d\n\r",
					   trans_value);
				return(MV_ERROR);
				}
		}
	}

	transmit_up = on;
	return(MV_OK);
}

/*******************************************************************************
**
**  onuPonPatternBurstOn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function start TX transmissions of a selected pattern as periodic or static burst
**
**  PARAMETERS:
**      MV_U32 pattern      0x1     1T
**                          0x2     2T
**                          0x80    PRBS - 9
**                          0x82    PRBS - 15
**                          0x83    PRBS - 23
**     MV_BOOL isPeriodic   TX burst can be either static (in this case the following parameters has no effect)
**                          and this parameter is FALSE OR periodic in this case this parameters is TRUE
**     MV_U32 period        cycle time - the time in micro seconds between the start of on peak and the other
**                          (must be greater then the duration interval)
**     MV_U32 duration      peak time interval in micro seconds  (must be smaller then the duration interval)

**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstOn(MV_U32 pattern, MV_BOOL isPeriodic, MV_U32 period, MV_U32 duration)
{
	MV_STATUS  status;

	/*pattern validation*/
	if (!((pattern == ONU_PON_TX_PATTERN_TYPE_T1) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_T2) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_USER) ||
          (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_7) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_9) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_15) ||
	      (pattern == ONU_PON_TX_PATTERN_TYPE_PRBS_23))) {

		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, "Wrong pattern type value %d \n", pattern);
		return MV_BAD_VALUE;
	}

	if ((isPeriodic == MV_TRUE) && (duration >= period)) {
		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
			   "Period value %d MUST be greater then duration value %d \n", period, duration);
		return MV_BAD_VALUE;
	}

	/*in case of sequential call to onuPonPatternBurstOn*/
	/*stop timer operation and transmissions*/
	onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId));
	onuPonPatternBurstTransmit(MV_TRUE);
	onuPonPatternBurstEnable(MV_FALSE);
	time_interval_up     = 0;
	time_interval_down   = 0;

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

		/* ASIC Rev Z2 */
		/* =========== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_INPUT, 0);
		if (status != MV_OK)
			return(status);

	} else if ((mvCtrlRevGet() == ONU_ASIC_REV_A0) || (MV_6601_DEV_ID == mvCtrlModelGet())) {

		/* ASIC Rev A0 and MC */
		/* ================== */
		status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
		if (status != MV_OK)
			return(status);
	}

	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_EN_LOOP_TIMING, 0x0, 0);
	if (status != MV_OK)
		return(status);

	/*Set system in PHY mode, meaning disconnect the PON MAC*/
	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_OPEN_TX_DOOR_15, 0x1, 0);
	if (status != MV_OK)
		return(status);

	/*Set sedes power up in phy mode*/
	status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_POWER_PHY_MODE, 0xfd04,0);
	if (status != MV_OK)
		return(status);

	/*set select on pattern*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_SELECT, 0x7, 0);
	if (status != MV_OK)
		return(status);

    /*set pattern type*/
    if (pattern != ONU_PON_TX_PATTERN_TYPE_USER)
    {
       status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_DATA, pattern, 0);
       if (status != MV_OK)
         return(status);
    }
    else
    {
       /*
       **  0xF10A2E6C <- PHY Test Data[15:0];  [UserData[8:0], Type = 5}
       **  0xF10A2E68 <- PHY Test Data[31:16]; [UserData[23:9]}
       **  0xF10A2E64 <- PHY Test Data[47:32]; [UserData[39:24]}
       **  0xF10A2E60 <- PHY Test Data[63:48]; [UserData[55:40]}
       **  0xF10A2E5C <- PHY Test Data[79:64]; [UserData[71:56]}
       **  0xF10A2E58 <- PHY Test Data[96:80]; [UserData[79:72]}
       */
       status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_DATA,         (((prbsUserDefinedPattern[0] &  0xFF) << 8)   | (pattern & 0xFF)), 0);
       status |= asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_USER_DATA_01,  ((prbsUserDefinedPattern[0] >> 8)  & 0xFFFF), 0);
       status |= asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_USER_DATA_02, (((prbsUserDefinedPattern[0] >> 24) & 0xFF)   | ((prbsUserDefinedPattern[1] & 0xFF) << 8)), 0);
       status |= asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_USER_DATA_03,  ((prbsUserDefinedPattern[1] >> 8)  & 0xFFFF), 0);
       status |= asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_USER_DATA_04, (((prbsUserDefinedPattern[1] >> 24) & 0xFF)   | ((prbsUserDefinedPattern[2] & 0xFF) << 8)), 0);
       status |= asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_USER_DATA_05,  ((prbsUserDefinedPattern[2] >> 8)  & 0xFF), 0);
       if (status != MV_OK)
         return(status);
    }

	/*turn on selected pattern*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_ENABLED, 0x1, 0);
	if (status != MV_OK)
		return(status);


	onuPonPatternBurstEnable(MV_TRUE);
	if (isPeriodic == MV_TRUE) {
		/*periosic burst*/
		time_interval_up     = duration;
		time_interval_down   = (period - duration);
		transmit_up          = MV_TRUE;
		onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId),0,time_interval_up,1);

	}

	return(MV_OK);
}

/*******************************************************************************
**
**  onuPonPatternBurstOff
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Turn off  pattern burst and reconnect PON MAC
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonPatternBurstOff(void)
{
	MV_STATUS  status;

	onuPonPatternBurstTransmit(MV_TRUE);
	onuPonPatternBurstEnable(MV_FALSE);

	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_EN_LOOP_TIMING, 0x1, 0);
	if (status != MV_OK)
		return(status);

	/*Set system in MAC mode, meaning connect the PON MAC*/
	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_INTERNAL_OPEN_TX_DOOR_15, 0x0, 0);
	if (status != MV_OK)
		return(status);

	/*Set serdes power down in phy mode*/
	status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_POWER_PHY_MODE, 0x8d00,0);
	if (status != MV_OK)
		return(status);


	/* Set the output enable of the GP_BEN IO to Output */
	status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0);
	if (status != MV_OK)
		return(status);

	/*turn off selected pattern*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_ENABLED, 0x0, 0);
	if (status != MV_OK)
		return(status);

	/*stop tranmission */
	status = onuPonPatternBurstTransmit(MV_FALSE);
	if (status != MV_OK)
		return(status);
	/*stop timer operation*/
	onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId));

	time_interval_up     = 0;
	time_interval_down   = 0;

	return(MV_OK);
}

/*******************************************************************************
**
**  onuPonPatternBurstTimerHndl
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function is the timer callback when periodic burst is enabled
**
**  PARAMETERS:  when on  == true  transmission is on
**               when off == false transmission is off
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
void      onuPonPatternBurstTimerHndl(void)
{
	MV_U32  time_interval;
	MV_BOOL is_transmit_up;
	unsigned long flags;
	MV_STATUS status;

	spin_lock_irqsave(&onuPonIrqLock, flags);

	onuPonResourceTbl_s.onuPonPatternBurstTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE;

	time_interval  = (transmit_up == MV_TRUE ? time_interval_down : time_interval_up);
	is_transmit_up = (transmit_up == MV_TRUE ? MV_FALSE : MV_TRUE);

	if (onuPonResourceTbl_s.onuPonPatternBurstTimerId.onuPonTimerPeriodic == 0)
		onuPonResourceTbl_s.onuPonPatternBurstTimerId.onuPonTimerPeriodic = 1;

	onuPonPatternBurstTransmit(is_transmit_up);

	/*switch on/off selected pattern*/
	status = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_ENABLED, is_transmit_up, 0);
	if (status != MV_OK) {
		 mvPonPrint(PON_PRINT_ERROR, PON_ISR_MODULE,
					"ERROR: asicOntMiscRegWrite failed in PON pattern burst timer handler\n\r");
	 }

	onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonPatternBurstTimerId),0,time_interval,1);

	spin_unlock_irqrestore(&onuPonIrqLock, flags);
}

/*******************************************************************************
**
**  onuPonTxPowerTimerStateSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable / disable TX power off timer
**
**  PARAMETERS:  MV_BOOL mode - MV_TRUE  - start timer
**                              MV_FALSE - stop timer
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonTxPowerTimerStateSet(MV_BOOL mode)
{
  MV_STATUS rcode = MV_OK;

  if (mode == MV_TRUE)
  {
    onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonTxPwrTimerId));
  }
  else
  {
    onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonTxPwrTimerId));
  }

  return (rcode);
}

/*******************************************************************************
**
**  onuPonTxPowerOn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function turns ON/OFF TX tranciever power using MPP
**
**  PARAMETERS:  MV_BOOL txOn - MV_TRUE - turn TX XVR ON, othervise OFF
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonTxPowerOn(MV_BOOL txOn)
{
	MV_U32		gpioGroup, gpioMask;
	MV_U32		devId = mvCtrlModelGet();
	MV_STATUS	status = MV_OK;

	PON_GPIO_GET(BOARD_GPP_PON_XVR_TX_POWER, gpioGroup, gpioMask);
	if (gpioMask != PON_GPIO_NOT_USED) {
		if (txOn == MV_TRUE)
			status = mvGppValueSet(gpioGroup, gpioMask, gpioMask);
		else
			status = mvGppValueSet(gpioGroup, gpioMask, 0);
	} else if (devId == MV_6601_DEV_ID)
		status = MV_ERROR;

	return(status);
}

/*******************************************************************************
**
**  onuPonTxPowerControlInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function initialyzes TX power control pins
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonTxPowerControlInit(void)
{
	MV_U32		gpioPinNum, gpioGroup, gpioMask;
	MV_U32		regVal, mppGroup;
	MV_GPP_HAL_DATA	halData;
	MV_U32		devId = mvCtrlModelGet();
	MV_STATUS	status = MV_OK;

	gpioPinNum = mvBoarGpioPinNumGet(BOARD_GPP_PON_XVR_TX_POWER, 0);
	if (gpioPinNum != MV_ERROR) {
		mppGroup = mvCtrlMppRegGet(gpioPinNum / 8);
		/* Set TX power MPP to GPP mode */
		regVal = MV_REG_READ(mppGroup);
		regVal &= ~(0xf << ((gpioPinNum % 8) * 4));
		MV_REG_WRITE(mppGroup, regVal);

		halData.ctrlRev = mvCtrlRevGet();

		status = mvGppInit(&halData);
		if (status == MV_OK) {
			/* Set TX power GPP pin direction to OUT */
			gpioGroup = gpioPinNum / 32;
			gpioMask = 1 << gpioPinNum;
			status = mvGppTypeSet(gpioGroup, gpioMask, (MV_GPP_OUT & gpioMask));
		}

	} else if (devId == MV_6601_DEV_ID)
		status = MV_ERROR;

	return(status);
}

/*******************************************************************************
**
**  onuP2PDbXvrBurstEnablePolaritySet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function sets EPON XVR polarity register value in the database
**
**  PARAMETERS:  MV_U32 val
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuP2PDbXvrBurstEnablePolaritySet(MV_U32 val)
{
    onuP2PDb_s.onuP2PGenTbl_s.xvrBurstEnPolarity = val;

    return(MV_OK);
}

/*******************************************************************************
**
**  onuP2PDbXvrBurstEnablePolarityGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function returns EPON XVR polarity register value
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_U32 mode
**
*******************************************************************************/
MV_U32 onuP2PDbXvrBurstEnablePolarityGet(void)
{
    return onuP2PDb_s.onuP2PGenTbl_s.xvrBurstEnPolarity;
}

#endif /* PON_FPGA */
