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

/* Include Files
------------------------------------------------------------------------------*/
#include "gponOnuHeader.h"
#include "gponOnuGoogle.h"
#ifndef PON_FPGA
#include "mvSysPonConfig.h"
#endif /* PON_FPGA */

/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_pon/perf/gpon/gponOnuLnxKsUI.c"

/* Global Variables
------------------------------------------------------------------------------*/
extern MV_BOOL onuGponLogEnable;

/* Local Variables
------------------------------------------------------------------------------*/
MV_BOOL infoGponCntReadClearInd = MV_TRUE;
MV_U32  maxPloamsSend = 270;

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

/* Local Functions
------------------------------------------------------------------------------*/

/******************************************************************************/
/* ========================================================================== */
/*                            Info Commands                                   */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiInfoShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu information
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiInfoShow(char* buf)
{
  MV_U8   *stateText[] = {"",
                           "INITIAL",
                           "STANDBY",
                           "SERIAL NUMBER",
                           "RANGING",
                           "OPERATION",
                           "POPUP",
                           "EMERGENCY STOP"};
  MV_U8   *boolText[] = {"FALSE","TRUE"};
  MV_U8   serialNumber[8];
  MV_U8   password[10];
  MV_U32  onuId,onuState;
  MV_BOOL init,omcc,snMaskEnable,snMaskMatchMode;
  MV_U32  berInt, dummy,omccPort;
  MV_U32  guard,pre1Size;
  MV_U32  pre2Size,pre3RaSize,pre3OpSize,pre3Pat;
  MV_U32  dbDelimiter,asicDelimiter,sd,sf;
  MV_U32  intDelay,eqdDb,eqdAsic,fDelay;
  MV_U32  snMsg[3], idleMsg[3];
  MV_U8   *mchText[] = {"NO MATCH","MATCH "};
  MV_U16  ponIdTxOpticalLevel;
  MV_U8   ponIdTypeAbit;
  MV_U8   ponIdClassType;
  MV_U8   ponIdBytes[ONU_GPON_PON_ID_BYTES_LEN];
  int     off = 0;

                    onuGponDbSerialNumGet(serialNumber);
  onuState        = onuGponDbOnuStateGet();
  onuId           = onuGponDbOnuIdGet();
  init            = onuGponDbInitGet();
  omcc            = onuGponDbOmccValidGet();
  omccPort        = onuGponDbOmccPortGet();
  snMaskEnable    = onuGponDbSerialNumberMaskEnableGet();
  snMaskMatchMode = onuGponDbSerialNumberMaskMatchGet();
                    onuGponDbPasswordGet(password);
  guard           = onuGponDbGuardBitsGet();
  berInt          = onuGponDbBerIntervalGet();
                    onuGponDbPreambleGet(ONU_GPON_PREM_TYPE_01,&dummy,&pre1Size);
                    onuGponDbPreambleGet(ONU_GPON_PREM_TYPE_02,&dummy,&pre2Size);
                    onuGponDbPreambleGet(ONU_GPON_PREM_TYPE_03,&pre3Pat,&dummy);
  pre3OpSize      = onuGponDbExtPreambleOperGet();
  pre3RaSize      = onuGponDbExtPreambleSyncGet();
  sd              = onuGponDbSdThresholdGet();
  sf              = onuGponDbSfThresholdGet();
  intDelay        = onuGponDbConstDelayGet();
  eqdDb           = onuGponDbEqualizationDelayGet();
                    mvOnuGponMacRxEqualizationDelayGet(&eqdAsic);
                    mvOnuGponMacTxFinalDelayGet(&fDelay);
  dbDelimiter     = onuGponDbDelimiterGet(ONU_GPON_DELM_BYTE_01) |
                   (onuGponDbDelimiterGet(ONU_GPON_DELM_BYTE_02) << 8) |
                   (onuGponDbDelimiterGet(ONU_GPON_DELM_BYTE_03) << 16);
                    mvOnuGponMacTxDelimiterGet(&asicDelimiter,&dummy);
                    onuGponDbSnMsgGet(snMsg);
                    onuGponDbIdleMsgGet(idleMsg);

  // PON-ID Manufacturer info
  ponIdTypeAbit = onuGponDbPONIdTypeABitGet();
  ponIdClassType = onuGponDbPONIdClassTypeGet();
  onuGponDbPONIdBytesInfoGet(&(ponIdBytes[0]));
  ponIdTxOpticalLevel = onuGponDbPONIdOpticalLevelGet();


  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "ONT Full Information:\n");
  off += mvOsSPrintf(buf+off, "---------------------\n");
  off += mvOsSPrintf(buf+off, "SN[VENDOR ID]:                 %02X:%02X:%02X:%02X [%c%c%c%c]\n",
                     serialNumber[0],serialNumber[1],serialNumber[2],serialNumber[3],
                     serialNumber[0],serialNumber[1],serialNumber[2],serialNumber[3]);
  off += mvOsSPrintf(buf+off, "SN[Serial Number]:             %02X:%02X:%02X:%02X\n",
                     serialNumber[4],serialNumber[5],serialNumber[6],serialNumber[7]);
  off += mvOsSPrintf(buf+off, "ONU ID:                        %d\n", onuId);
  off += mvOsSPrintf(buf+off, "ONU STATE:                     %d [%s]\n", onuState, stateText[onuState]);
  off += mvOsSPrintf(buf+off, "INIT STATE:                    %s\n", boolText[init]);
  off += mvOsSPrintf(buf+off, "OMCC Valid:                    %s\n", boolText[omcc]);
  off += mvOsSPrintf(buf+off, "OMCC Port:                     %d\n", omccPort);
  off += mvOsSPrintf(buf+off, "Password:                      %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X\n",
                     password[0],password[1],password[2],password[3],password[4],
                     password[5],password[6],password[7],password[8],password[9]);
  off += mvOsSPrintf(buf+off, "BER Interval:                  %d\n", berInt);
  off += mvOsSPrintf(buf+off, "SD Threshold:                  %d\n", sd);
  off += mvOsSPrintf(buf+off, "SF Threshold:                  %d\n", sf);
  off += mvOsSPrintf(buf+off, "Guard Bits:                    %d\n", guard);
  off += mvOsSPrintf(buf+off, "Preamble Type1 Size:           %d\n", pre1Size);
  off += mvOsSPrintf(buf+off, "Preamble Type2 Size:           %d\n", pre2Size);
  off += mvOsSPrintf(buf+off, "Preamble Type3 Pattern:        0x%02X\n", pre3Pat);
  off += mvOsSPrintf(buf+off, "Preamble Type3 Range Size:     %d\n", pre3RaSize);
  off += mvOsSPrintf(buf+off, "Preamble Type3 Oper Size:      %d\n", pre3OpSize);
  off += mvOsSPrintf(buf+off, "Delimiter:                     0x%08X [0x%08X]\n", dbDelimiter, asicDelimiter);
  off += mvOsSPrintf(buf+off, "Internal Delay:                %d [0x%x]\n", intDelay, intDelay);
  off += mvOsSPrintf(buf+off, "Equalization Delay:            %d [0x%x] (HW:0x%x)\n", eqdDb, eqdDb, eqdAsic);
  off += mvOsSPrintf(buf+off, "Final Delay:                   %d\n", fDelay);
  off += mvOsSPrintf(buf+off, "Const Idle Ploam:              [0x%08X][0x%08X][0x%08X]\n", idleMsg[0],idleMsg[1],idleMsg[2]);
  off += mvOsSPrintf(buf+off, "Const Serial Number Ploam:     [0x%08X][0x%08X][0x%08X]\n", snMsg[0],snMsg[1],snMsg[2]);
  off += mvOsSPrintf(buf+off, "Serial Number Mask Enable:     %s\n", boolText[snMaskEnable]);
  off += mvOsSPrintf(buf+off, "Serial Number Mask Match Mode: %s\n", mchText [snMaskMatchMode]);
  off += mvOsSPrintf(buf+off, "Debug Mode:                    %s\n", boolText[onuGponPonMngDebugModeGet()]);
  off += mvOsSPrintf(buf+off, "Overhead Manual Mode:          %s\n", boolText[onuGponPonMngOverheadManualModeGet()]);

  off += mvOsSPrintf(buf+off, "ponIdTypeAbit:                 %d\n", ponIdTypeAbit);
  off += mvOsSPrintf(buf+off, "ponIdClassType:                %s (%d)\n", onuGponDbPONIdClassTypeStrGet(), ponIdClassType);
  off += mvOsSPrintf(buf+off, "ponIdTxOpticalLevel:           0x%02X\n", ponIdTxOpticalLevel);
  off += mvOsSPrintf(buf+off, "ponIdBytes:                    [0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x]\n",
                                                              ponIdBytes[0], ponIdBytes[1], ponIdBytes[2], ponIdBytes[3],
                                                              ponIdBytes[4], ponIdBytes[5], ponIdBytes[6]);

  return(off);
}

/*******************************************************************************
**
**  onuGponUiAlarmShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu alarms
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiAlarmShow(char* buf)
{
  MV_STATUS rcode;
  MV_U32    alarms;
  MV_U32    iAlarm;
  MV_U8     *alarmText[] = {"LOS ","LOF ","LCDA","LCDG"," SF "," SD "," TF ",
                            "SUF ","MEM ","DACT","DIS ","MIS ","PEE ","RDI "};
  MV_U8     *statusText[] = {"OFF","ON "};
  MV_U32    status;
  int       off = 0;

  rcode = onuGponApiAlarmsGet(&alarms);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get alarms status, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "------------------\n");
  off += mvOsSPrintf(buf+off, "|ONU ALARMS:     |\n");
  off += mvOsSPrintf(buf+off, "------------------\n");
  off += mvOsSPrintf(buf+off, "| ALARM | STATUS |\n");
  off += mvOsSPrintf(buf+off, "------------------\n");

  for (iAlarm = 0 ; iAlarm < ONU_GPON_MAX_ALARMS ; iAlarm++)
  {
    status = (alarms >> iAlarm) & 0x01;
    off += mvOsSPrintf(buf+off, " %s   | %s    |\n", alarmText[iAlarm], statusText[status]);
  }

  off += mvOsSPrintf(buf+off, "------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiFifoShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints US PLOAM statistics
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiFifoShow(char* buf)
{
  S_MacFifoCtrl*  fifo;
  int             auditEn, auditAc, fifoSup;
  int             msgSend, allocFifo, freeFifo, ploamSend;
  int             off = 0;

  mvOnuGponMacFifoGetInfo(&fifo, &fifoSup);
  mvOnuGponMacFifoGetStat(&msgSend, &allocFifo, &freeFifo, &ploamSend);
  mvOnuGponMacFifoAuditGetStat(&auditEn, &auditAc);

  if (fifoSup)
  {
    off += mvOsSPrintf(buf+off, "===========================\n");
    off += mvOsSPrintf(buf+off, "GPON SW FIFO\n");
    off += mvOsSPrintf(buf+off, "===========================\n");
    off += mvOsSPrintf(buf+off, "FIFO size               %d\n", GPON_SW_FIFO_SIZE);
    off += mvOsSPrintf(buf+off, "Write index             %d\n", fifo->fifoWriteIndex);
    off += mvOsSPrintf(buf+off, "Read index              %d\n", fifo->fifoReadIndex);
    off += mvOsSPrintf(buf+off, "Repeating cycle number  %d\n", fifo->fifoReparoundNum);
    off += mvOsSPrintf(buf+off, "===========================\n");
    off += mvOsSPrintf(buf+off, "FIFO Audit Enter cnt.   %d\n", auditEn);
    off += mvOsSPrintf(buf+off, "FIFO Audit Action cnt.  %d\n", auditAc);
  }

  off += mvOsSPrintf(buf+off, "===========================\n");
  off += mvOsSPrintf(buf+off, "US msg. send cnt.       %d\n", msgSend);

  if (fifoSup)
  {
    off += mvOsSPrintf(buf+off, "Add to SW FIFO cnt.     %d\n", allocFifo);
    off += mvOsSPrintf(buf+off, "Free SW FIFO cnt.       %d\n", freeFifo);
  }

  off += mvOsSPrintf(buf+off, "Add to HW FIFO cnt.     %d\n", ploamSend);
  off += mvOsSPrintf(buf+off, "===========================\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiFecStatus
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints DS FEC Statsus
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiFecStatus(char* buf)
{
  MV_U32 fecMode;
  int off = 0;

  onuGponApiFecStatusGet(&fecMode);

  off += mvOsSPrintf(buf+off, "GPON FEC Status - %s\n", (fecMode == 0) ? ("Off") : ("On"));

  return(off);
}

/*******************************************************************************
**
**  onuGponUiInfoHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print info help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiInfoHelpShow(char* buf)
{
  int off = 0;

  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " cat info      - dump onu information\n");
  off += mvOsSPrintf(buf+off, " cat alarm     - dump onu alarms\n");
  off += mvOsSPrintf(buf+off, " cat fecStatus - dump onu fec status\n");
  off += mvOsSPrintf(buf+off, " cat swfifo    - dump onu SW FIFO info\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");

  return(off);
}

/******************************************************************************/
/* ========================================================================== */
/*                            PM Commands                                     */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiCountersReadClearFlag
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu FEC counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuGponUiCountersReadClearFlag(MV_BOOL clear)
{
	infoGponCntReadClearInd = clear;
}

/*******************************************************************************
**
**  onuGponBwMapCountersEnDisFlag
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu FEC counters
**
**  PARAMETERS:  MV_BOOL enable
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponBwMapCountersEnDisFlag(MV_BOOL enable)
{
    return (onuGponApiPmRxBwMapPmDumpSet(enable));
}

/*******************************************************************************
**
**  onuGponUiFecCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu FEC counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiFecCountersShow(char* buf)
{
  MV_STATUS        rcode;
  S_GponIoctlFecPm counters;
  int              off = 0;

  MV_U8  *counterText[] = {"FEC received Bytes       ",
                           "FEC corrected Bytes      ",
                           "FEC corrected Bits       ",
                           "FEC received CodeWords   ",
                           "FEC uncorrected CodeWords"};

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

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "------------------\n");
  off += mvOsSPrintf(buf+off, "| FEC COUNTERS:   |\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| COUNTER                   |   VALUE      |\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[0],counters.receivedBytes);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[1],counters.correctedBytes);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[2],counters.correctedBits);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[3],counters.receivedCodeWords);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[4],counters.uncorrectedCodeWords);
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiRxPloamCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu Rx Ploam counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiRxPloamCountersShow(char* buf)
{
  MV_STATUS            rcode;
  S_GponIoctlPloamRxPm counters;
  S_GponIoctlPloamTxPm countDummy;
  MV_U32               MsgId;
  int                  off = 0;

  MV_U8 *counterText[] = {"Idle Ploam Counter                 ",
                          "CRC Error Ploam Counter            ",
                          "FIFO Overflaw Error Ploam Counter  ",
                          "received Broadcast Ploam Counter   ",
                          "Received Onu Id Ploam Counter      "};

  MV_U8 *msgIdCntText  =  {"Total PLOAM        "};
  MV_U8 *msgIdText[]   =  {"ERROR PLOAM        ",
                           "OVERHEAD           ",
                           "SN_MASK            ",
                           "ASSIGN_ONU_ID      ",
                           "RANGING_TIME       ",
                           "DACT_ONU_ID        ",
                           "DIS_SN             ",
                           "CONFIG_VP_VC       ",
                           "ENCRYPT_VPI_PORT_ID",
                           "REQ_PASSWORD       ",
                           "ASSIGN_ALLOC_ID    ",
                           "NO_MESSAGE         ",
                           "POPUP              ",
                           "REQ_KEY            ",
                           "CONFIG_PORT_ID     ",
                           "PHYSICAL_EQUIP_ERR ",
                           "CHANGE_POWER_LEVEL ",
                           "PST                ",
                           "BER_INTERVAL       ",
                           "KEY_SWITCH_TIME    ",
                           "EXT_BURST_LEN      "};

  rcode  = onuGponApiPmRxPloamPmGet(&counters, infoGponCntReadClearInd);
  rcode |= onuGponApiAdvancedPloamsCounterGet(&countDummy, &counters, infoGponCntReadClearInd);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get counters value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "-------------------------\n");
  off += mvOsSPrintf(buf+off, "|RX PLOAM COUNTERS:     |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| HW COUNTERS                          |    VALUE    |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[0],counters.rxIdlePloam);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[1],counters.rxCrcErrorPloam);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[2],counters.rxFifoOverErrorPloam);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[3],counters.rxBroadcastPloam);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[4],counters.rxOnuIdPloam);
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| SW COUNTERS          |    VALUE    |\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", msgIdCntText, counters.rxMsgTotalPloam);

  for (MsgId = 0; MsgId <= ONU_GPON_DS_MSG_LAST; MsgId++)
    off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", msgIdText[MsgId], counters.rxMsgIdPloam[MsgId]);

  off += mvOsSPrintf(buf+off, "--------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiTxPloamCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu Tx Ploam counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiTxPloamCountersShow(char* buf)
{
  MV_STATUS            rcode;
  S_GponIoctlPloamRxPm countDummy;
  S_GponIoctlPloamTxPm counters;
  MV_U32               MsgId;
  int                  off = 0;

  MV_U8 *msgIdText[] = {"Total Ploams Recived",
                        "SN_ONU              ",
                        "PASSWORD            ",
                        "DYING_GASP          ",
                        "NO_MESSAGE          ",
                        "ENCRYPT_KEY         ",
                        "PHYSICAL_EQUIP_ERR  ",
                        "PST                 ",
                        "REI                 ",
                        "ACK                 "};

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

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "-------------------------\n");
  off += mvOsSPrintf(buf+off, "|TX PLOAM COUNTERS:     |\n");
  off += mvOsSPrintf(buf+off, "-------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| COUNTER             |    VALUE    |\n");
  off += mvOsSPrintf(buf+off, "-------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s | %10d  |\n", msgIdText[0], counters.txMsgTotalPloam);
  off += mvOsSPrintf(buf+off, "-------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| TX Error            |    VALUE    |\n");
  off += mvOsSPrintf(buf+off, "-------------------------------------\n");

  for (MsgId=1;MsgId <= ONU_GPON_US_MSG_LAST; MsgId++)
  {
    off += mvOsSPrintf(buf+off, " %s | %10d  |\n", msgIdText[MsgId], counters.txErrMsgIdPloam[MsgId]);

  }

  off += mvOsSPrintf(buf+off, "-------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| TX Correct          |    VALUE    |\n");
  off += mvOsSPrintf(buf+off, "-------------------------------------\n");

  for (MsgId=1;MsgId <= ONU_GPON_US_MSG_LAST; MsgId++)
  {
    off += mvOsSPrintf(buf+off, " %s | %10d  |\n", msgIdText[MsgId], counters.txMsgIdPloam[MsgId]);
  }

  off += mvOsSPrintf(buf+off, "-------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiBwMapCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu bw map counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiBwMapCountersShow(char* buf)
{
  MV_STATUS          rcode;
  S_GponIoctlBwMapPm counters;
  int                off = 0;

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

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

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "----------------------\n");
  off += mvOsSPrintf(buf+off, "| BWMAP COUNTERS:    |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| COUNTER                         |   VALUE    |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s   | %10u |\n", counterText[0],counters.allocCrcErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u |\n", counterText[1],counters.allocCorrectableCrcErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u |\n", counterText[2],counters.allocUnCorrectableCrcErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u |\n", counterText[3],counters.allocCorrec);
  off += mvOsSPrintf(buf+off, " %s   | %10u |\n", counterText[4],counters.totalReceivedAllocBytes);
  off += mvOsSPrintf(buf+off, "------------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiStandardCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu standard counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiStandardCountersShow(char* buf)
{
  MV_STATUS         rcode;
  S_RxStandardApiPm counters;
  int               off = 0;

  MV_U8 *counterText[] = {"bip8 Error Counter     ",
                          "plend Counter          "};

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

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "-------------------------\n");
  off += mvOsSPrintf(buf+off, "|STANDARD COUNTERS:     |\n");
  off += mvOsSPrintf(buf+off, "-----------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| COUNTER                  |    VALUE   |\n");
  off += mvOsSPrintf(buf+off, "-----------------------------------------\n");
  off += mvOsSPrintf(buf+off, " %s   | %8u   |\n", counterText[0],counters.bip8);
  off += mvOsSPrintf(buf+off, " %s   | %8u   |\n",counterText[1],counters.plend);
  off += mvOsSPrintf(buf+off, "-----------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiGemCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu gem counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiGemCountersShow(char* buf)
{
  MV_STATUS          rcode;
  S_GponIoctlGemRxPm counters;
  int                off = 0;

  MV_U8 *counterText[] = {"Received Idle Gem Frames                       ",
                          "Received Valid Gem Frames                      ",
                          "Received Undefined Gem Frames                  ",
                          "Received Omci Frames                           ",
                          "Dropped Gem Frames                             ",
                          "Dropped Omci Frames                            ",
                          "Received Gem Frames With Uncorr Hec Error      ",
                          "Received Gem Frames With One Fixed Hec Error   ",
                          "Received Gem Frames With Two Fixed Hec Error   ",
                          "Received Valid Gem Frames Total Byte Count     ",
                          "Received Undefined Gem Frames Total Byte Count ",
                          "Gem Reassemble Memory Flush                    ",
                          "Gem Synch Lost                                 ",
                          "Received Eth Frames With Correct FCS           ",
                          "Received Eth Frames With FCS Error             ",
                          "Received Omci Frames With Correct CRC          ",
                          "Received Omci Frames With CRC Error            "};

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

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "----------------------\n");
  off += mvOsSPrintf(buf+off, "|GEM COUNTERS:       |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| COUNTER                                          |  VALUE      |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");

  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[0], counters.gemRxIdleGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[1], counters.gemRxValidGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[2], counters.gemRxUndefinedGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[3], counters.gemRxOmciFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[4], counters.gemRxDroppedGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[5], counters.gemRxDroppedOmciFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[6], counters.gemRxGemFramesWithUncorrHecErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[7], counters.gemRxGemFramesWithOneFixedHecErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[8], counters.gemRxGemFramesWithTwoFixedHecErr);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[9], counters.gemRxTotalByteCountOfReceivedValidGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[10],counters.gemRxTotalByteCountOfReceivedUndefinedGemFrames);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[11],counters.gemRxGemReassembleMemoryFlush);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[12],counters.gemRxGemSynchLost);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[13],counters.gemRxEthFramesWithCorrFcs);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[14],counters.gemRxEthFramesWithFcsError);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[15],counters.gemRxOmciFramesWithCorrCrc);
  off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[16],counters.gemRxOmciFramesWithCrcError);
  off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiTxCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu tx counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiTxCountersShow(char* buf)
{
	MV_STATUS          rcode;
	S_GponIoctlGemTxPm counters;
	MV_BOOL            exist;
	MV_U32             tcont;
	int                off = 0;

	MV_U8 *counterText[] = {"Transmitted Gem Pti Type-1 Frames              ",
							"Transmitted Gem Pti Type-0 Frames              ",
							"Transmitted Idle Gem Frames                    ",
							"Transmitted Eth Frames Via Tcont               ",
							"Transmitted Eth Bytes Via Tcont                ",
							"Transmitted Gem Frames Via Tcont               ",
							"Transmitted Idle Gem Frames Via Tcont          "};

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

	off += mvOsSPrintf(buf+off, "\n");
	off += mvOsSPrintf(buf+off, "----------------------\n");
	off += mvOsSPrintf(buf+off, "|TX COUNTERS:        |\n");
	off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");
	off += mvOsSPrintf(buf+off, "| COUNTER                                          |  VALUE      |\n");
	off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");
	off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[0],counters.gemTxGemPtiTypeOneFrames);
	off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[1],counters.gemTxGemPtiTypeZeroFrames);
	off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[2],counters.gemTxIdleGemFrames);

	for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++) {
		rcode = onuGponDbBwTcontExist(tcont, &exist);
		if ((rcode == MV_OK) && (exist != MV_FALSE)) {
			off += mvOsSPrintf(buf+off, "T-Cont [%d] Counters                                              |\n", tcont);
			off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");
			off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[3],counters.gemTxEthFramesViaTconti[tcont]);
			off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[4],counters.gemTxEthBytesViaTconti[tcont]);
			off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[5],counters.gemTxGemFramesViaTconti[tcont]);
			off += mvOsSPrintf(buf+off, " %s   | %10u  |\n", counterText[6],counters.gemTxIdleGemFramesViaTconti[tcont]);
		}
	}

	off += mvOsSPrintf(buf+off, "------------------------------------------------------------------\n");

	return(off);
}

/*******************************************************************************
**
**  onuGponUiRawCounters
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiRaw_1Counters(char* buf)
{
  MV_U32      suspected;
  MV_U32      decided;
  S_RxPloamPm inRxPloamCounters;
  S_RxBwMapPm inRxBwMapCounters;
  S_RxBip8Pm  inBip8Counter;
  S_RxPlendPm inPlendCounter;
  S_RxFecPm   inRxFecCounters;
  S_GemPm     gemCounters;
  int         off = 0;

  decided = onuGponPonMngrFifoErrCountersGet(&suspected);
  onuGponPmFecPmGet(&inRxFecCounters);
  onuGponPmRxBwMapPmGet(&inRxBwMapCounters);
  onuGponPmRxBip8PmGet(&inBip8Counter);
  onuGponPmRxPlendPmGet(&inPlendCounter);
  onuGponPmRxPloamPmGet(&inRxPloamCounters);
  onuGponPmGemPmGet(&gemCounters);

  off += mvOsSPrintf(buf+off, "ONT GPON Counters\n");
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "PLOAM FIFO SYNC ERROR SUSPECTED:                   %u\n", suspected);
  off += mvOsSPrintf(buf+off, "PLOAM FIFO SYNC ERROR DECIDED:                     %u\n", decided);
  off += mvOsSPrintf(buf+off, "This ONU ID PLOAMs:                                %u\n", inRxPloamCounters.receivedOnuIdPloamCounter);
  off += mvOsSPrintf(buf+off, "Broadcast PLOAMs:                                  %u\n", inRxPloamCounters.receivedBroadcastPloamCounter);
  off += mvOsSPrintf(buf+off, "Idles PLOAMs:                                      %u\n", inRxPloamCounters.idlePloamCounter);
  off += mvOsSPrintf(buf+off, "CRC Error PLOAMs:                                  %u\n", inRxPloamCounters.crcErrorPloamCounter);
  off += mvOsSPrintf(buf+off, "FIFO Full Dropped PLOAMs:                          %u\n", inRxPloamCounters.fifoOverErrorPloamCounter);
  off += mvOsSPrintf(buf+off, "BW Error Free Allocs:                              %u\n", inRxBwMapCounters.allocCorrec);
  off += mvOsSPrintf(buf+off, "BW Uncorrectable Allocs:                           %u\n", inRxBwMapCounters.allocUnCorrectableCrcErr);
  off += mvOsSPrintf(buf+off, "BW Bad CRC Allocs:                                 %u\n", inRxBwMapCounters.allocCrcErr);
  off += mvOsSPrintf(buf+off, "BW Error Free and Correctable Allocs:              %u\n", inRxBwMapCounters.allocCorrectableCrcErr);
  off += mvOsSPrintf(buf+off, "BW Total Allocation:                               %u\n", inRxBwMapCounters.totalReceivedAllocBytes);
  off += mvOsSPrintf(buf+off, "Bip8:                                              %u\n", inBip8Counter.bip8);
  off += mvOsSPrintf(buf+off, "Plend:                                             %u\n", inPlendCounter.plend);
  off += mvOsSPrintf(buf+off, "FEC correctedBits:                                 %u\n", inRxFecCounters.correctedBits);
  off += mvOsSPrintf(buf+off, "FEC correctedBytes:                                %u\n", inRxFecCounters.correctedBytes);
  off += mvOsSPrintf(buf+off, "FEC receivedBytes:                                 %u\n", inRxFecCounters.receivedBytes);
  off += mvOsSPrintf(buf+off, "FEC receivedCodeWords:                             %u\n", inRxFecCounters.receivedCodeWords);
  off += mvOsSPrintf(buf+off, "FEC uncorrectedCodeWords:                          %u\n", inRxFecCounters.uncorrectedCodeWords);
  off += mvOsSPrintf(buf+off, "GEM Received Idle Gem Frames                       %u\n", gemCounters.receivedIdleGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Received Valid Gem Frames                      %u\n", gemCounters.receivedValidGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Received Undefined Gem Frames                  %u\n", gemCounters.receivedUndefinedGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Received Omci Frames                           %u\n", gemCounters.receivedOmciFrames);
  off += mvOsSPrintf(buf+off, "GEM Dropped Gem Frames                             %u\n", gemCounters.droppedGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Dropped Omci Frames                            %u\n", gemCounters.droppedOmciFrames);
  off += mvOsSPrintf(buf+off, "GEM Received Gem Frames With Uncorr Hec Error      %u\n", gemCounters.receivedGemFramesWithUncorrHecErr);
  off += mvOsSPrintf(buf+off, "GEM Received Gem Frames With One Fixed Hec Error   %u\n", gemCounters.receivedGemFramesWithOneFixedHecErr);
  off += mvOsSPrintf(buf+off, "GEM Received Gem Frames With Two Fixed Hec Error   %u\n", gemCounters.receivedGemFramesWithTwoFixedHecErr);
  off += mvOsSPrintf(buf+off, "GEM Received Valid Gem Frames Total Byte Count     %u\n", gemCounters.totalByteCountOfReceivedValidGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Received Undefined Gem Frames Total Byte Count %u\n", gemCounters.totalByteCountOfReceivedUndefinedGemFrames);
  off += mvOsSPrintf(buf+off, "GEM Gem Reassemble Memory Flush                    %u\n", gemCounters.gemReassembleMemoryFlush);
  off += mvOsSPrintf(buf+off, "GEM Gem Synch Lost                                 %u\n", gemCounters.gemSynchLost);
  off += mvOsSPrintf(buf+off, "GEM Received Eth Frames With Correct FCS           %u\n", gemCounters.receivedEthFramesWithCorrFcs);
  off += mvOsSPrintf(buf+off, "GEM Received Eth Frames With FCS Error             %u\n", gemCounters.receivedEthFramesWithFcsError);
  off += mvOsSPrintf(buf+off, "GEM Received Omci Frames With Correct CRC          %u\n", gemCounters.receivedOmciFramesWithCorrCrc);
  off += mvOsSPrintf(buf+off, "GEM Received Omci Frames With CRC Error            %u\n", gemCounters.receivedOmciFramesWithCrcError);

  return(off);
}

int onuGponUiRaw_2Counters(char* buf)
{
  S_GponTxPm txCounters;
  MV_U32     tcont;
  int        off = 0;

  onuGponPmTxPmGet(&txCounters);

  off += mvOsSPrintf(buf+off, "ONT GPON Raw Counters\n");
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");

  off += mvOsSPrintf(buf+off, "Transmitted Gem Pti Type-1 Frames                  %u\n", txCounters.transmittedGemPtiTypeOneFrames);
  off += mvOsSPrintf(buf+off, "Transmitted Gem Pti Type-0 Frames                  %u\n", txCounters.transmittedGemPtiTypeZeroFrames);
  off += mvOsSPrintf(buf+off, "Transmitted Idle Gem Frames                        %u\n", txCounters.transmittedIdleGemFrames);
  off += mvOsSPrintf(buf+off, "Transmitted Tx Enable Count                        %u\n", txCounters.transmittedTxEnableCount);

  for (tcont = 0; tcont < ONU_GPON_MAX_NUM_OF_T_CONTS; tcont++)
  {
    off += mvOsSPrintf(buf+off, "T-Cont [%d] Counters                                      \n", tcont);
    off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");
    off += mvOsSPrintf(buf+off, "Transmitted Eth Frames Via Tcont                   %u\n", txCounters.transmittedEthFramesViaTconti[tcont]);
    off += mvOsSPrintf(buf+off, "Transmitted Eth Bytes Via Tcont                    %u\n", txCounters.transmittedEthBytesViaTconti[tcont]);
    off += mvOsSPrintf(buf+off, "Transmitted Gem Frames Via Tcont                   %u\n", txCounters.transmittedGemFramesViaTconti[tcont]);
    off += mvOsSPrintf(buf+off, "Transmitted Idle Gem Frames Via Tcont              %u\n", txCounters.transmittedIdleGemFramesViaTconti[tcont]);
  }

  return(off);
}

/*******************************************************************************
**
**  onuGponUiPmHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print pm help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiPmHelpShow(char* buf)
{
  int off = 0;

  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Configuration Commands[DEC]\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " echo [state] > cntRdClrFlState  - onu counters flag, Read[0], Read Clear[1]\n");
  off += mvOsSPrintf(buf+off, " echo [state] > bwMapCntByState  - dump bw map counters before changing ONU state\n");
  off += mvOsSPrintf(buf+off, "                                   Disable[0], Enable[1]                    \n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " cat rxPloamCnt               - dump Rx PLOAM counters\n");
  off += mvOsSPrintf(buf+off, " cat txPloamCnt               - dump Tx PLOAM counters\n");
  off += mvOsSPrintf(buf+off, " cat bwMapCnt                 - dump bw map counters\n");
  off += mvOsSPrintf(buf+off, " cat stdCnt                   - dump standard counters\n");
  off += mvOsSPrintf(buf+off, " cat fecCnt                   - dump fec counters\n");
  off += mvOsSPrintf(buf+off, " cat gemCnt                   - dump gem counters\n");
  off += mvOsSPrintf(buf+off, " cat txCnt                    - dump Tx counters\n");
  off += mvOsSPrintf(buf+off, " cat rawCnt_1                 - dump raw counters\n");
  off += mvOsSPrintf(buf+off, " cat rawCnt_2                 - dump raw counters\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");

  return(off);
}

/******************************************************************************/
/* ========================================================================== */
/*                            Data Commands                                   */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiTcontConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu tcont <--> alloc
**
**  PARAMETERS:  MV_U32 alloc
**               MV_U32 tcont
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiTcontConfig(MV_U32 alloc, MV_U32 tcont)
{
  MV_STATUS rcode;

  rcode = onuGponApiTcontConfig(alloc, tcont);
  if (rcode != MV_OK)
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "ONU Allocation Id(%d) to T-CONT(%d) Config - FAIL\n", alloc, tcont);
}

/*******************************************************************************
**
**  onuGponUiClearTcontConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clear onu tcont
**
**  PARAMETERS:  MV_U32 tcont
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiClearTcontConfig(MV_U32 tcont)
{
  MV_STATUS rcode;

  rcode = onuGponApiTcontClear(tcont);
  if (rcode != MV_OK)
   mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "ONU T-CONT(%d) Clear - FAIL\n", tcont);
}

/*******************************************************************************
**
**  onuGponUiResetTcontsConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reset onu bw map table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiResetTcontsConfig(void)
{
  onuGponApiTcontsReset();
}

/*******************************************************************************
**
**  onuGponUiDebugTcont
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu tcont
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiDebugTcont(char* buf)
{
	MV_U32  allocId;
	MV_U32  idleAllocId;
	MV_U32  validCount = 0;
	MV_BOOL valid;
	MV_BOOL exist;
	MV_U32  i;
	MV_U8   *boolText[2] = {"NO ","YES"};
	MV_U32  fAllocId;
	MV_BOOL fEna;
	MV_U32  fTcont;
	MV_U32  knowTcont;
	MV_U8   *knowTcontText[] = {"T-CONT 0  ","T-CONT 1  ","T-CONT 2  ",
		"T-CONT 3  ","T-CONT 4  ","T-CONT 5  ",
		"T-CONT 6  ","T-CONT 7  ","T-CONT 8  ",
		"T-Def     ","T-Idle    "};
	int      off = 0;
	MV_STATUS status;

	off += mvOsSPrintf(buf+off, "\n");
	off += mvOsSPrintf(buf+off, "-------------------------------------\n");
	off += mvOsSPrintf(buf+off, "| Alloc Id Table                    |\n");
	off += mvOsSPrintf(buf+off, "-------------------------------------\n");
	off += mvOsSPrintf(buf+off, "| Assigned             ||   Idle    |\n");
	off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");
	off += mvOsSPrintf(buf+off, "| ALLOC-ID | Valid     ||           |\n");
	off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");

	for (i = 0 ; i < ONU_GPON_MAX_NUM_OF_T_CONTS; i++) {
		onuGponDbBwAllocGet(i, &allocId, &valid);
		onuGponDbBwIdleAllocGet(i, &idleAllocId);
		if (idleAllocId != PON_ONU_ALLOC_NOT_EXIST) {
			off += mvOsSPrintf(buf+off, "|   %04d   |  %3s      ||   %04d    |\n",
							   allocId, boolText[valid], idleAllocId);
		} else {
			off += mvOsSPrintf(buf+off, "|   %04d   |  %3s      ||   ====    |\n",
							   allocId, boolText[valid]);
		}
	}

	off += mvOsSPrintf(buf+off, "-------------------------------------\n");
	off += mvOsSPrintf(buf+off, "-------------------------------------\n");
	off += mvOsSPrintf(buf+off, "| Alloc Id to T-CONT Connect  Table |\n");
	off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");
	off += mvOsSPrintf(buf+off, "| T-CONT | Exist | ALLOC-ID | Valid |\n");
	off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");

	for (i = 0 ; i < ONU_GPON_MAX_NUM_OF_T_CONTS; i++) {
		onuGponDbBwTcontGet(i, &exist, &allocId, &valid);
		off += mvOsSPrintf(buf+off, "|   %02d   |  %s  |   %04d   |  %s  |\n", i, boolText[exist], allocId, boolText[valid]);
		if (valid != MV_FALSE) validCount++;
	}

	off += mvOsSPrintf(buf+off, "-------------------------------------\n");
	off += mvOsSPrintf(buf+off, "----------------------------------------------------\n");
	off += mvOsSPrintf(buf+off, "| BW MAC - SoC Table                |              |\n");
	off += mvOsSPrintf(buf+off, "|-----------------------------------|              |\n");
	off += mvOsSPrintf(buf+off, "| Index | ALLOC-ID | T-CONT | Valid | KNOWN T-CONT |\n");
	off += mvOsSPrintf(buf+off, "|--------------------------------------------------|\n");

	for (i = 0 ; i < ONU_GPON_MAX_NUM_OF_T_CONTS ; i++) {
		status = mvOnuGponMacRxBwMapGet(i, &fAllocId, &fEna, &fTcont);
		if (status != MV_OK)
			off += mvOsSPrintf(buf+off, "Error calling mvOnuGponMacRxBwMapGet, Tcont(%d)\n", i);

		if (fTcont == PON_ONU_DEFAULT_ALLOC_TCONT)
			knowTcont = 9;
		else {
			if ((fTcont == onuGponIdleAllocIdTcontGet()) && (validCount < 8))
				knowTcont = 10;
			else
				knowTcont = fTcont;
		}

		off += mvOsSPrintf(buf+off, "|  %02d   |   %04d   |   %02d   |  %s  |  %s  |\n",
						   i,fAllocId, fTcont, boolText[fEna],knowTcontText[knowTcont]);
	}

	off += mvOsSPrintf(buf+off, "----------------------------------------------------\n");

	return(off);
}

/*******************************************************************************
**
**  onuGponUiDebugGemPortidValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable gem port Id valid configuration
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugGemPortidValidSet(MV_U32 portId, MV_U32 enable)
{
  if (enable != 0) onuGponApiGemPortIdConfig(portId);
  else             onuGponApiGemPortIdClear(portId);
}

/*******************************************************************************
**
**  onuGponUiDebugGemPortidValidSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enable gem port Id valid configuration
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugAllGemPortidValidSet(MV_U32 enable)
{
  MV_U32  portId;

  if (enable != 0) {
        for (portId = 0; portId < 4096; portId++)
             onuGponApiGemPortIdConfig(portId);
  } else {
        for (portId = 0; portId < 4096; portId++)
             onuGponApiGemPortIdClear(portId);
  }
}

/*******************************************************************************
**
**  onuGponUiDebugGemPmSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function start or stop Gem PM.
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugGemPmSet(MV_U32 portId, MV_U32 enable)
{
  S_GponIoctlGemPortPmConfig gemPm;

  gemPm.gem_port = portId;

  if(enable !=0)
    gemPm.command = GEMPORTPMCMD_START;
  else
    gemPm.command = GEMPORTPMCMD_STOP;

  onuGponApiGemPortPmConfig(&gemPm);
}

/*******************************************************************************
**
**  onuGponUiDebugGemPmReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function resets GEM PM MIB counters
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugGemPmReset(void)
{
    onuGponApiGemPortPmReset();
}

/*******************************************************************************
**
**  onuGponUiDebugGemPmListShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints Gem PM ports enabled to collect MIB counters
**
**  PARAMETERS:  MV_U32 portId
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
int onuGponUiDebugGemPmListShow(char* buf)
{
    S_apiGemPortPmConfig    gemPortCfg;
    int                     off = 0;
    MV_U16                  dbIdx;
    MV_STATUS               rc;

    off += mvOsSPrintf(buf+off, "GEM port ids list\n");
    off += mvOsSPrintf(buf+off, "=================\n");
    off += mvOsSPrintf(buf+off, " Counter    GEM  \n");
    off += mvOsSPrintf(buf+off, "   set      port \n");
    off += mvOsSPrintf(buf+off, "=================\n");

    for (dbIdx = 0; dbIdx < MAX_SUPPORTED_GEMPORTS_FOR_PM; dbIdx++)
    {
        rc = onuGponPmGemPortPmConfigGet(dbIdx, &gemPortCfg);
        if (rc == MV_OK)
        {
            off += mvOsSPrintf(buf+off, "    %d       %d\n", dbIdx, gemPortCfg.gem_port);
        }
    }

    off += mvOsSPrintf(buf+off, "=================\n");
    return(off);
}

/*******************************************************************************
**
**  onuGponUiDebugGemPmGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints Gem PM counters
**
**  PARAMETERS:  MV_U32 portId
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugGemPmGet(MV_U32 portId)
{
  S_GponIoctlGemPortMibCounters mibCounters;
  MV_STATUS                     rcode;

  MV_U8 *counterText[] = {"Received Eth broadcast Frames                  ",
                          "Received Eth multicast Frames                  ",
                          "Received Eth good Frames                       ",
                          "Received Eth good Frames length 65-127         "};

  memset(&mibCounters, 0, sizeof(S_GponIoctlGemPortMibCounters));

  mibCounters.gem_port = portId;
  rcode = onuGponApiGemPortPmGet(&mibCounters);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get mibCounters value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  mvOsPrintf("\n");
  mvOsPrintf("------------------------------------------------------------------\n");
  mvOsPrintf("|MIB COUNTERS for GEM port:  %d\n", portId);
  mvOsPrintf("------------------------------------------------------------------\n");
  mvOsPrintf("|COUNTER                                           |  VALUE      |\n");
  mvOsPrintf("------------------------------------------------------------------\n");
  mvOsPrintf(" %s   | %10u  |\n", counterText[0], mibCounters.broadcast_frames_received);
  mvOsPrintf(" %s   | %10u  |\n", counterText[1], mibCounters.multicast_frames_received);
  mvOsPrintf(" %s   | %10u  |\n", counterText[2], mibCounters.good_frames_received);
  mvOsPrintf(" %s   | %10u  |\n", counterText[3], mibCounters.frames_65_to_127_octets);
  mvOsPrintf("------------------------------------------------------------------\n");
}

/*******************************************************************************
**
**  onuGponUiDebugGemPortid
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return gem port Id valid configuration
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiDebugGemPortid(char* buf, int range)
{
  MV_BOOL enable;
  MV_U32  portId;
  MV_U32  startRange;
  MV_U32  endRange;
  int     off = 0;

  off += mvOsSPrintf(buf+off, "GEM port ids list\n");
  off += mvOsSPrintf(buf+off, "=================\n");

  switch (range)
  {
    case 1:  startRange = 1000; endRange = 1999; break;
    case 2:  startRange = 2000; endRange = 2999; break;
    case 3:  startRange = 3000; endRange = 4096; break;
    default: startRange = 0;    endRange = 999;  break;
  }

  for (portId = startRange ; portId < endRange ; portId++)
  {
    enable = mvOnuGponMacPortIdValidGet(portId);
    if (enable == MV_TRUE) off += mvOsSPrintf(buf+off, "[%04d]", portId);
    if ((portId / 14) == 0) off += mvOsSPrintf(buf+off, "\n");
  }

  off += mvOsSPrintf(buf+off, "\n");
  return(off);
}

#ifdef MV_GPON_STATIC_GEM_PORT
/*******************************************************************************
**
**  onuGponUiDebugDummyGemPortFlagSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set dummy gem port flag
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugDummyGemPortFlagSet(MV_U32 flag)
{
  onuGponApiGemPortIdStaticConfigFlag(flag);
}

/*******************************************************************************
**
**  onuGponUiDebugDummyGemPortReset
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function reset dummy gem port table
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     OK or ERROR
**
*******************************************************************************/
void onuGponUiDebugDummyGemPortReset(void)
{
  onuGponApiGemPortIdStaticConfigReset();
}
#endif /* MV_GPON_STATIC_GEM_PORT */

/*******************************************************************************
**
**  onuGponUiDataHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print data help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiDataHelpShow(char* buf)
{
  int off = 0;

  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Configuration Commands[DEC]\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " echo [AllocId] [T-Cont] > cfgTcont        - config alloc to tcont\n");
  off += mvOsSPrintf(buf+off, " echo [T-Cont]           > clrTcont        - clear alloc Ids from T-Cont\n");
  off += mvOsSPrintf(buf+off, " echo [0]                > rstTcont        - clear T-Cont configuration\n");
  off += mvOsSPrintf(buf+off, " echo [GemPort] [Valid]  > cfgGem          - config gem port valid state, Disable[0], Enable[1]\n");
  off += mvOsSPrintf(buf+off, " echo [Valid]            > cfgAllGem       - config all gem ports valid state, Disable[0], Enable[1]\n");
  off += mvOsSPrintf(buf+off, " echo [gemport] [state]  > cfgMibPm        - Config onu gem port for MIB PM: start count[1], stop count[0]\n");
  off += mvOsSPrintf(buf+off, " echo [dummy]            > resetMibPm      - Reset MIB PM\n");
  off += mvOsSPrintf(buf+off, " echo [gemport]          > getMibPm        - Get MIB PM for a Gem port\n");
#ifdef MV_GPON_STATIC_GEM_PORT
  off += mvOsSPrintf(buf+off, " echo [state]            > dummyGemState   - static gem port flag, Disable[0], Enable[1]\n");
  off += mvOsSPrintf(buf+off, " echo [0]                > dummyGemRst     - clear static gem port table\n");
#endif /* MV_GPON_STATIC_GEM_PORT */
  off += mvOsSPrintf(buf+off, " echo [PortId] [State]   > cfgAesPort      - config gem port encryption state\n");
  off += mvOsSPrintf(buf+off, " echo [State]            > cfgAllAes       - config all gem ports encryption state\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " cat showTcont                             - dump T-Cont configuration\n");
  off += mvOsSPrintf(buf+off, " cat showMibGemPorts                       - dump a list of gem ports enabled for MIB PM\n");
  off += mvOsSPrintf(buf+off, " cat showGem0xxx showGem1xxx showGem2xxx showGem3xxx - dump valid gem port list\n");
  off += mvOsSPrintf(buf+off, " cat showAes0xxx showAes1xxx showAes2xxx showAes3xxx - dump encrypted gem port list\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  return(off);
}


/******************************************************************************/
/* ========================================================================== */
/*                            Introp Commands                                 */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiOverrideShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu override parameters info
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiOverrideShow(char* buf)
{
  MV_U8 *parametersText[] = {"ExtendedBurst",
                             "Delimiter        ",
                             "OnuId            ",
                             "OmccPortId       ",
                             "EqualizationDelay"};
  MV_U8  *enableText[]    = {"disabled","enabled"};
  MV_U32 tempValue1;
  MV_U32 tempValue2;
  MV_U32 status;
  int     off = 0;

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "|  ONU OVERRIDE:                           |\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "|    PARAMETER       |  VALUE   |  STATUS  |\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");

  tempValue1 = onuGponDbExtendedBurstOperOverrideValueGet();
  tempValue2 = onuGponDbExtendedBurstSyncOverrideValueGet();
  status     = (MV_U32)onuGponDbExtendedBurstOverrideGet();
  off += mvOsSPrintf(buf+off, "| %s SYNC | %8u | %s |\n", parametersText[0], tempValue1, enableText[status]);
  off += mvOsSPrintf(buf+off, "| %s OPER | %8u | %s |\n", parametersText[0], tempValue2, enableText[status]);

  tempValue1 = onuGponDbDelimiterOverrideValueGet();
  status     = (MV_U32)onuGponDbDelimiterOverrideGet();
  off += mvOsSPrintf(buf+off, "| %s  | %8u | %s |\n", parametersText[1], tempValue1, enableText[status]);

  tempValue1 = onuGponDbOnuIdOverrideValueGet();
  status     = (MV_U32)onuGponDbOnuIdOverrideGet();
  off += mvOsSPrintf(buf+off, "| %s  | %8u | %s |\n", parametersText[2], tempValue1, enableText[status]);

  tempValue1 = onuGponDbOmccPortOverrideValueGet();
  status     = (MV_U32)onuGponDbOmccPortOverrideGet();
  off += mvOsSPrintf(buf+off, "| %s  | %8u | %s |\n", parametersText[3], tempValue1, enableText[status]);

  tempValue1 = onuGponDbEqualizationDelayOverrideValueGet();
  status     = (MV_U32)onuGponDbEqualizationDelayOverrideGet();
  off += mvOsSPrintf(buf+off, "| %s  | %8u | %s |\n", parametersText[4], tempValue1, enableText[status]);
  off += mvOsSPrintf(buf+off, "--------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiDelimiterConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu delimiter
**
**  PARAMETERS:  MV_U32 enable
**               MV_U32 DelValue
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDelimiterConfig(MV_U32 enable, MV_U32 DelValue)
{
  onuGponApiDelimiterSet((MV_BOOL)enable, DelValue);
}

/*******************************************************************************
**
**  onuGponUiOnuIdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu Id
**
**  PARAMETERS:  MV_U32 onuId
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiOnuIdConfig(MV_U32 onuId, MV_U32 enable)
{
  onuGponApiOnuIdSet((MV_BOOL)enable, onuId);
}

/*******************************************************************************
**
**  onuGponUiPortIdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu omcc port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiPortIdConfig(MV_U32 portId, MV_U32 enable)
{
  onuGponApiOmccPortIdSet((MV_BOOL)enable, portId);
}

/*******************************************************************************
**
**  onuGponUiEquDelaySetConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu equalization delay
**
**  PARAMETERS:  MV_U32 equDelayVal
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiEquDelaySetConfig(MV_U32 equDelayVal, MV_U32 enable)
{
  onuGponApiEqualizationDelaySet((MV_BOOL)enable, equDelayVal);
}

/*******************************************************************************
**
**  onuGponUiEquDelayChangeConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu equalization delay
**
**  PARAMETERS:  MV_U32 direction
**               MV_U32 size
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiEquDelayChangeConfig(MV_U32 direction, MV_U32 size)
{
  onuGponApiEqualizationDelayChange(direction, size);
}

/*******************************************************************************
**
**  onuGponUiExtendedBurstConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu extended burst
**
**  PARAMETERS:  MV_U32 enable
**               MV_U32 rangeValue
**               MV_U32 operValue
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiExtendedBurstConfig(MV_U32 enable, MV_U32 rangeValue, MV_U32 operValue)
{
  onuGponApiExtendedBurstSet ((MV_BOOL)enable, rangeValue, operValue);
}

/*******************************************************************************
**
**  onuGponUiExtendedBurstDelayConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure delay for the received onu extended burst
**
**  PARAMETERS:  MV_U32 enable
**               MV_U32 rangeValue
**               MV_U32 operValue
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiExtendedBurstDelayConfig(MV_U32 enable, MV_U32 rangeValue, MV_U32 operValue)
{
  onuGponApiExtendedBurstDelaySet ((MV_BOOL)enable, rangeValue, operValue);
}

/*******************************************************************************
**
**  onuGponUiDebugOverheadMode
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu overhead mode
**
**  PARAMETERS:  MV_U32 overMode
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugOverheadMode(MV_U32 overMode)
{
  MV_BOOL mode = (overMode == 0)? MV_FALSE : MV_TRUE;
  onuGponPonMngOverheadManualModeSet(mode);
}

/*******************************************************************************
**
**  onuGponUiDebugOverheadGuard
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu overhead guard bits
**
**  PARAMETERS:  MV_U32 guard
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugOverheadGuard(MV_U32 guard)
{
  onuGponDbGuardBitsSet(guard);
}

/*******************************************************************************
**
**  onuGponUiDebugOverheadPreamble
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu overhead preamble
**
**  PARAMETERS:  MV_U32 pream3RangeCnt
**               MV_U32 pream3OperCnt
**               MV_U32 pream3PattCnt
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugOverheadPreamble(MV_U32 pream3RangeCnt,
                                    MV_U32 pream3OperCnt,
                                    MV_U32 pream3PattCnt)
{
  MV_U32 onuState;

  onuGponDbPreambleSet(ONU_GPON_PREM_TYPE_03, pream3PattCnt, 0);
  onuGponDbExtPreambleSyncSet(pream3RangeCnt);
  onuGponDbExtPreambleOperSet(pream3OperCnt);
  onuState = onuGponDbOnuStateGet();
  if (onuState == ONU_GPON_05_OPERATION) mvOnuGponMacPreambleType3Set(pream3PattCnt,pream3OperCnt);
  else                                   mvOnuGponMacPreambleType3Set(pream3PattCnt,pream3RangeCnt);
}

/*******************************************************************************
**
**  onuGponUiIntropHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print introp help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiIntropHelpShow(char* buf)
{
  int off = 0;

  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Configuration Commands[DEC]\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " echo [OnuId] [Enable]                   > onuIdCfg     - override configured OnuId\n");
  off += mvOsSPrintf(buf+off, " echo [PortId] [Enable]                  > portIdCfg    - override configured omcc portId\n");
  off += mvOsSPrintf(buf+off, " echo [EquDelay] [Enable]                > eqdCfg       - override configured Equ Delay\n");
  off += mvOsSPrintf(buf+off, " echo [Direction] [Size]                 > eqdChange    - change Equ Delay\n");
  off += mvOsSPrintf(buf+off, " echo [Enable] [RangeValue] [OperValue]  > extBurstCfg  - override configured external burst\n");
  off += mvOsSPrintf(buf+off, " echo [Enable] [RangeValue] [OperValue]  > extBurstDelayCfg  - add configured delay to received external burst\n");
  off += mvOsSPrintf(buf+off, " echo [Enable] [Value]                   > delimiterCfg - override configured delimiter\n");
  off += mvOsSPrintf(buf+off, " echo [RangeValue] [OperValue] [Pattern] > preambleCfg  - override configured preamble type3\n");
  off += mvOsSPrintf(buf+off, " echo [Guard Bits]                       > guardCfg     - configure guard bits\n");
  off += mvOsSPrintf(buf+off, " echo [Mode]                             > manModeCfg   - configure override parameters mode\n");
  off += mvOsSPrintf(buf+off, " echo [Mode]                             > adminCfg     - configure onu Tx mode:(0)Enable, (1)Disable\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " cat manMode                              - override parameters mode\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");

  return(off);
}


/******************************************************************************/
/* ========================================================================== */
/*                            Protocol Commands                               */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiDebugBurstConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu tx burst
**
**  PARAMETERS:  MV_U32 start
**               MV_U32 stop
**               MV_U32 order
**               MV_U32 polarity
**               MV_U32 mask
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugBurstConfig(MV_U32 start,
                               MV_U32 stop,
                               MV_U32 order,
                               MV_U32 polarity,
                               MV_U32 mask)
{
  S_apiBurstConfig burstConfig;

  burstConfig.start    = start;
  burstConfig.stop     = stop;
  burstConfig.order    = order;
  burstConfig.polarity = polarity;
  burstConfig.mask     = mask;

  onuGponApiBurstConfigSet(&burstConfig);
}

/*******************************************************************************
**
**  onuGponUiDebugBurstInfo
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu tx burst info
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiDebugBurstInfo(char* buf)
{
  S_apiBurstConfig burstConfig;
  int              off = 0;

  onuGponApiBurstConfigGet(&burstConfig);

  off += mvOsSPrintf(buf+off, "----------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| Burst Parameters                           |\n");
  off += mvOsSPrintf(buf+off, "|--------------------------------------------|\n");
  off += mvOsSPrintf(buf+off, "|  Start |  Stop  | Order  |Polarity| Mask   |\n");
  off += mvOsSPrintf(buf+off, "|--------------------------------------------|\n");
  off += mvOsSPrintf(buf+off, "|   %02d   |   %02d   |   %02d   |   %02d   |   %02d   |\n",
                     burstConfig.start, burstConfig.stop, burstConfig.order,
                     burstConfig.polarity, burstConfig.mask);
  off += mvOsSPrintf(buf+off, "|--------------------------------------------|\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiInfoBerDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function get Global OLT BER Information
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiInfoBerDebug(char* buf)
{
  S_BerCoefficient coeff;
  MV_U32           seconds;
  MV_U32           ber;
  MV_U32           intervalBer;
  MV_U32           bip,lastBip;
  MV_U32           sdThreshold;
  MV_U32           sfThreshold;
  MV_U32           sdDetectValue;
  MV_U32           sdCancelValue;
  MV_U32           sfDetectValue;
  MV_U32           sfCancelValue;
  int              off = 0;

  coeff         = onuGponBerCoefficientGet();
  seconds       = onuGponBerIntervalSecondsGet();
  sdThreshold   = onuGponDbSdThresholdGet();
  sfThreshold   = onuGponDbSfThresholdGet();

  sdDetectValue = onuGponBerPower(10 ,(11 - sdThreshold));
  sdCancelValue = onuGponBerPower(10 ,(11 - sdThreshold - 1));
  sfDetectValue = onuGponBerPower(10 ,(11 - sfThreshold));
  sfCancelValue = onuGponBerPower(10 ,(11 - sfThreshold - 1));

  ber           = onuGponBerBerValueGet();
  intervalBer   = onuGponBerIntervalBerValueGet();
  bip           = onuGponBerBip8CounterGet();
  lastBip       = onuGponBerLastIntervalBip8CounterGet();

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "----------------------------------------\n");
  off += mvOsSPrintf(buf+off, "| BER Information                      |\n");
  off += mvOsSPrintf(buf+off, "|--------------------------------------|\n");
  off += mvOsSPrintf(buf+off, "|Interval of %2d Seconds                |\n", seconds);
  off += mvOsSPrintf(buf+off, "|Coefficient is %2d/%2d                  |\n", coeff.numerator, coeff.denominator);
  off += mvOsSPrintf(buf+off, "-----------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "|Interval BER|   BER      | BIP8       | Inter.BIP8 |\n");
  off += mvOsSPrintf(buf+off, "-----------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "   %010u | %010u | %010u | %010u |\n", intervalBer, ber ,bip, lastBip);
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, " | DET SD TH  | CNC SD TH  | DET SF TH  | CNC SF TH  |\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "   %010u | %010u | %010u | %010u |\n", sdDetectValue, sdCancelValue, sfDetectValue, sfCancelValue);
  off += mvOsSPrintf(buf+off, "------------------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiDebugBerIntervalDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu ber interval
**
**  PARAMETERS:  MV_U32 interval
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugBerIntervalDebug(MV_U32 interval)
{
  onuGponApiBerIntervalConfig(interval);
}

/*******************************************************************************
**
**  onuGponUiDebugBerCoefficientDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu ber coefficient
**
**  PARAMETERS:  MV_U32 numerator
**               MV_U32 denominator
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugBerCoefficientDebug(MV_U32 numerator, MV_U32 denominator)
{
  onuGponApiBerCoefficientConfig(denominator,numerator);
}

/*******************************************************************************
**
**  onuGponUiBerThresholdsConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu ber thresholds
**
**  PARAMETERS:  MV_U32 sd
**               MV_U32 sf
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiBerThresholdsConfig(MV_U32 sd, MV_U32 sf)
{
  onuGponApiBerThresholdConfig(sd, sf);
}

/*******************************************************************************
**
**  onuGponUiDebugAesSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu AES port configuration
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugAesSet(MV_U32 portId, MV_U32 enable)
{
  MV_STATUS rcode = MV_OK;
  MV_BOOL   enaBool;
  MV_BOOL   valid;

  /* to start AES on a port Id, it should be valid */
  if (enable == 1)
  {
    valid = onuGponDbGemPortValidGet(portId);
    if (valid != MV_TRUE)
    {
      mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
                 "Set GEM Port AES: Port(%d) is not Valid\n", portId);
      return;
    }
  }

  enaBool = (enable == 0) ? MV_FALSE : MV_TRUE;

  rcode = mvOnuGponMacAesPortIdSet(portId, enaBool);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "Set GEM Port AES: Port(%d) enable(%d) failed\n", portId, enable);
  }

  onuGponDbGemPortAesSet(portId, enaBool);
}

/*******************************************************************************
**
**  onuGponUiDebugAesSetAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu AES port configuration
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugAesSetAll(MV_U32 enable)
{
  MV_STATUS  rcode = MV_OK;
  MV_BOOL    enaBool;
  MV_BOOL    valid;
  MV_U32     portId;

  for (portId = 0; portId < 4096; portId++)
  {
    /* to start AES on a port Id, it should be valid */
    if (enable == 1)
    {
      valid = onuGponDbGemPortValidGet(portId);
      if (valid != MV_TRUE)
      {
        mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
                   "Set GEM Port AES: Port(%d) is not Valid\n", portId);
        return;
      }
    }

    enaBool = (enable == 0) ? MV_FALSE : MV_TRUE;

    rcode = mvOnuGponMacAesPortIdSet(portId, enaBool);
    if (rcode != MV_OK)
    {
      mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
                 "Set GEM Port AES: Port(%d) enable(%d) failed\n", portId, enable);
    }

    onuGponDbGemPortAesSet(portId,enaBool);
  }
}

/*******************************************************************************
**
**  onuGponUiDebugAesGemAll
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function return a list of all gem port AES and status
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiDebugAesGemAll(char* buf, int range)
{
  MV_U32  portId;
  MV_BOOL enable;
  MV_U32  startRange;
  MV_U32  endRange;
  int     off = 0;

  off += mvOsSPrintf(buf+off, "Encrypted GEM port ids list\n");
  off += mvOsSPrintf(buf+off, "===========================\n");

  switch (range)
  {
    case 1:  startRange = 1000; endRange = 1999; break;
    case 2:  startRange = 2000; endRange = 2999; break;
    case 3:  startRange = 3000; endRange = 4096; break;
    default: startRange = 0;    endRange = 999;  break;
  }

  for (portId = startRange ; portId < endRange ; portId++)
  {
    if (onuGponDbGemPortValidGet(portId)== MV_TRUE) {
        enable = onuGponDbGemPortAesGet(portId);
        if (enable == MV_TRUE) off += mvOsSPrintf(buf+off, "[%04d]", portId);
    }
    if ((portId / 14) == 0) off += mvOsSPrintf(buf+off, "\n");
  }

  return(off);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerSendPloam
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function transmit US ploam message
**
**  PARAMETERS:  MV_U32 msgId
**               MV_U32 onuId
**               MV_U32 data1
**               MV_U32 data2
**               MV_U32 data3
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerSendPloam(MV_U32 msgId,
                                    MV_U32 onuId,
                                    MV_U32 data1,
                                    MV_U32 data2,
                                    MV_U32 data3)
{
  MV_U8     msgData[12];
  MV_STATUS rcode;

  msgData[0]  = (MV_U8)((data1 >> 24) & 0xFF);
  msgData[1]  = (MV_U8)((data1 >> 16) & 0xFF);
  msgData[2]  = (MV_U8)((data1 >> 8) & 0xFF);
  msgData[3]  = (MV_U8)((data1) & 0xFF);
  msgData[4]  = (MV_U8)((data2 >> 24) & 0xFF);
  msgData[5]  = (MV_U8)((data2 >> 16) & 0xFF);
  msgData[6]  = (MV_U8)((data2 >> 8) & 0xFF);
  msgData[7]  = (MV_U8)((data2) & 0xFF);
  msgData[8]  = (MV_U8)((data3 >> 24) & 0xFF);
  msgData[9]  = (MV_U8)((data3 >> 16) & 0xFF);
  msgData[10] = (MV_U8)((data3 >> 8) & 0xFF);
  msgData[11] = (MV_U8)((data3) & 0xFF);

  rcode = mvOnuGponMacMessageSend(onuId, msgId, msgData);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "mvOnuGponMacMessageSend failed\n");
  }
}

/*******************************************************************************
**
**  onuGponUiDebugManagerReceivePloam
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function receive DS ploam message
**
**  PARAMETERS:  MV_U32 msgId
**               MV_U32 onuId
**               MV_U32 data1
**               MV_U32 data2
**               MV_U32 data3
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerReceivePloam(MV_U32 msgId,
                                       MV_U32 onuId,
                                       MV_U32 data1,
                                       MV_U32 data2,
                                       MV_U32 data3)
{
  MV_U8 msgData[12];

  msgData[0]  = (MV_U8)((data1 >> 24) & 0xFF);
  msgData[1]  = (MV_U8)((data1 >> 16) & 0xFF);
  msgData[2]  = (MV_U8)((data1 >> 8) & 0xFF);
  msgData[3]  = (MV_U8)((data1) & 0xFF);
  msgData[4]  = (MV_U8)((data2 >> 24) & 0xFF);
  msgData[5]  = (MV_U8)((data2 >> 16) & 0xFF);
  msgData[6]  = (MV_U8)((data2 >> 8) & 0xFF);
  msgData[7]  = (MV_U8)((data2) & 0xFF);
  msgData[8]  = (MV_U8)((data3 >> 24) & 0xFF);
  msgData[9]  = (MV_U8)((data3 >> 16) & 0xFF);
  msgData[10] = (MV_U8)((data3 >> 8) & 0xFF);
  msgData[11] = (MV_U8)((data3) & 0xFF);

  onuGponPonMngPloamProcess((MV_U8)onuId, (MV_U8)msgId, msgData);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerRcvBurstPloams
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function receives DS ploam messages
**
**  PARAMETERS:  MV_U32 msgId
**               MV_U32 onuId
**               MV_U32 data1
**               MV_U32 data2
**               MV_U32 data3
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerRcvBurstPloams(MV_U32 msgId,
                                         MV_U32 onuId,
                                         MV_U32 data1,
                                         MV_U32 data2,
                                         MV_U32 data3)
{
    int i;

    for (i=0; i<maxPloamsSend; i++) {
        onuGponUiDebugManagerReceivePloam(msgId, onuId, data1, data2, data3);
    }
}

/*******************************************************************************
**
**  onuGponUiDebugManagerRcvBurstCfg
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures DS PLOAM burst size
**
**  PARAMETERS:  MV_U32 size
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerRcvBurstCfg(MV_U32    size)
{
    maxPloamsSend = size;
}

/*******************************************************************************
**
**  onuGponUiDebugManagerFifoCntsClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function clears SW FIFO counters
**
**  PARAMETERS:  MV_U32 size
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerFifoCntsClear(MV_U32    value)
{
    mvOnuGponMacFifoCountersSet(value);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerFifoSupportSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function enables or disables SW FIFO support
**
**  PARAMETERS:  MV_U32 size
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerFifoSupportSet (MV_U32    enDis)
{
    mvOnuGponMacFifoSupportSet(enDis);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerAcCouplingSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures TX AC coupling parameters
**
**  PARAMETERS:  MV_U32 mode
**               MV_U32 time
**               MV_U32 pattern1
**               MV_U32 pattern2
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerAcCouplingSet(MV_U32 mode, MV_U32 time, MV_U32 pattern1, MV_U32 pattern2)
{
	mvOnuGponMacTxConfigAcCouplingSet(mode, time, pattern1, pattern2);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerAcCouplingGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints TX AC coupling parameters
**
**  PARAMETERS:  char *buf
**
**  OUTPUTS:     char *buf
**
**  RETURNS:     None
**
*******************************************************************************/
int onuGponUiDebugManagerAcCouplingGet(char *buf)
{
	int        off = 0;
	MV_U32     mode, time;
	MV_U8      pattern1, pattern2;
	MV_STATUS  status;

	status = mvOnuGponMacTxConfigAcCouplingGet(&mode, &time, &pattern1, &pattern2);

	if (status != MV_OK)
		off += mvOsSPrintf(buf+off, "Failed to obtain AC coupling configuration!\n");
	else {
		off += mvOsSPrintf(buf+off, "------------------------------------\n");
		off += mvOsSPrintf(buf+off, "| AC Coupling Parameters (HEX val)  |\n");
		off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");
		off += mvOsSPrintf(buf+off, "| Mode | Time | Pattern1 | Pattern2 |\n");
		off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");
		off += mvOsSPrintf(buf+off, "|  %02x  | %04x |    %02x    |    %02x    |\n",
				   mode, time, pattern1, pattern2);
		off += mvOsSPrintf(buf+off, "|-----------------------------------|\n");
	}

	return(off);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerActiveTxBitmapSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures UTM Active TX Bitmap
**
**  PARAMETERS:  MV_U32 bitmap - bitmap
**               MV_U32 valid  - valid
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugManagerActiveTxBitmapSet(MV_U32 bitmap, MV_U32 valid)
{
	mvOnuGponMacUtmActiveTxBitmapSet(bitmap);
	mvOnuGponMacUtmActiveTxBitmapValidSet(valid);
}

/*******************************************************************************
**
**  onuGponUiDebugManagerActiveTxBitmapGet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function prints UTM Active TX bitmap
**
**  PARAMETERS:  char *buf
**
**  OUTPUTS:     char *buf
**
**  RETURNS:     None
**
*******************************************************************************/
int onuGponUiDebugManagerActiveTxBitmapGet(char *buf)
{

	int        off = 0;
	MV_U32     bitmap, valid;
	MV_STATUS  status;


	status  = mvOnuGponMacUtmActiveTxBitmapConfigGet(&bitmap, &valid);

	if (status != MV_OK)
		off += mvOsSPrintf(buf+off, "Failed to obtain UTM Active TX bitmap!\n");
	else
		off += mvOsSPrintf(buf+off, "UTM Active TX bitmap = %#x valid = %d\n", bitmap, valid);

	return(off);
}


/*******************************************************************************
**
**  onuGponUiGemOmciPortIdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu omci port Id
**
**  PARAMETERS:  MV_U32 portId
**               MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiGemOmciPortIdConfig(MV_U32 portId, MV_U32 valid)
{
  mvOnuGponMacGemOmciPortIdSet(portId, valid); /* Rx */
  mvOnuGponMacUtmOmciPortIdSet(portId, valid); /* Tx */

  onuGponDbOmccPortSet(portId);
  onuGponDbOmccValidSet(valid);
}

/*******************************************************************************
**
**  onuGponUiGemOmciPortIdShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu omcc port Id
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiGemOmciPortIdShow(char* buf)
{
  MV_STATUS rcode;
  MV_U32    gemPortId;
  MV_U32    gemPortValid;
  MV_U32    utmPortId;
  MV_U32    utmPortValid;
  int       off = 0;

  rcode = mvOnuGponMacGemOmciPortIdGet(&gemPortId, &gemPortValid);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get Rx(gem) omci portId, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  rcode = mvOnuGponMacUtmOmciPortIdGet(&utmPortId, &utmPortValid);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get Tx(Utm) omci portId, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "OMCI Rx(Gem) PortId %8d valid %s\n", gemPortId, (gemPortValid == 0) ? ("FALSE") : ("TRUE"));
  off += mvOsSPrintf(buf+off, "OMCI Tx(Utm) PortId %8d valid %s\n", utmPortId, (utmPortValid == 0) ? ("FALSE") : ("TRUE"));

  return(off);
}

/*******************************************************************************
**
**  onuGponUiGemFrameLengthShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu frame lengths
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiGemFrameLengthShow(char* buf)
{
  MV_STATUS rcode;
  MV_U32    payloadlen;
  MV_U32    maxEthFrameLen;
  MV_U32    minEthFrameLen;
  MV_U32    maxOmciFrameLen;
  MV_U32    minOmciFrameLen;
  int       off = 0;

  rcode = mvOnuGponMacGemPayloadLenGet(&payloadlen);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get gem payload length value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  rcode = mvOnuGponMacGemEthFrameLenGet(&maxEthFrameLen, &minEthFrameLen);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get ethernet frame length value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  rcode = mvOnuGponMacGemOmciFrameLenGet(&maxOmciFrameLen, &minOmciFrameLen);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to get omci frame value, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "----------------------\n");
  off += mvOsSPrintf(buf+off, "|Frame Length        |\n");
  off += mvOsSPrintf(buf+off, "-----------------------------------\n");
  off += mvOsSPrintf(buf+off, "| Frame              |   VALUE    |\n");
  off += mvOsSPrintf(buf+off, "-----------------------------------\n");
  off += mvOsSPrintf(buf+off, "Gem payload          | %10d |\n", payloadlen);
  off += mvOsSPrintf(buf+off, "Gem min eth frame    | %10d |\n", minEthFrameLen);
  off += mvOsSPrintf(buf+off, "Gem max eth frame    | %10d |\n", maxEthFrameLen);
  off += mvOsSPrintf(buf+off, "Gem min omci frame   | %10d |\n", minOmciFrameLen);
  off += mvOsSPrintf(buf+off, "Gem max omci frame   | %10d |\n", maxOmciFrameLen);
  off += mvOsSPrintf(buf+off, "-----------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuGponUiGemPayloadLenConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu gem payload length
**
**  PARAMETERS:  MV_U32 payloadLen
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiGemPayloadLenConfig(MV_U32 payloadLen)
{
  mvOnuGponMacGemPayloadLenSet(payloadLen);
}

/*******************************************************************************
**
**  onuGponUiGemEthFrameLenConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu ethernet min/max frame length
**
**  PARAMETERS:  MV_U32 minFrameLenArg
**               MV_U32 maxFrameLenArg
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiGemEthFrameLenConfig(MV_U32 minFrameLenArg, MV_U32 maxFrameLenArg)
{
  mvOnuGponMacGemEthFrameLenSet(maxFrameLenArg, minFrameLenArg);
}

/*******************************************************************************
**
**  onuGponUiGemOmciFrameLenConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu omci min/max frame length
**
**  PARAMETERS:  MV_U32 minFrameLenArg
**               MV_U32 maxFrameLenArg
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiGemOmciFrameLenConfig(MV_U32 minFrameLenArg, MV_U32 maxFrameLenArg)
{
  mvOnuGponMacGemOmciFrameLenSet(maxFrameLenArg, minFrameLenArg);
}

/*******************************************************************************
**
**  onuGponUiProtoHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print protocol help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiProtoHelpShow(char* buf)
{
	int off = 0;
	MV_U32 devId = mvCtrlModelGet();

	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, "Configuration Commands[DEC]\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, " echo [BER Interval]            > berIntervalCfg  - config ber interval\n");
	off += mvOsSPrintf(buf+off, " echo [Numerator] [Denominator] > berCoeffCfg     - "
									"config ber coeff numerator, denominator\n");
	off += mvOsSPrintf(buf+off, " echo [SD] [SF]                 > berThesholdCfg  - "
										"config ber SD, SF thresholds\n");
	off += mvOsSPrintf(buf+off, " echo [OmccPortId] [State]      > omciPortCfg     - config omcc gem port state\n");
	off += mvOsSPrintf(buf+off, " echo [Len]                     > gemFrameLenCfg  - "
										"config gem frame payload len\n");
	off += mvOsSPrintf(buf+off, " echo [MinLen] [MaxLen]         > ethFrameLenCfg  - "
										"config eth frame min & max lengths\n");
	off += mvOsSPrintf(buf+off, " echo [MinLen] [MaxLen]         > omciFrameLenCfg - "
									"config omci frame min & max lengths\n");
	off += mvOsSPrintf(buf+off, " echo [Start] [Stop] [Order] [Pola] [Mask] > txBurstCfg   - config tx burst\n");
	off += mvOsSPrintf(buf+off, " echo [MsgId] [OnuId] [Data] [Data] [Data] > ploamMsgSend - "
										"simulate transmit of US PLOAM msg\n");
	off += mvOsSPrintf(buf+off, " echo [MsgId] [OnuId] [Data] [Data] [Data] > ploamMsgRece - "
								"simulate reception and process of DS PLOAM msg\n");
	off += mvOsSPrintf(buf+off, " echo [MsgId] [OnuId] [Data] [Data] [Data] > ploamBurstRcv - "
							"simulate reception and process of DS burst PLOAM msgs\n");
	off += mvOsSPrintf(buf+off, " echo [DS burst size]           > ploamBurstCfg - config DS PLOAM burst size\n");
	off += mvOsSPrintf(buf+off, " echo 0                         > clearFifoCnts - clear all SW FIFO counters\n");
	off += mvOsSPrintf(buf+off, " echo [enable(1) or disable(0)] > fifoSupport - config US SW FIFO support\n");
	if (devId == MV_6601_DEV_ID){
		off += mvOsSPrintf(buf+off, " echo [Mode] [Burst_Time] [Pattern1] [Pattern2] > acCoupling - "
									"configure TX AC Coupling parameters\r\n");
		off += mvOsSPrintf(buf+off, " echo [Bitmap] [Valid]                    > activeTxBm - "
									"configure UTM Active TX Bitmap\n");
	}
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, " cat txBurst                              - dump tx burst info\n");
	off += mvOsSPrintf(buf+off, " cat gemFrameLen                          - dump frame lengths\n");
	if (devId == MV_6601_DEV_ID){
		off += mvOsSPrintf(buf+off, " cat acCoupling                           - "
									"dump TX AC Coupling parameters\n");
		off += mvOsSPrintf(buf+off, " cat activeTxBm - "
									"show UTM Active TX Bitmap\n");
	}
	off += mvOsSPrintf(buf+off, "============================================================================\n");

	return(off);
}

/******************************************************************************/
/* ========================================================================== */
/*                            Misc Commands                                   */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuGponUiDebugSerialNumberSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set ONU serial Number
**
**  PARAMETERS:  ON_U32 serialNumber1
**               MV_U32 serialNumber2
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugSerialNumberSet(MV_U32 serialNumber1, MV_U32 serialNumber2)
{
  MV_STATUS rcode;
  MV_U8     serialNumber[8];

  serialNumber[0] = (MV_U8)((serialNumber1 >> 24) & 0xFF);
  serialNumber[1] = (MV_U8)((serialNumber1 >> 16) & 0xFF);
  serialNumber[2] = (MV_U8)((serialNumber1 >> 8) & 0xFF);
  serialNumber[3] = (MV_U8)((serialNumber1) & 0xFF);
  serialNumber[4] = (MV_U8)((serialNumber2 >> 24) & 0xFF);
  serialNumber[5] = (MV_U8)((serialNumber2 >> 16) & 0xFF);
  serialNumber[6] = (MV_U8)((serialNumber2 >> 8) & 0xFF);
  serialNumber[7] = (MV_U8)((serialNumber2) & 0xFF);

  rcode = onuGponSrvcSerialNumberSet(serialNumber);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to set Serial Number, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }
}

/*******************************************************************************
**
**  onuGponUiDebugSerialNumberSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function set ONU serial Number
**
**  PARAMETERS:  ON_U32 serialNumber1
**               MV_U32 serialNumber2
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugPasswordSet(MV_U32 passwordNumber1,
                               MV_U32 passwordNumber2,
                               MV_U32 passwordNumber3)
{
  MV_STATUS rcode;
  MV_U8     password[10];

  password[0] = (MV_U8)((passwordNumber1 >> 24) & 0xFF);
  password[1] = (MV_U8)((passwordNumber1 >> 16) & 0xFF);
  password[2] = (MV_U8)((passwordNumber1 >> 8) & 0xFF);
  password[3] = (MV_U8)((passwordNumber1) & 0xFF);
  password[4] = (MV_U8)((passwordNumber2 >> 24) & 0xFF);
  password[5] = (MV_U8)((passwordNumber2 >> 16) & 0xFF);
  password[6] = (MV_U8)((passwordNumber2 >> 8) & 0xFF);
  password[7] = (MV_U8)((passwordNumber2) & 0xFF);
  password[8] = (MV_U8)((passwordNumber3 >> 24) & 0xFF);
  password[9] = (MV_U8)((passwordNumber3 >> 16) & 0xFF);

  rcode = onuGponDbPasswordSet(password);
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "%s:%d, failed to set password, rcode(%d)\n", __FILE_DESC__, __LINE__, rcode);
  }
}

/*******************************************************************************
**
**  onuGponUiTxEnThresholdConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu tx enable threshold
**
**  PARAMETERS:  MV_U32 threshold
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiTxEnThresholdConfig(MV_U32 threshold)
{
  mvOnuGponMacTxTxEnableCounterThresholdSet(threshold);
}

/*******************************************************************************
**
**  onuGponUiUtmTcPeriodConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu utm tc period
**
**  PARAMETERS:  MV_U32 period
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiUtmTcPeriodConfig(MV_U32 period)
{
  mvOnuGponMacUtmTcPeriodSet(period);
}

/*******************************************************************************
**
**  onuGponUiUtmTcValidConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu utm tc valid
**
**  PARAMETERS:  MV_U32 valid
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiUtmTcValidConfig(MV_U32 valid)
{
  mvOnuGponMacUtmTcValidSet(valid);
}

/*******************************************************************************
**
**  onuGponUitxDbrBlockSizeConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function change onu dbr block size
**
**  PARAMETERS:  MV_U32 blockSize
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUitxDbrBlockSizeConfig(MV_U32 blockSize)
{
  MV_U32 configuredBlockSize;

  onuGponSrvcDbrBlockSizeSet(blockSize, &configuredBlockSize);
}

/*******************************************************************************
**
**  onuGponUiDebugMemReadReg
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function test requested address space
**
**  PARAMETERS:  MV_U32 readOffset
**               MV_U32 readEntry
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugReadReg(MV_U32 readOffset, MV_U32 readEntry)
{
  MV_U32 regValue;

#ifndef PON_FPGA
  regValue = MV_REG_READ((MV_GPON_MAC_REGS_BASE) + readOffset + (readEntry * sizeof (MV_U32)));
#else /* PON_FPGA */
  regValue = MV_REG_READ((MV_GPON_REG_BASE) + readOffset + (readEntry * sizeof (MV_U32)));
#endif /* PON_FPGA */

  mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
             "Read register offset 0x%x, entry %d = [0x%08X]\n\r", readOffset, readEntry, regValue);
}

/*******************************************************************************
**
**  onuGponUiDebugWriteReg
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function test requested address space
**
**  PARAMETERS:  MV_U32 writeOffset
**               MV_U32 writeEntry
**               MV_U32 regValue
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugWriteReg(MV_U32 writeOffset, MV_U32 writeEntry, MV_U32 regValue)
{
#ifndef PON_FPGA
  MV_REG_WRITE((MV_GPON_MAC_REGS_BASE) + writeOffset + (writeEntry * sizeof (MV_U32)), regValue);
#else /* PON_FPGA */
  MV_REG_WRITE((MV_GPON_REG_BASE) + writeOffset + (writeEntry * sizeof (MV_U32)), regValue);
#endif /* PON_FPGA */

  mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
             "Write  register offset 0x%x, entry %d = [0x%08X]\n\r", writeOffset, writeEntry, regValue);
}

/*******************************************************************************
**
**  onuGponUiDebugDebugModeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu denug mode
**
**  PARAMETERS:  MV_U32 debugMode
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugDebugModeSet(MV_U32 debugMode)
{
  MV_BOOL mode;

  mode = (debugMode == 0)? MV_FALSE : MV_TRUE;
  onuGponPonMngDebugModeSet(mode);
}

/*******************************************************************************
**
**  onuGponUiDebugUponModeSet
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure onu UPON mode
**
**  PARAMETERS:  MV_U32 debugMode
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugUponModeSet(MV_U32 uponMode)
{
  MV_BOOL mode;

  mode = (uponMode == 0)? MV_FALSE : MV_TRUE;
  onuGponApiUponDebugSet(mode);
}

/*******************************************************************************
****  onuGponUiCfgSetUserPatternBurst
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config start onu transmission of user-defined
**               pattern burst
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuGponUiCfgSetUserPatternBurst(MV_U32 patternMSB, MV_U32 pattern, MV_U32 patternLSB)
{
  MV_U32 userPattern[3];

  userPattern[0] = patternLSB;
  userPattern[1] = pattern;
  userPattern[2] = patternMSB;

  mvOnuPonMacPrbsUserDefinedPatternSet(userPattern);
}
/*******************************************************************************
****  onuGponUiCfgSetDefinedPatternBurst
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config start onu transmission of pre-defined
**               pattern burst
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuGponUiCfgSetDefinedPatternBurst(MV_U32 enable, MV_U32 pattern, MV_U32 burst, MV_U32 duration, MV_U32 period)
{

    if (enable == 0) {
      onuPonPatternBurstOff();
    }
    else
    {
      onuPonTxPowerOn(MV_TRUE);
      onuPonPatternBurstOn(pattern, (MV_BOOL)burst, period, duration);
    }

}

/*******************************************************************************
**
**  onuGponUiDebugAdminMode
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function handle onu admin mode
**
**  PARAMETERS:  MV_U32 admin
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiDebugAdminMode(MV_U32 mode)
{
  onuGponApiAdminStateSet(mode);
}

#ifdef MV_GPON_PERFORMANCE_CHECK

/*******************************************************************************
**
**  onuGponCliDebugPerformanceCheck
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  MV_U32 step
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponCliDebugPerformanceCheck(MV_U32 step)
{
  MV_U32 minCheck   = 0;
  MV_U32 maxCheck   = 0;
  MV_U32 aveCheck   = 0;
  MV_U32 aveCount   = 0;
  MV_U32 tempCheck  = 0;
  MV_U32 minMaxTemp = 0;
  MV_U32 index;

  S_GponPerformanceCheckNode *tmpPmCheckNode;

  char* pmStepDesc[] =
  {
    "ISR        ",
    "MNG1       ",
    "MNG2       ",
    "MNG3       ",
    "ExtB       ",
    "Key Switch ",
    "Cfg Port   ",
    "Req Key    ",
    "AllocId    ",
    "Password   ",
    "Enc Port   ",
    "Dis        ",
    "Dact       ",
    "Rng        ",
    "OnuId      ",
    "Over       "
  };

  if (step >= PON_MAX_PERFORMANCE)
  {
    mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
               "Invalid performance step(%d)\n", step);
    return;
  }

  tmpPmCheckNode = &(g_GponPmCheck.pmCheckNode[step]);

  mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
             "             Interval    Minimum     Maximum     Average\n");

  aveCount = 0;
  for (index = 0; index < tmpPmCheckNode->uSecCntIdx; index++)
  {
    tempCheck = tmpPmCheckNode->uSecCntStop[index] -
                tmpPmCheckNode->uSecCntStart[index];

    if (tempCheck < 1000)
    {
      aveCheck += tempCheck;
      aveCount++;

      if (minMaxTemp == 0)
      {
        minCheck = maxCheck = tempCheck;
        minMaxTemp = 1;
      }
      else
      {
        if      (tempCheck > maxCheck) maxCheck = tempCheck;
        else if (tempCheck < minCheck) minCheck = tempCheck;
      }
    }
  }

  if (aveCount > 0) aveCheck = aveCheck / aveCount;

  mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
             "%11s  %8u    %7lu     %7lu     %7lu\n",
             pmStepDesc[step], tmpPmCheckNode->uSecCntIdx, minCheck, maxCheck, aveCheck);

  if (tmpPmCheckNode->uSecCntIdx > 0)
  {
    for (index = 0; index < tmpPmCheckNode->uSecCntIdx - 1; index++)
    {
      mvPonPrint(PON_PRINT_INFO, PON_CLI_MODULE,
                 "%11s   Start %u Stop %u diff %u\n",
                 pmStepDesc[step],
                 tmpPmCheckNode->uSecCntStart[index],
                 tmpPmCheckNode->uSecCntStop[index],
                 (tmpPmCheckNode->uSecCntStop[index] - tmpPmCheckNode->uSecCntStart[index]));
    }
  }
}

/*******************************************************************************
**
**  onuGponCliDebugPerformanceClear
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponCliDebugPerformanceClear(void)
{
  MV_U32 step;
  MV_U32 index;
  S_GponPerformanceCheckNode *tmpPmCheckNode;

  for (step = 0; step < PON_MAX_PERFORMANCE; step++)
  {
    tmpPmCheckNode = &(g_GponPmCheck.pmCheckNode[step]);

    for (index = 0; index < tmpPmCheckNode->uSecCntIdx; index++)
    {
      tmpPmCheckNode->uSecCntStop[index]  = 0;
      tmpPmCheckNode->uSecCntStart[index] = 0;
    }

    tmpPmCheckNode->uSecCntIdx = 0;
  }
}

#endif /* MV_GPON_PERFORMANCE_CHECK */

/*******************************************************************************
**
**  onuGponUiT01IntervalConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiT01IntervalConfig(MV_U32 interval)
{
	S_OnuPonTimer  *timerId = &(onuPonResourceTbl_s.onuGponT01_TimerId);

	if (timerId->onuPonTimerActive != ONU_PON_TIMER_ACTIVE) {
		onuPonTimerUpdate(timerId,
						  timerId->onuPonTimerId.data,
						  interval,
						  0);
	} else
		printk(KERN_ERR "GPON T01 timer is running, the value is not accepted\n");

}

/*******************************************************************************
**
**  onuGponUiT02IntervalConfig
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiT02IntervalConfig(MV_U32 interval)
{
	S_OnuPonTimer  *timerId = &(onuPonResourceTbl_s.onuGponT02_TimerId);

	if (timerId->onuPonTimerActive != ONU_PON_TIMER_ACTIVE) {
		onuPonTimerUpdate(timerId,
						  timerId->onuPonTimerId.data,
						  interval,
						  0);
	} else
		printk(KERN_ERR "GPON T02 timer is running, the value is not accepted\n");

}

/*******************************************************************************
**
**  onuGponUiCfgPrbsUserPattern
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print PRBS user defined pattern
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuGponUiCfgPrbsUserPattern(char* buf)
{
  MV_U32 userPattern[3];
  int off = 0;

  mvOnuPonMacPrbsUserDefinedPatternGet(userPattern);

  off += mvOsSPrintf(buf+off, "PRBS User Pattern 0x%4x%8x%8x\n",
		     userPattern[2], userPattern[1], userPattern[0]);

  return(off);
}

/*******************************************************************************
**
**  onuGponUiSyncLogEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  MV_U32 enable
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiSyncLogEnable(MV_U32 enable)
{
	onuGponSyncLogEnable(enable);
}

/*******************************************************************************
**
**  onuGponUiSyncLogPrint
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuGponUiSyncLogPrint(void)
{
	onuGponSyncLogPrint();
}

/*******************************************************************************
**
**  onuGponLaserChannelShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function shows the laser channel from the PON ID message
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponLaserChannelShow(char *buf)
{
	return onuGponLaserChannelPrint(buf);
}

/*******************************************************************************
**
**  onuGponUiMiscHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print misc help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuGponUiMiscHelpShow(char* buf)
{
	int off = 0;
	MV_U32 devId = mvCtrlModelGet();

	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, "Configuration Commands[HEX]\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, " echo [SN1] [SN2]                > serialNumCfg    - config serial number\n");
    off += mvOsSPrintf(buf+off, " echo [PWD1] [PWD2] [PWD3]       > passwordCfg     - config password\n");
    off += mvOsSPrintf(buf+off, "                                                     10 bytes: PWD1, PWD2, 2 MSB of PWD3\n");
	off += mvOsSPrintf(buf+off, " echo [TxEnThreshold]            > txEnThresCfg    - config tx enable threshold\n");
	off += mvOsSPrintf(buf+off, " echo [TC Period]                > utmTxPeriodCfg  - config utm tc period\n");
	off += mvOsSPrintf(buf+off, " echo [TC Valid]                 > utmTcValidCfg   - config utm tc valid\n");
	off += mvOsSPrintf(buf+off, " echo [DBR Block Size]           > txDbrBlkSizeCfg - config dbr block size\n");
	off += mvOsSPrintf(buf+off, " echo [Offset] [Entry]           > readReg         - "
						"read onu reg [Id from mvPonOnuRegs.h]\n");
	off += mvOsSPrintf(buf+off, " echo [Offset] [Entry] [Value]   > writeReg        - "
						"write onu reg [Id from mvPonOnuRegs.h]\n");
	off += mvOsSPrintf(buf+off, " echo [Mode]                     > debugModeCfg    - config debug mode\n");
	off += mvOsSPrintf(buf+off, " echo [Mode]                     > stopPonSw       - "
						"stop PON switching (enabled/disabled)\n");
	off += mvOsSPrintf(buf+off, " echo [Section]                  > pmCheck         - performance check section\n");
	off += mvOsSPrintf(buf+off, " echo [0]                        > pmClear         - performance check reset\n");
	off += mvOsSPrintf(buf+off, " echo [module] [Level] [Options] > printMask       - change printing options\n");
	off += mvOsSPrintf(buf+off, " echo [state]                    > adminCfg        - "
						"change PON BE (TX EN) state 0=Enable, 1=Disable\n");
  off += mvOsSPrintf(buf+off, " echo [patternMSB][pattern][patternLSB]\n");
  off += mvOsSPrintf(buf+off, "                                 > prbsUserDefinedPattern - /* 80bit user data: 16bit patternMLSB + 32bit pattern + 32bit patternLSB\n");
  off += mvOsSPrintf(buf+off, " echo [enable][pattern][burst][duration][period]\n");
  off += mvOsSPrintf(buf+off, "                                 > prbsPreDefinedPattern\n");
  off += mvOsSPrintf(buf+off, "                                                   - start enable[1] or stop [0] transmission of\n");
  off += mvOsSPrintf(buf+off, "                                                     pattern: 0x1-1T, 0x2-2T, 0x5-User, 0x80-PRBS-7, 0x81-PRBS-9, 0x82-PRBS-15\n");
  off += mvOsSPrintf(buf+off, "                                                     burst: 0-static, 1-periodic\n");
  off += mvOsSPrintf(buf+off, "                                                     duration: peak time interval[micro seconds]\n");
  off += mvOsSPrintf(buf+off, "                                                     period - full cycle time interval[micro seconds]\n");
	off += mvOsSPrintf(buf+off, " echo [T01 Interval]             > t01IntervalCfg  - "
						"config T01 timer interval in mS\n");
	off += mvOsSPrintf(buf+off, " echo [T02 Interval]             > t02IntervalCfg  - "
						"config T02 timer interval in mS\n");
	off += mvOsSPrintf(buf+off, " echo [0]                        > syncLogEnable  - Enable or Disable record GPON range log\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, "Display Commands: cat <file>\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");
	off += mvOsSPrintf(buf+off, " cat printMask                                     - dump printing options\n");
    off += mvOsSPrintf(buf+off, " cat syncLogEnable                                 - dump GPON range log enable status\n");
    off += mvOsSPrintf(buf+off, " cat syncLog                                       - print GPON range log\n");

	return(off);
}

int onuGponUiSyncLogEnableShow()
{
    printk("The Sync Log is ");

    if (onuGponLogEnable == MV_TRUE)
    {
        printk("enabled\r\n");
    }
    else
    {
        printk("disabled\r\n");
    }

    return 0;
}

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/* ========================================================================== */
/* ========================================================================== */
/* ========================================================================== */
/* ========================================================================== */
/*                            ONU SYS FS Definition                           */
/* ========================================================================== */
/* ========================================================================== */
/* ========================================================================== */
/* ========================================================================== */
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

/* ========================================================================== */
/*                            Misc Commands                                   */
/* ========================================================================== */
static ssize_t misc_show(struct device *dev,
                         struct device_attribute *attr,
                         char *buf)
{
	const char* name = attr->attr.name;

	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	if (!strcmp(name, "printMask"))
		return ponOnuPrintStatus(buf);
	else if (!strcmp(name, "prbsUserPattern"))
		return onuGponUiCfgPrbsUserPattern(buf);
	else if (!strcmp(name, "helpMisc"))
		return onuGponUiMiscHelpShow(buf);
	else if (!strcmp(name, "syncLogEnable"))	/* sync log enable or disable */
		onuGponUiSyncLogEnableShow();
	else if (!strcmp(name, "syncLog"))	/* sync log stop */
		onuGponUiSyncLogPrint();
	else if (!strcmp(name, "laserChannel"))
		return onuGponLaserChannelShow(buf);
	return 0;
}

static ssize_t misc_store(struct device *dev,
                          struct device_attribute *attr,
                          const char *buf, size_t len)
{
	const char* name = attr->attr.name;
	unsigned long flags;
	unsigned int  param1 = 0;
	unsigned int  param2 = 0;
	unsigned int  param3 = 0;
	unsigned int  param4 = 0;
	unsigned int  param5 = 0;

	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	sscanf(buf, "%x %x %x %x %x", &param1, &param2, &param3, &param4, &param5);

	raw_local_irq_save(flags);

	if (!strcmp(name, "serialNumCfg"))		/* serialNumber1, serialNumber2 */
		onuGponUiDebugSerialNumberSet((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "passwordCfg"))		/* serialNumber1, serialNumber2 */
		onuGponUiDebugPasswordSet((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);
	else if (!strcmp(name, "txEnThresCfg"))		/* threshold */
		onuGponUiTxEnThresholdConfig((MV_U32)param1);
	else if (!strcmp(name, "utmTxPeriodCfg"))	/* period */
		onuGponUiUtmTcPeriodConfig((MV_U32)param1);
	else if (!strcmp(name, "utmTcValidCfg"))	/* valid */
		onuGponUiUtmTcValidConfig((MV_U32)param1);
	else if (!strcmp(name, "txDbrBlkSizeCfg"))	/* blockSize */
		onuGponUitxDbrBlockSizeConfig((MV_U32)param1);
	else if (!strcmp(name, "readReg"))		/* readOffset, readEntry */
		onuGponUiDebugReadReg((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "writeReg"))		/*  writeOffset, writeEntry, regValue */
		onuGponUiDebugWriteReg((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);
	else if (!strcmp(name, "debugModeCfg"))		/* debugMode */
		onuGponUiDebugDebugModeSet((MV_U32)param1);
	else if (!strcmp(name, "stopPonSw"))		/* uponMode */
		onuGponUiDebugUponModeSet((MV_U32)param1);
#ifdef MV_GPON_PERFORMANCE_CHECK
	else if (!strcmp(name, "pmCheck"))		/* step */
		onuGponCliDebugPerformanceCheck((MV_U32)param1);
	else if (!strcmp(name, "pmClear"))
		onuGponCliDebugPerformanceClear();
#endif /* MV_GPON_PERFORMANCE_CHECK */
	else if (!strcmp(name, "printMask"))		/* module, print level, options */
		ponOnuChangePrintStatus((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);
  else if (!strcmp(name, "prbsUserDefinedPattern"))
    onuGponUiCfgSetUserPatternBurst((MV_U32)param1, (MV_U32)param2, (MV_U32)param3); /* 80bit user data: 16bit patternMLSB + 32bit pattern + 32bit patternLSB\n" */
  else if (!strcmp(name, "prbsPreDefinedPattern"))
    onuGponUiCfgSetDefinedPatternBurst((MV_U32)param1, (MV_U32)param2, (MV_U32)param3 , (MV_U32)param4 , (MV_U32)param5);  /* pattern type, burst type, duration, period */
	else if (!strcmp(name, "adminCfg"))		/* admin 0=enable 1 = disable */
		onuGponUiDebugAdminMode((MV_U32)param1);
	else if (!strcmp(name, "t01IntervalCfg"))	/* T01 interval in mS */
		onuGponUiT01IntervalConfig((MV_U32)param1);
	else if (!strcmp(name, "t02IntervalCfg"))	/* T02 interval in mS */
		onuGponUiT02IntervalConfig((MV_U32)param1);
	else if (!strcmp(name, "syncLogEnable"))	/* sync log enable or disable */
		onuGponUiSyncLogEnable((MV_U32)param1);
	else
		printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);

	raw_local_irq_restore(flags);

	return(len);
}

/* ========================================================================== */
/*                            Misc Attributes                                 */
/* ========================================================================== */
static DEVICE_ATTR(serialNumCfg,          S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(passwordCfg,           S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(txEnThresCfg,          S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(utmTxPeriodCfg,        S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(utmTcValidCfg,         S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(txDbrBlkSizeCfg,       S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(readReg,               S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(writeReg,              S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(debugModeCfg,          S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(stopPonSw,             S_IWUSR, misc_show, misc_store);
#ifdef MV_GPON_PERFORMANCE_CHECK
static DEVICE_ATTR(pmCheck,               S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(pmClear,               S_IWUSR, misc_show, misc_store);
#endif /* MV_GPON_PERFORMANCE_CHECK */
static DEVICE_ATTR(prbsUserDefinedPattern,S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(prbsPreDefinedPattern, S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(adminCfg,              S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(printMask,             S_IRUSR | S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(helpMisc,              S_IRUSR, misc_show, misc_store);
static DEVICE_ATTR(prbsUserPattern,       S_IRUSR | S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(t01IntervalCfg,        S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(t02IntervalCfg,        S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(syncLogEnable,         S_IRUSR | S_IWUSR, misc_show, misc_store);
static DEVICE_ATTR(syncLog,               S_IRUSR, misc_show, misc_store);
static DEVICE_ATTR(laserChannel,          S_IRUSR, misc_show, misc_store);

static struct attribute *misc_attrs[] = {
	&dev_attr_serialNumCfg.attr,
	&dev_attr_passwordCfg.attr,
	&dev_attr_txEnThresCfg.attr,
	&dev_attr_utmTxPeriodCfg.attr,
	&dev_attr_utmTcValidCfg.attr,
	&dev_attr_txDbrBlkSizeCfg.attr,
	&dev_attr_readReg.attr,
	&dev_attr_writeReg.attr,
	&dev_attr_debugModeCfg.attr,
	&dev_attr_stopPonSw.attr,
#ifdef MV_GPON_PERFORMANCE_CHECK
	&dev_attr_pmCheck.attr,
	&dev_attr_pmClear.attr,
#endif /* MV_GPON_PERFORMANCE_CHECK */
	&dev_attr_prbsUserDefinedPattern.attr,
	&dev_attr_prbsPreDefinedPattern.attr,
	&dev_attr_adminCfg.attr,
	&dev_attr_printMask.attr,
	&dev_attr_helpMisc.attr,
	&dev_attr_prbsUserPattern.attr,
	&dev_attr_t01IntervalCfg.attr,
	&dev_attr_t02IntervalCfg.attr,
	&dev_attr_syncLogEnable.attr,
	&dev_attr_syncLog.attr,
	&dev_attr_laserChannel.attr,
	NULL
};

static struct attribute_group misc_group =
{
  .name = "misc",
  .attrs = misc_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Protocol Group                                 */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                            Protocol Commands                               */
/* ========================================================================== */
static ssize_t protocol_show(struct device *dev,
                             struct device_attribute *attr,
                             char *buf)
{
	const char* name = attr->attr.name;
	MV_U32 devId = mvCtrlModelGet();

	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	if (!strcmp(name, "txBurst"))
		return(onuGponUiDebugBurstInfo(buf));
	else if (!strcmp(name, "gemFrameLen"))
		return(onuGponUiGemFrameLengthShow(buf));
	else if (!strcmp(name, "helpProto"))
		return(onuGponUiProtoHelpShow(buf));
	else if (devId == MV_6601_DEV_ID) {
		if (!strcmp(name, "acCoupling"))
			return onuGponUiDebugManagerAcCouplingGet(buf);
	        else if (!strcmp(name, "activeTxBm"))
                        return onuGponUiDebugManagerActiveTxBitmapGet(buf);
	}
	return 0;
}

static ssize_t protocol_store(struct device *dev,
                              struct device_attribute *attr,
                              const char *buf, size_t len)
{
	const char* name = attr->attr.name;
	unsigned long flags;
	unsigned int  param1 = 0;
	unsigned int  param2 = 0;
	unsigned int  param3 = 0;
	unsigned int  param4 = 0;
	unsigned int  param5 = 0;
	MV_U32 devId = mvCtrlModelGet();

	if (!capable(CAP_NET_ADMIN))
		return -EPERM;

	sscanf(buf, "%d %d %d %d %d", &param1, &param2, &param3, &param4, &param5);

	raw_local_irq_save(flags);

	if (!strcmp(name, "txBurstCfg"))		/* start, stop, order, polarity, mask */
		onuGponUiDebugBurstConfig((MV_U32)param1, (MV_U32)param2, (MV_U32)param3,
					  (MV_U32)param4, (MV_U32)param5);
	else if (!strcmp(name, "berIntervalCfg"))	/* interval */
		onuGponUiDebugBerIntervalDebug((MV_U32)param1);
	else if (!strcmp(name, "berCoeffCfg"))		/* numerator, denominator*/
		onuGponUiDebugBerCoefficientDebug((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "berThesholdCfg"))	/* sd, sf */
		onuGponUiBerThresholdsConfig((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "omciPortCfg"))		/* portId, valid */
		onuGponUiGemOmciPortIdConfig((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "gemFrameLenCfg"))	/* payloadLen */
		onuGponUiGemPayloadLenConfig((MV_U32)param1);
	else if (!strcmp(name, "ethFrameLenCfg"))	/* minFrameLenArg, maxFrameLenArg */
		onuGponUiGemEthFrameLenConfig((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "omciFrameLenCfg"))	/* minFrameLenArg, maxFrameLenArg */
		onuGponUiGemOmciFrameLenConfig((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "ploamMsgSend"))		/* msgId, onuId, data1, data2, data3 */
		onuGponUiDebugManagerSendPloam((MV_U32)param1, (MV_U32)param2, (MV_U32)param3,
					       (MV_U32)param4, (MV_U32)param5);
	else if (!strcmp(name, "ploamMsgRece"))		/* msgId, onuId, data1, data2, data3 */
		onuGponUiDebugManagerReceivePloam((MV_U32)param1, (MV_U32)param2, (MV_U32)param3,
						  (MV_U32)param4, (MV_U32)param5);
	else if (!strcmp(name, "ploamBurstRcv"))	/* msgId, onuId, data1, data2, data3 */
		onuGponUiDebugManagerRcvBurstPloams((MV_U32)param1, (MV_U32)param2, (MV_U32)param3,
						    (MV_U32)param4, (MV_U32)param5);
	else if (!strcmp(name, "ploamBurstCfg"))	/* burst size */
		onuGponUiDebugManagerRcvBurstCfg((MV_U32)param1);
	else if (!strcmp(name, "clearFifoCnts"))	/* value */
		onuGponUiDebugManagerFifoCntsClear((MV_U32)param1);
	else if (!strcmp(name, "fifoSupport"))		/* enable/disable */
		onuGponUiDebugManagerFifoSupportSet((MV_U32)param1);
	else if (devId == MV_6601_DEV_ID) {
		if (!strcmp(name, "acCoupling"))
            /* mode, time, pattern1, pattern2 */
			onuGponUiDebugManagerAcCouplingSet((MV_U32)param1, (MV_U32)param2, (MV_U32)param3, (MV_U32)param4);
		else if (!strcmp(name, "activeTxBm"))				/* bitmap, valid */
			onuGponUiDebugManagerActiveTxBitmapSet((MV_U32)param1, (MV_U32)param2);
		else
			printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);
	} else
		printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);

	raw_local_irq_restore(flags);

	return(len);
}

/* ========================================================================== */
/*                            Protocol Attributes                             */
/* ========================================================================== */
static DEVICE_ATTR(txBurstCfg,       S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(txBurst,          S_IRUSR, protocol_show, protocol_store);
static DEVICE_ATTR(berIntervalCfg,   S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(berCoeffCfg,      S_IRUSR, protocol_show, protocol_store);
static DEVICE_ATTR(berThesholdCfg,   S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(omciPortCfg,      S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(gemFrameLen,      S_IRUSR, protocol_show, protocol_store);
static DEVICE_ATTR(gemFrameLenCfg,   S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(ethFrameLenCfg,   S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(omciFrameLenCfg,  S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(ploamMsgSend,     S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(ploamMsgRece,     S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(ploamBurstRcv,    S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(ploamBurstCfg,    S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(clearFifoCnts,    S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(fifoSupport,      S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(acCoupling,       S_IRUSR | S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(activeTxBm,       S_IRUSR | S_IWUSR, protocol_show, protocol_store);
static DEVICE_ATTR(helpProto,        S_IRUSR, protocol_show, protocol_store);

static struct attribute *protocol_attrs[] = {
	&dev_attr_txBurstCfg.attr,
	&dev_attr_txBurst.attr,
	&dev_attr_berIntervalCfg.attr,
	&dev_attr_berCoeffCfg.attr,
	&dev_attr_berThesholdCfg.attr,
	&dev_attr_omciPortCfg.attr,
	&dev_attr_gemFrameLen.attr,
	&dev_attr_gemFrameLenCfg.attr,
	&dev_attr_ethFrameLenCfg.attr,
	&dev_attr_omciFrameLenCfg.attr,
	&dev_attr_ploamMsgSend.attr,
	&dev_attr_ploamMsgRece.attr,
	&dev_attr_ploamBurstRcv.attr,
	&dev_attr_ploamBurstCfg.attr,
	&dev_attr_clearFifoCnts.attr,
	&dev_attr_fifoSupport.attr,
	&dev_attr_acCoupling.attr,
	&dev_attr_activeTxBm.attr,
	&dev_attr_helpProto.attr,
	NULL
};

static struct attribute_group protocol_group =
{
  .name = "protocol",
  .attrs = protocol_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Introp Group                                    */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                            Introp Commands                                 */
/* ========================================================================== */
static ssize_t introp_show(struct device *dev,
                           struct device_attribute *attr,
                           char *buf)
{
  const char* name = attr->attr.name;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  if      (!strcmp(name, "manMode"))
  	return (onuGponUiOverrideShow(buf));
  else if (!strcmp(name, "helpIot"))
    return (onuGponUiIntropHelpShow(buf));


  return 0;
}

static ssize_t introp_store(struct device *dev,
                            struct device_attribute *attr,
                            const char *buf, size_t len)
{
  const char* name = attr->attr.name;
  unsigned long flags;
  unsigned int  param1 = 0;
  unsigned int  param2 = 0;
  unsigned int  param3 = 0;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  sscanf(buf, "%d %d %d", &param1, &param2, &param3);

  raw_local_irq_save(flags);

  if      (!strcmp(name, "onuIdCfg"))
  	onuGponUiOnuIdConfig((MV_U32)param1, (MV_U32)param2);                           /* onuId, enable */
  else if (!strcmp(name, "portIdCfg"))
    onuGponUiPortIdConfig((MV_U32)param1, (MV_U32)param2);                          /* portId, enable */
  else if (!strcmp(name, "eqdCfg"))
    onuGponUiEquDelaySetConfig((MV_U32)param1, (MV_U32)param2);                     /* equDelayVal, enable*/
  else if (!strcmp(name, "eqdChange"))
    onuGponUiEquDelayChangeConfig((MV_U32)param1, (MV_U32)param2);                  /* direction, size */
  else if (!strcmp(name, "extBurstCfg"))
    onuGponUiExtendedBurstConfig((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);   /* enable, rangeValue, operValue */
  else if (!strcmp(name, "extBurstDelayCfg"))
    onuGponUiExtendedBurstDelayConfig((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);   /* enable, rangeValue, operValue */
  else if (!strcmp(name, "delimiterCfg"))
    onuGponUiDelimiterConfig((MV_U32)param1, (MV_U32)param2);                       /* enable , value*/
  else if (!strcmp(name, "preambleCfg"))
    onuGponUiDebugOverheadPreamble((MV_U32)param1, (MV_U32)param2, (MV_U32)param3); /* pream3RangeCnt, pream3OperCnt, pream3PattCnt */
  else if (!strcmp(name, "guardCfg"))
    onuGponUiDebugOverheadGuard((MV_U32)param1);                                    /* guard */
  else if (!strcmp(name, "manModeCfg"))
    onuGponUiDebugOverheadMode((MV_U32)param1);                                     /* overMode */
  else
 	printk("%s: illegal operation <%s>\n", __FUNCTION__, attr->attr.name);

  raw_local_irq_restore(flags);

  return(len);
}

/* ========================================================================== */
/*                            Introp Attributes                                 */
/* ========================================================================== */
static DEVICE_ATTR(onuIdCfg,        S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(portIdCfg,       S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(eqdCfg,          S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(eqdChange,       S_IRUSR, introp_show, introp_store);
static DEVICE_ATTR(extBurstCfg,     S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(extBurstDelayCfg,S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(delimiterCfg,    S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(preambleCfg,     S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(guardCfg,        S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(manModeCfg,      S_IWUSR, introp_show, introp_store);
static DEVICE_ATTR(manMode,         S_IRUSR, introp_show, introp_store);
static DEVICE_ATTR(helpIot,         S_IRUSR, introp_show, introp_store);

static struct attribute *introp_attrs[] = {
    &dev_attr_onuIdCfg.attr,
	&dev_attr_portIdCfg.attr,
	&dev_attr_eqdCfg.attr,
    &dev_attr_eqdChange.attr,
	&dev_attr_extBurstCfg.attr,
    &dev_attr_extBurstDelayCfg.attr,
    &dev_attr_delimiterCfg.attr,
    &dev_attr_preambleCfg.attr,
    &dev_attr_guardCfg.attr,
    &dev_attr_manModeCfg.attr,
	&dev_attr_manMode.attr,
    &dev_attr_helpIot.attr,
	NULL
};

static struct attribute_group introp_group =
{
  .name = "introp",
  .attrs = introp_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Data Group                                      */
/* ========================================================================== */
/******************************************************************************/
/* ========================================================================== */
/*                            Data Commands                                   */
/* ========================================================================== */
static ssize_t data_show(struct device *dev,
                         struct device_attribute *attr,
                         char *buf)
{
  const char* name = attr->attr.name;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  if      (!strcmp(name, "showTcont"))
  	return (onuGponUiDebugTcont(buf));
  else if (!strcmp(name, "showGem0xxx"))
    return (onuGponUiDebugGemPortid(buf, 0));
  else if (!strcmp(name, "showGem1xxx"))
    return (onuGponUiDebugGemPortid(buf, 1));
  else if (!strcmp(name, "showGem2xxx"))
    return (onuGponUiDebugGemPortid(buf, 2));
  else if (!strcmp(name, "showGem3xxx"))
    return (onuGponUiDebugGemPortid(buf, 3));
  else if (!strcmp(name, "showAes0xxx"))
  	return (onuGponUiDebugAesGemAll(buf, 0));
  else if (!strcmp(name, "showAes1xxx"))
  	return (onuGponUiDebugAesGemAll(buf, 1));
  else if (!strcmp(name, "showAes2xxx"))
  	return (onuGponUiDebugAesGemAll(buf, 2));
  else if (!strcmp(name, "showAes3xxx"))
  	return (onuGponUiDebugAesGemAll(buf, 3));
  else if (!strcmp(name, "showMibGemPorts"))
    return (onuGponUiDebugGemPmListShow(buf));
  else if (!strcmp(name, "helpData"))
    return (onuGponUiDataHelpShow(buf));

  return 0;
}

static ssize_t data_store(struct device *dev,
                          struct device_attribute *attr,
                          const char *buf, size_t len)
{
  const char* name = attr->attr.name;
  unsigned long flags;
  unsigned int  param1 = 0;
  unsigned int  param2 = 0;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  sscanf(buf, "%d %d", &param1, &param2);

  raw_local_irq_save(flags);

  if      (!strcmp(name, "cfgTcont"))
  	onuGponUiTcontConfig((MV_U32)param1, (MV_U32)param2);             /* alloc, tcont */
  else if (!strcmp(name, "clrTcont"))
    onuGponUiClearTcontConfig((MV_U32)param1);                        /* tcont */
  else if (!strcmp(name, "rstTcont"))
    onuGponUiResetTcontsConfig();
  else if (!strcmp(name, "cfgGem"))
    onuGponUiDebugGemPortidValidSet((MV_U32)param1, (MV_U32)param2);  /* portId, enable */
  else if (!strcmp(name, "cfgAllGem"))
    onuGponUiDebugAllGemPortidValidSet((MV_U32)param1);               /* enable */
  else if (!strcmp(name, "cfgMibPm"))
    onuGponUiDebugGemPmSet((MV_U32)param1, (MV_U32)param2);           /* Start or stop Gem port PM */
  else if (!strcmp(name, "resetMibPm"))
    onuGponUiDebugGemPmReset();                                       /* Reset PM*/
  else if (!strcmp(name, "getMibPm"))
    onuGponUiDebugGemPmGet((MV_U32)param1);                           /* Get GEM PM counters */
#ifdef MV_GPON_STATIC_GEM_PORT
  else if (!strcmp(name, "dummyGemState"))
    onuGponUiDebugDummyGemPortFlagSet((MV_U32)param1);                /* flag */
  else if (!strcmp(name, "dummyGemRst"))
    onuGponUiDebugDummyGemPortReset();
#endif /* MV_GPON_STATIC_GEM_PORT */
  else if (!strcmp(name, "cfgAesPort"))
    onuGponUiDebugAesSet((MV_U32)param1, (MV_U32)param2);                 /* portId, enable */
  else if (!strcmp(name, "cfgAllAes"))
    onuGponUiDebugAesSetAll((MV_U32)param1);                              /* enable */
  else
 	printk("%s: illegal operation <%s>\n", __FUNCTION__, attr->attr.name);

  raw_local_irq_restore(flags);

  return(len);
}

/* ========================================================================== */
/*                            Data Attributes                                 */
/* ========================================================================== */
static DEVICE_ATTR(cfgTcont,          S_IWUSR, data_show, data_store);
static DEVICE_ATTR(clrTcont,          S_IWUSR, data_show, data_store);
static DEVICE_ATTR(rstTcont,          S_IWUSR, data_show, data_store);
static DEVICE_ATTR(showTcont,         S_IRUSR, data_show, data_store);
static DEVICE_ATTR(cfgGem,            S_IWUSR, data_show, data_store);
static DEVICE_ATTR(cfgAllGem,         S_IWUSR, data_show, data_store);
static DEVICE_ATTR(showGem0xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showGem1xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showGem2xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showGem3xxx,       S_IRUSR, data_show, data_store);
#ifdef MV_GPON_STATIC_GEM_PORT
static DEVICE_ATTR(dummyGemState,     S_IWUSR, data_show, data_store);
static DEVICE_ATTR(dummyGemRst,       S_IWUSR, data_show, data_store);
#endif /* MV_GPON_STATIC_GEM_PORT */
static DEVICE_ATTR(cfgAesPort,        S_IWUSR, data_show, data_store);
static DEVICE_ATTR(cfgMibPm,          S_IWUSR, data_show, data_store);
static DEVICE_ATTR(resetMibPm,        S_IWUSR, data_show, data_store);
static DEVICE_ATTR(getMibPm,          S_IWUSR, data_show, data_store);
static DEVICE_ATTR(showMibGemPorts,   S_IRUSR, data_show, data_store);
static DEVICE_ATTR(cfgAllAes,         S_IWUSR, data_show, data_store);
static DEVICE_ATTR(showAes0xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showAes1xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showAes2xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(showAes3xxx,       S_IRUSR, data_show, data_store);
static DEVICE_ATTR(helpData,          S_IRUSR, data_show, data_store);

static struct attribute *data_attrs[] = {
	&dev_attr_cfgTcont.attr,
	&dev_attr_clrTcont.attr,
	&dev_attr_rstTcont.attr,
	&dev_attr_showTcont.attr,
	&dev_attr_cfgGem.attr,
	&dev_attr_cfgAllGem.attr,
	&dev_attr_cfgMibPm.attr,
	&dev_attr_resetMibPm.attr,
    &dev_attr_getMibPm.attr,
    &dev_attr_showMibGemPorts.attr,
	&dev_attr_showGem0xxx.attr,
    &dev_attr_showGem1xxx.attr,
    &dev_attr_showGem2xxx.attr,
    &dev_attr_showGem3xxx.attr,
#ifdef MV_GPON_STATIC_GEM_PORT
	&dev_attr_dummyGemState.attr,
	&dev_attr_dummyGemRst.attr,
#endif /* MV_GPON_STATIC_GEM_PORT */
	&dev_attr_cfgAesPort.attr,
    &dev_attr_cfgAllAes.attr,
    &dev_attr_showAes0xxx.attr,
    &dev_attr_showAes1xxx.attr,
    &dev_attr_showAes2xxx.attr,
    &dev_attr_showAes3xxx.attr,
	&dev_attr_helpData.attr,
	NULL
};

static struct attribute_group data_group =
{
  .name = "data",
  .attrs = data_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Pm Group                                        */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                            Pm Commands                                     */
/* ========================================================================== */
static ssize_t gpon_pm_show(struct device *dev,
                            struct device_attribute *attr,
                            char *buf)
{
  const char* name = attr->attr.name;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  if      (!strcmp(name, "fecCnt"))
  	return (onuGponUiFecCountersShow(buf));
  else if (!strcmp(name, "rxPloamCnt"))
    return (onuGponUiRxPloamCountersShow(buf));
  else if (!strcmp(name, "txPloamCnt"))
    return (onuGponUiTxPloamCountersShow(buf));
  else if (!strcmp(name, "bwMapCnt"))
    return (onuGponUiBwMapCountersShow(buf));
  else if (!strcmp(name, "stdCnt"))
    return (onuGponUiStandardCountersShow(buf));
  else if (!strcmp(name, "gemCnt"))
    return (onuGponUiGemCountersShow(buf));
  else if (!strcmp(name, "txPktCnt"))
    return (onuGponUiTxCountersShow(buf));
  else if (!strcmp(name, "rawCnt_1"))
    return (onuGponUiRaw_1Counters(buf));
  else if (!strcmp(name, "rawCnt_2"))
    return (onuGponUiRaw_2Counters(buf));
  else if (!strcmp(name, "helpGPm"))
    return (onuGponUiPmHelpShow(buf));

  return 0;
}

static ssize_t gpon_pm_store(struct device *dev,
                             struct device_attribute *attr,
                             const char *buf, size_t len)
{
  const char* name = attr->attr.name;
  unsigned long flags;
  unsigned int  param = 0;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  sscanf(buf, "%d", &param);

  raw_local_irq_save(flags);

  if (!strcmp(name, "cntRdClrFlState"))
  	onuGponUiCountersReadClearFlag((MV_BOOL)param);
  if (!strcmp(name, "bwMapCntByState"))
    onuGponBwMapCountersEnDisFlag((MV_BOOL)param);
  else
  	printk("%s: illegal operation <%s>\n", __FUNCTION__, attr->attr.name);

  raw_local_irq_restore(flags);

  return(len);
}

/* ========================================================================== */
/*                            PM Attributes                                   */
/* ========================================================================== */
static DEVICE_ATTR(fecCnt,        S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(rxPloamCnt,    S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(txPloamCnt,    S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(bwMapCnt,      S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(stdCnt,        S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(gemCnt,        S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(txPktCnt,      S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(rawCnt_1,      S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(rawCnt_2,      S_IRUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(cntRdClrFlState,S_IWUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(bwMapCntByState,S_IWUSR, gpon_pm_show, gpon_pm_store);
static DEVICE_ATTR(helpGPm,       S_IRUSR, gpon_pm_show, gpon_pm_store);

static struct attribute *gpon_pm_attrs[] = {
    &dev_attr_fecCnt.attr,
	&dev_attr_rxPloamCnt.attr,
	&dev_attr_txPloamCnt.attr,
	&dev_attr_bwMapCnt.attr,
	&dev_attr_stdCnt.attr,
	&dev_attr_gemCnt.attr,
	&dev_attr_txPktCnt.attr,
	&dev_attr_rawCnt_1.attr,
    &dev_attr_rawCnt_2.attr,
	&dev_attr_cntRdClrFlState.attr,
    &dev_attr_bwMapCntByState.attr,
    &dev_attr_helpGPm.attr,
	NULL
};

static struct attribute_group gpon_pm_group =
{
  .name = "pm",
  .attrs = gpon_pm_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Info Group                                      */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                            Info Commands                                   */
/* ========================================================================== */
static ssize_t gpon_info_show(struct device *dev,
                              struct device_attribute *attr,
                              char *buf)
{
  const char* name = attr->attr.name;

  if (!capable(CAP_NET_ADMIN))
  	return -EPERM;

  if      (!strcmp(name, "infoGpon"))
  	return(onuGponUiInfoShow(buf));
  else if (!strcmp(name, "alarmGpon"))
    return(onuGponUiAlarmShow(buf));
  else if (!strcmp(name, "swfifoGpon"))
    return(onuGponUiFifoShow(buf));
  else if (!strcmp(name, "fecStatus"))
    return(onuGponUiFecStatus(buf));
  else if (!strcmp(name, "helpGInfo"))
    return(onuGponUiInfoHelpShow(buf));

  return 0;
}

static ssize_t gpon_info_store(struct device *dev,
                               struct device_attribute *attr,
                               const char *buf, size_t len)
{
  return(0);
}

/* ========================================================================== */
/*                            Info Attributes                                 */
/* ========================================================================== */
static DEVICE_ATTR(infoGpon,   S_IRUSR, gpon_info_show, gpon_info_store);
static DEVICE_ATTR(alarmGpon,  S_IRUSR, gpon_info_show, gpon_info_store);
static DEVICE_ATTR(swfifoGpon, S_IRUSR, gpon_info_show, gpon_info_store);
static DEVICE_ATTR(fecStatus,  S_IRUSR, gpon_info_show, gpon_info_store);
static DEVICE_ATTR(helpGInfo,  S_IRUSR, gpon_info_show, gpon_info_store);

static struct attribute *gpon_info_attrs[] = {
	&dev_attr_infoGpon.attr,
	&dev_attr_alarmGpon.attr,
    &dev_attr_swfifoGpon.attr,
	&dev_attr_fecStatus.attr,
    &dev_attr_helpGInfo.attr,
	NULL
};

static struct attribute_group gpon_info_group =
{
  .name = "info",
  .attrs = gpon_info_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            ONU SYS FS                                      */
/* ========================================================================== */
/******************************************************************************/
int __devinit gpon_sysfs_init(void)
{
  int err;
  struct device *pd;

  pd = bus_find_device_by_name(&platform_bus_type, NULL, "gpon");
  if (!pd) {
  	platform_device_register_simple("gpon", -1, NULL, 0);
  	pd = bus_find_device_by_name(&platform_bus_type, NULL, "gpon");
  }

  if (!pd) {
  	printk(KERN_ERR"%s: cannot find gpon device\n", __FUNCTION__);
  	pd = &platform_bus;
  }

  err = sysfs_create_group(&pd->kobj, &gpon_info_group);
  if (err) {
  	printk(KERN_INFO "sysfs group failed %d\n", err);
  	goto out;
  }

  err = sysfs_create_group(&pd->kobj, &gpon_pm_group);
  if (err) {
  	printk(KERN_INFO "sysfs group failed %d\n", err);
  	goto out;
  }

  err = sysfs_create_group(&pd->kobj, &data_group);
  if (err) {
  	printk(KERN_INFO "sysfs group failed %d\n", err);
  	goto out;
  }

  err = sysfs_create_group(&pd->kobj, &introp_group);
  if (err) {
  	printk(KERN_INFO "sysfs group failed %d\n", err);
  	goto out;
  }

  err = sysfs_create_group(&pd->kobj, &protocol_group);
  if (err) {
  	printk(KERN_INFO "sysfs group failed %d\n", err);
  	goto out;
  }

  err = sysfs_create_group(&pd->kobj, &misc_group);
  if (err) {
      printk(KERN_INFO "sysfs group failed %d\n", err);
      goto out;
  }

  printk(KERN_INFO "= PON Module SYS FS Init ended successfully =\n");
out:
  return err;
}

void gpon_sysfs_delete(void)
{
  struct device *pd;

  pd = bus_find_device_by_name(&platform_bus_type, NULL, "gpon");
  if (!pd)
  {
  	printk("%s: cannot find gpon device\n", __FUNCTION__);
	return;
  }

  sysfs_remove_group(&pd->kobj, &gpon_info_group);
  sysfs_remove_group(&pd->kobj, &gpon_pm_group);
  sysfs_remove_group(&pd->kobj, &data_group);
  sysfs_remove_group(&pd->kobj, &introp_group);
  sysfs_remove_group(&pd->kobj, &protocol_group);
  sysfs_remove_group(&pd->kobj, &misc_group);

  printk(KERN_INFO "= PON Module SYS FS Remove ended successfully =\n");
}

/*******************************************************************************
**
**  onuGponUsrInterfaceCreate
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function create user interface - sys fs
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponUsrInterfaceCreate(void)
{
  if (gpon_sysfs_init() != 0)
	return(MV_ERROR);

  return(MV_OK);
}

/*******************************************************************************
**
**  onuGponUsrInterfaceRelease
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function release user interface - sys fs
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuGponUsrInterfaceRelease(void)
{
  gpon_sysfs_delete();

  return(MV_OK);
}


