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

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

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

/* Global Variables
------------------------------------------------------------------------------*/
S_OnuGponApmTbl onuGponApmTbl_s;

/* Local Variables
------------------------------------------------------------------------------*/
MV_U16 l_onuGponPreviousAlarmState = ONU_GPON_ALARM_DEF_STATE;
MV_U16 l_onuGponCurrentAlarmState  = ONU_GPON_ALARM_DEF_STATE;
MV_U32 l_onuGponDsSyncFlag         = 1;

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

/* Local Functions
------------------------------------------------------------------------------*/
void onuGponAlarmProcess(void);

/******************************************************************************/
/* ========================================================================== */
/*                         Alarm Section                                      */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponAlarmTblInit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function init the onu gpon alarm table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponAlarmTblInit (void)
{
  /* set alarm Off as default for all alarms */
  memset(&(onuGponApmTbl_s.onuGponAlarmTbl_s.onuGponAlarmTbl[0]),
         ONU_GPON_ALARM_OFF,
         sizeof (S_OnuGponAlarmTbl));

  /* set alarms on as default only for LOS, LOF, and LCDG */
  onuGponApmTbl_s.onuGponAlarmTbl_s.onuGponAlarmTbl[ONU_GPON_ALARM_LOS]  = ONU_GPON_ALARM_ON;
  onuGponApmTbl_s.onuGponAlarmTbl_s.onuGponAlarmTbl[ONU_GPON_ALARM_LOF]  = ONU_GPON_ALARM_ON;
}

/*******************************************************************************
**
**  onuGponAlarmSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set onu gpon alarm
**
**  PARAMETERS:  E_OnuGponAlarmType  alarm
**               E_OnuGponAlarmState status
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**
*******************************************************************************/
MV_STATUS onuGponAlarmSet(E_OnuGponAlarmType  alarm,
                          E_OnuGponAlarmState state)
{
  if (alarm > ONU_GPON_ALARM_RDI)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_ALARM_MODULE,
               "ERROR: (%s:%d) invalid alarm(%d) type\n", __FILE_DESC__, __LINE__, alarm);
    return(MV_ERROR);
  }

  if (state > ONU_GPON_ALARM_ON)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_ALARM_MODULE,
               "ERROR: (%s:%d)  invalid alarm(%d) state(%d)\n", __FILE_DESC__, __LINE__, alarm, state);
    return(MV_ERROR);
  }

  onuGponApmTbl_s.onuGponAlarmTbl_s.onuGponAlarmTbl[alarm] = state;

  if (onuGponDbOnuStateGet() == ONU_GPON_06_POPUP)
	  return (MV_OK);

  if (state == ONU_GPON_ALARM_OFF)
  {
    l_onuGponCurrentAlarmState &= ~(1 << alarm);
  }
  else
  {
    l_onuGponCurrentAlarmState |= (1 << alarm);
  }

  onuGponAlarmProcess();

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponAlarmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu gpon alarm state
**
**  PARAMETERS:  E_OnuGponAlarmType alarm
**
**  OUTPUTS:     None
**
**  RETURNS:     onu gpon alarm state
**
*******************************************************************************/
E_OnuGponAlarmState onuGponAlarmGet(E_OnuGponAlarmType alarm)
{
  if (alarm > ONU_GPON_ALARM_RDI)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_ALARM_MODULE,
               "ERROR: (%s:%d) invalid alarm(%d) type\n", __FILE_DESC__, __LINE__, alarm);
    return(MV_ERROR);
  }

  return(onuGponApmTbl_s.onuGponAlarmTbl_s.onuGponAlarmTbl[alarm]);
}

/*******************************************************************************
**
**  onuGponAsicAlarmStatusGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return onu gpon alarm state, alarm is off if all
**               asic alarms (LOS, LOF, and LCDG) are off, else alarm is on
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     onu gpon alarm state
**
*******************************************************************************/
E_OnuGponAlarmState onuGponAsicAlarmStatusGet(void)
{
#if 0
  if ((onuGponAlarmGet(ONU_GPON_ALARM_LOS)  == ONU_GPON_ALARM_OFF) &&
      (onuGponAlarmGet(ONU_GPON_ALARM_LOF)  == ONU_GPON_ALARM_OFF) &&
      (onuGponAlarmGet(ONU_GPON_ALARM_LCDG) == ONU_GPON_ALARM_OFF))
#else
  if ((onuGponAlarmGet(ONU_GPON_ALARM_LOS) == ONU_GPON_ALARM_OFF) &&
      (onuGponAlarmGet(ONU_GPON_ALARM_LOF) == ONU_GPON_ALARM_OFF))
#endif
  {
    return(ONU_GPON_ALARM_OFF);
  }
  else
  {
    return(ONU_GPON_ALARM_ON);
  }
}

/*******************************************************************************
**
**  onuGponAlarmProcess
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function process the current alarm state and notify screen
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponAlarmProcess(void)
{
  MV_U32 onuGponPreviousAlarmState;
  MV_U32 onuGponCurrentAlarmState;
  MV_U32 onuGponChangeAlarm;
  LINKSTATUSFUNC linkStatusCallback;


  /* get the ASIC prvious alarm status */
  onuGponPreviousAlarmState = l_onuGponPreviousAlarmState;

  /* get the ASIC current alarm status */
  onuGponCurrentAlarmState = l_onuGponCurrentAlarmState;

  /* alarm changed */
  if ((onuGponCurrentAlarmState ^ onuGponPreviousAlarmState) != 0)
  {
    onuGponChangeAlarm = (onuGponCurrentAlarmState ^ onuGponPreviousAlarmState);

    if ((onuGponChangeAlarm & onuGponCurrentAlarmState) != 0)
    {
      if (onuGponChangeAlarm & ONU_GPON_ALARM_LOS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LOS On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LOS, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_LOF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LOF On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LOF, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_LCDG_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LCDG On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LCDG, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_TF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm TF On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_TF, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_SUF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm SUF On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_SUF, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_MEM_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm MEM On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_MEM, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_DACT_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm DACT On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_DACT, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_DIS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm DIS On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_DIS, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_MIS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm MIS On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_MIS, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_PEE_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm PEE On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_PEE, GPON_ONU_ALARM_STATUS_ON );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_RDI_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm RDI On ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_RDI, GPON_ONU_ALARM_STATUS_ON );
      }

      if ((onuGponAsicAlarmStatusGet() == ONU_GPON_ALARM_ON) &&
          l_onuGponDsSyncFlag == 0)
      {
#ifndef PON_FPGA
        /* Turn OFF LED */
        onuPonLedHandler(ONU_PON_SYNC_LED, ACTIVE_LED_OFF);
#endif /* PON_FPGA */

		mvPonPrint(PON_PRINT_INFO, PON_SM_MODULE, "=======================\n");
		mvPonPrint(PON_PRINT_INFO, PON_SM_MODULE, "== Upstream sync Off ==\n");
		mvPonPrint(PON_PRINT_INFO, PON_SM_MODULE, "=======================\n");

		/* Call link status callback function */
		linkStatusCallback = onuGponDbLinkStatusCallbackGet();
		if (linkStatusCallback != NULL)
		{
		  linkStatusCallback(MV_FALSE);
		}

 //       onuPonTxPowerOn(MV_FALSE);
		onuPonTxPowerTimerStateSet(MV_TRUE);
        onuGponSrvcStatusNotify(GPON_ONU_STATUS_DISCONNECTED);
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "=========================\n");
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "== Downstream sync Off ==\n");
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "=========================\n");
        l_onuGponDsSyncFlag = 1;
      }
    }
    else /* ((onuGponChangeAlarm & onuGponCurrentAlarmState) == 0) */
    {
      if (onuGponChangeAlarm & ONU_GPON_ALARM_LOS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LOS Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LOS, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_LOF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LOF Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LOF, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_LCDG_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm LCDG Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_LCDG, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_TF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm TF Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_TF, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_SUF_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm SUF Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_SUF, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_MEM_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm MEM Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_MEM, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_DACT_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm DACT Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_DACT, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_DIS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm DIS Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_DIS, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_MIS_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm MIS Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_MIS, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_PEE_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm PEE Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_PEE, GPON_ONU_ALARM_STATUS_OFF );
      }

      if (onuGponChangeAlarm & ONU_GPON_ALARM_RDI_LOC)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
                   "INFO: (%s:%d) === Alarm RDI Off ===\n", __FILE_DESC__, __LINE__);
        onuGponSrvcAlarmNotify( GPON_ONU_ALARM_RDI, GPON_ONU_ALARM_STATUS_OFF );
      }

      if ((onuGponAsicAlarmStatusGet() == ONU_GPON_ALARM_OFF) &&
          l_onuGponDsSyncFlag == 1)
      {
#ifndef PON_FPGA
        /* Turn LED ON */
        onuPonLedHandler(ONU_PON_SYNC_LED, ACTIVE_LED_BLINK_SLOW);
#endif /* PON_FPGA */
        onuGponSrvcStatusNotify(GPON_ONU_STATUS_NOT_RANGED);

        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "========================\n");
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "== Downstream sync On ==\n");
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "========================\n");
        l_onuGponDsSyncFlag = 0;

        onuPonTxPowerOn(MV_TRUE);
        mvOnuGponMacXvrActivate();
        onuGponDbOnuDsSyncOnSet(1);
      }
    }

    l_onuGponPreviousAlarmState = l_onuGponCurrentAlarmState;
  }
#ifdef  PON_ALARM_LED
  // PM: Generate PON alarm signal for Intelbras
  if((l_onuGponCurrentAlarmState & ONU_GPON_ALARM_LOS_LOC) == 0)
  {
	  onuPonLedHandler(ONU_PON_ALARM_LED, ACTIVE_LED_OFF);
  }
  else
  {
	  onuPonLedHandler(ONU_PON_ALARM_LED, ACTIVE_LED_ON);
  }
#endif
}

/*******************************************************************************
**
**  onuGponOnuAlarmShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print current alarm statsus
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponOnuAlarmShow(void)
{
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE,
          "ONU Gpon alarms state\n"
          "=====================\n");

  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm LOS  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_LOS_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm LOF  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_LOF_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm LCDG - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_LCDG_LOC) ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm TF   - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_TF_LOC)   ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm SUF  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_SUF_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm MEM  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_MEM_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm DACT - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_DACT_LOC) ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm DIS  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_DIS_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm MIS  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_MIS_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm PEE  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_PEE_LOC)  ? ("On") : ("Off"));
  mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, "Alarm RDI  - %s\n",
          (l_onuGponCurrentAlarmState & ONU_GPON_ALARM_RDI_LOC)  ? ("On") : ("Off"));
}

