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

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

/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_pon/perf/epon/eponOnuLnxKsUI.c"

/* Global Variables
------------------------------------------------------------------------------*/
extern MV_U32 llidQueueState[8][4][8];
extern MV_U32 llidQueueThreshold[8][4][8];
extern MV_U32 llidNumOfQueuesets[8];
extern MV_U32 llidNumOfQueues[8];
extern MV_U32 llidNumOfReportBytes[8];

extern MV_U32 g_OnuEponRandomCount;
extern MV_U32 g_OnuEponRandomValues[];

extern MV_U32 regRandomMaskThreshold;

/* Local Variables
------------------------------------------------------------------------------*/
MV_BOOL infoEponCntReadClearInd = MV_TRUE;

/* Export Functions
------------------------------------------------------------------------------*/
extern MV_STATUS onuEponMiDbaConfig(S_EponIoctlDba *ioctlDba);
extern MV_STATUS onuEponMiHoldoverConfig(S_EponIoctlHoldOver *ioctlHoldover);
extern MV_STATUS onuEponMiSilenceConfig(S_EponIoctlSilence *ioctlSilence);
extern MV_STATUS onuEponMiAlarmGet(MV_U32 *alarm);
extern void      onuEponMiCfgMacTxEn(MV_U32 enable, MV_U32 macId);

extern void rprtThresholdSet(MV_U32 lowThCnt, MV_U32 lowThVal, MV_U32 hiThCnt, MV_U32 hiThVal);

/* Local Functions
------------------------------------------------------------------------------*/
/* ========================================================================== */
/*                            Info Commands                                   */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuEponUiInfoShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu information
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiInfoShow(char* buf)
{
  MV_STATUS status;
  S_EponIoctlInfo info[EPON_MAX_MAC_NUM];
  MV_U8           *stateDesc[] = {"", "Pending", "Active"};
  int             off = 0;
  int             macId;

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
    status = onuEponApiInformationGet(&info[macId], macId);
    if (status != MV_OK)
    {
      off += mvOsSPrintf(buf+off, "Failed read mac information!!!\n");
      return(off);
    }
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "ONT Information:\n");
  off += mvOsSPrintf(buf+off, "---------------------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "     State    Ether    Unicast             Bcast               Tx LLId  Tx LLId  \n");
  off += mvOsSPrintf(buf+off, "              Type     Mac Addr            Mac Addr                              \n");
  off += mvOsSPrintf(buf+off, " MAC                                                                             \n");
  off += mvOsSPrintf(buf+off, "---------------------------------------------------------------------------------\n");

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
      off += mvOsSPrintf(buf+off, "[%02d] %-8s %8x %02x:%02x:%02x:%02x:%02x:%02x %02x:%02x:%02x:%02x:%02x:%02x %8u %8u\n",
                        macId,
                        stateDesc[info[macId].onuEponState],
                        info[macId].onuEponCtrlType,
                        info[macId].onuEponMacAddr[0], info[macId].onuEponMacAddr[1], info[macId].onuEponMacAddr[2],
                        info[macId].onuEponMacAddr[3], info[macId].onuEponMacAddr[4], info[macId].onuEponMacAddr[5],
                        info[macId].onuEponBcastAddr[0], info[macId].onuEponBcastAddr[1], info[macId].onuEponBcastAddr[2],
                        info[macId].onuEponBcastAddr[3], info[macId].onuEponBcastAddr[4], info[macId].onuEponBcastAddr[5],
                        info[macId].onuEponTxLLID,
                        info[macId].onuEponRxLLID);
  }
  off += mvOsSPrintf(buf+off, "--------------------------------------------------\n\r");

  return(off);
}

/*******************************************************************************
**
**  onuEponUiAlarmShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu alarms
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiAlarmShow(char* buf)
{
  MV_U32 alarm[2];
  MV_U8  *statusText[] = {"OFF", "ON "};
  int    off = 0;

  onuEponAlarmGet(alarm);

  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, "| XVR SD    | SERDES SD |\n");
  off += mvOsSPrintf(buf+off, "-------------------------\n");
  off += mvOsSPrintf(buf+off, "| %9s | %9s |\n", statusText[alarm[0]], statusText[alarm[1]]);
  off += mvOsSPrintf(buf+off, "-------------------------\n");

  return(off);
}

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

#ifndef PON_FPGA
  regValue = MV_REG_READ((MV_EPON_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);
}

/*******************************************************************************
**
**  onuEponUiDebugWriteReg
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function test requested address space
**
**  PARAMETERS:  MV_U32 writeOffset
**               MV_U32 writeEntry
**               MV_U32 regValue
**
**  OUTPUTS:     None
**
**  RETURNS:     None
**
*******************************************************************************/
void onuEponUiDebugWriteReg(MV_U32 writeOffset, MV_U32 writeEntry, MV_U32 regValue)
{
#ifndef PON_FPGA
  MV_REG_WRITE((MV_EPON_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);
}

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

  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, "Configuration Commands[HEX]\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");
  off += mvOsSPrintf(buf+off, " echo [Offset] [Entry]           > readReg   - read onu reg\n");
  off += mvOsSPrintf(buf+off, " echo [Offset] [Entry] [Value]   > writeReg  - write onu reg\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 info  - dump onu information\n");
  off += mvOsSPrintf(buf+off, " cat alarm - dump onu alarms\n");
  off += mvOsSPrintf(buf+off, "============================================================================\n");

  return(off);
}

/******************************************************************************/
/* ========================================================================== */
/*                            Pm Commands                                     */
/* ========================================================================== */
/******************************************************************************/

/*******************************************************************************
**
**  onuEponUiRxCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu rx counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiRxCountersShow(char* buf)
{
  MV_STATUS       status;
  S_EponIoctlRxPm rxCounters;
  int             off = 0;

  status = onuEponApiRxPmGet(&rxCounters, infoEponCntReadClearInd, 0);
  if (status != MV_OK)
  {
    off += mvOsSPrintf(buf+off, "Failed read Rx pm information!!!\n");
    return(off);
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "Rx Counters\n");
  off += mvOsSPrintf(buf+off, "-------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "     FCS      Short    Long     Data     Ctrl     Rprt     Gate    \n");
  off += mvOsSPrintf(buf+off, "     Frames   Frames   Frames   Frames   Frames   Frames   Frames  \n");
  off += mvOsSPrintf(buf+off, " MAC Rece     Rece     Rece     Rece     Rece     Rece     Rece    \n");
  off += mvOsSPrintf(buf+off, "-------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "[00] %8u %8u %8u %8u %8u %8u %8u\n",
                     rxCounters.fcsErrorFramesCnt,
                     rxCounters.shortFramesCnt,
                     rxCounters.longFramesCnt,
                     rxCounters.dataFramesCnt,
                     rxCounters.ctrlFramesCnt,
                     rxCounters.reportFramesCnt,
                     rxCounters.gateFramesCnt);
  off += mvOsSPrintf(buf+off, "-------------------------------------------------------------------\n\r");

  return(off);
}

/*******************************************************************************
**
**  onuEponUiTxCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu tx counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiTxCountersShow(char* buf)
{
  MV_STATUS       status;
  S_EponIoctlTxPm txCounters[EPON_MAX_MAC_NUM];
  int             macId;
  int             off = 0;

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
    status = onuEponApiTxPmGet(&txCounters[macId], infoEponCntReadClearInd, macId);
    if (status != MV_OK)
    {
      off += mvOsSPrintf(buf+off, "Failed read Tx pm information!!!\n");
      return(off);
    }
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "Tx Counters\n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "     Register Register Report   Data     Tx Byte  \n");
  off += mvOsSPrintf(buf+off, "     Request  Ack      Frames   Frames   Allow    \n");
  off += mvOsSPrintf(buf+off, " MAC Frames   Frames                              \n");
  off += mvOsSPrintf(buf+off, "--------------------------------------------------\n");

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
      off += mvOsSPrintf(buf+off, "[%02d] %8u %8u %8u %8u %8u\n",
                        macId,
                        txCounters[macId].ctrlRegReqFramesCnt,
                        txCounters[macId].ctrlRegAckFramesCnt,
                        txCounters[macId].reportFramesCnt,
                        txCounters[macId].dataFramesCnt,
                        txCounters[macId].txAllowedBytesCnt);
  }
  off += mvOsSPrintf(buf+off, "--------------------------------------------------\n\r");

  return(off);
}

/*******************************************************************************
**
**  onuEponUiSwCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu sw counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiSwCountersShow(char* buf)
{
	MV_STATUS       status;
	S_EponIoctlSwPm swCounters[EPON_MAX_MAC_NUM];
	int             macId;
	int             off = 0;

	for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) {
		status = onuEponApiSwPmGet(&swCounters[macId], infoEponCntReadClearInd, macId);
		if (status != MV_OK) {
			off += mvOsSPrintf(buf+off, "Failed read Sw pm information!!!\n");
			return(off);
		}
	}

	off += mvOsSPrintf(buf+off, "\n");
	off += mvOsSPrintf(buf+off, "Sw Counters\n");
	off += mvOsSPrintf(buf+off, "----------------------------------------------------------------------------\n");
	off += mvOsSPrintf(buf+off, "     Total    Total    Total    Total    Total    Total    Total    Total   \n");
	off += mvOsSPrintf(buf+off, "     MPC Tx   MPC Tx   MPC Rx   MPC Rx   MPC Reg  MPC Reg  MPC Reg  MPC Reg \n");
	off += mvOsSPrintf(buf+off, "     Frames   Error    Frames   Error    Ack      Nack     De-Reg   Re-Reg  \n");
	off += mvOsSPrintf(buf+off, " MAC          Frames            Frames   Frames   Frames   Frames   Frames  \n");
	off += mvOsSPrintf(buf+off, "----------------------------------------------------------------------------\n");

	for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) {
		off += mvOsSPrintf(buf+off, "[%02d] %8u %8u %8u %8u %8u %8u %8u %8u\n",
						   macId,
						   swCounters[macId].swTxCnt[TOTAL_MPCP_TX_FRAME_CNT],
						   swCounters[macId].swTxCnt[TOTAL_MPCP_TX_ERROR_FRAME_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_RX_FRAME_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_RX_ERROR_FRAME_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_REGISTER_ACK_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_REGISTER_NACK_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_REGISTER_DEREG_FRAME_CNT],
						   swCounters[macId].swRxCnt[TOTAL_MPCP_REGISTER_REREG_FRAME_CNT]);
	}
	off += mvOsSPrintf(buf+off, "----------------------------------------------------------------------------\n");

	return(off);
}

/*******************************************************************************
**
**  onuEponUiGpmCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print onu gpm counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiGpmCountersShow(char* buf)
{
  MV_STATUS        status;
  S_EponIoctlGpmPm gpmCounters[EPON_MAX_MAC_NUM];
  int              macId;
  int              off = 0;

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
    status = onuEponApiGpmPmGet(&gpmCounters[macId], infoEponCntReadClearInd, macId);
    if (status != MV_OK)
    {
      off += mvOsSPrintf(buf+off, "Failed read Gpm pm information!!!\n");
      return(off);
    }
  }

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "GPM Counters\n");
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "     Valid    Grant    Min Proc Length   Discover Fifo    \n");
  off += mvOsSPrintf(buf+off, "     Grant    Max Time Time     Error    And      Full    \n");
  off += mvOsSPrintf(buf+off, " MAC          Error    Error             Register Error   \n");
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
     off += mvOsSPrintf(buf+off, "[%02d] %8u %8u %8u %8u %8u %8u\n",
                        macId,
                        gpmCounters[macId].grantValidCnt,
                        gpmCounters[macId].grantMaxFutureTimeErrorCnt,
                        gpmCounters[macId].minProcTimeErrorCnt,
                        gpmCounters[macId].lengthErrorCnt,
                        gpmCounters[macId].discoveryAndRegCnt,
                        gpmCounters[macId].fifoFullErrorCnt);
  }
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "     OPC      OPC      OPC      OPC      OPC      OPC     \n");
  off += mvOsSPrintf(buf+off, "     Discover Register Discover Drop     Hidden   Back to \n");
  off += mvOsSPrintf(buf+off, "     Not      Not      Not      Grant    Grant    Back    \n");
  off += mvOsSPrintf(buf+off, "     Register Discover Register                           \n");
  off += mvOsSPrintf(buf+off, "     Bcast             Or Bcast                           \n");
  off += mvOsSPrintf(buf+off, " MAC                                                      \n");
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n");


  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++)
  {
     off += mvOsSPrintf(buf+off, "[%02d] %8u %8u %8u %8u %8u %8u\n",
                        macId,
                        gpmCounters[macId].opcDiscoveryNotRegBcastCnt,
                        gpmCounters[macId].opcRegisterNotDiscoveryCnt,
                        gpmCounters[macId].opcDiscoveryNotRegNotBcastCnt,
                        gpmCounters[macId].opcDropGrantCnt,
                        gpmCounters[macId].opcHiddenGrantCnt,
                        gpmCounters[macId].opcBackToBackCnt);
  }
  off += mvOsSPrintf(buf+off, "----------------------------------------------------------\n\r");

  return(off);
}

/*******************************************************************************
**
**  onuEponUiAllCountersShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print all onu counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiAllCountersShow(char* buf)
{
	int              off = 0;

	off += onuEponUiRxCountersShow(buf);
	off += onuEponUiTxCountersShow(buf+off);
	off += onuEponUiSwCountersShow(buf+off);
	off += onuEponUiGpmCountersShow(buf+off);

	return(off);
}

/*******************************************************************************
**
**  onuEponUiPmHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print pm help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiPmHelpShow(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]               > cntRdClrState - onu counters flag, Read[0], "
												"Read Clear[1]\n");
	off += mvOsSPrintf(buf+off, " echo [llid][Queue][#Bytes] > addDbaBytesPerLlidQueue - add bytes per LLID "
												"/ Queue\n");
	off += mvOsSPrintf(buf+off, " echo [llid][#Bytes]        > addDbaBytesPerLlidFifo - add bytes per LLID FIFO\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 rxCnt                    - dump Rx counters\n");
	off += mvOsSPrintf(buf+off, " cat txCnt                    - dump Tx counters\n");
	off += mvOsSPrintf(buf+off, " cat swCnt                    - dump Sw counters\n");
	off += mvOsSPrintf(buf+off, " cat gpmCnt                   - dump GPM counters\n");
	off += mvOsSPrintf(buf+off, " cat allCnt                   - dump All counters\n");
	off += mvOsSPrintf(buf+off, " cat showDbaBytesPerLlidQueue - dump byres addition per LLID / Queue\n");
	off += mvOsSPrintf(buf+off, " cat showDbaBytesPerLlidFifo  - dump byres addition per LLID FIFO\n");
	off += mvOsSPrintf(buf+off, " cat showRandom               - dump random generator counters\n");
	off += mvOsSPrintf(buf+off, " cat showPcsStat              - dump accumulates PCS statistics counters\n");
	off += mvOsSPrintf(buf+off, "============================================================================\n");

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCountersReadClearFlag
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu clear counters flag
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCountersReadClearFlag(MV_BOOL clear)
{
	infoEponCntReadClearInd = clear;
}

/*******************************************************************************
**
**  onuEponUiAddLlidQueueBytes
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function add bytes for LLID queue for DBA report
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiAddLlidQueueBytes(MV_U32 llId, MV_U32 queueId, MV_U32 counter)
{
  onuEponPmDbaAddBytePerLlidAndQueue(llId, queueId, counter);
}

/*******************************************************************************
**
**  onuEponUiAddLlidQueueBytes
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function show bytes added for LLID queue for DBA report
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiShowLlidQueueBytes(char* buf)
{
  MV_U32 llldIndex;
  MV_U32 queueIndex;
  MV_U32 counter;
  int off = 0;

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "Additional Bytes per Queue\n");
  off += mvOsSPrintf(buf+off, "---------------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "LLID Queue0   Queue1   Queue2   Queue3   Queue4   Queue5   Queue6   Queue7  \n");

  for (llldIndex = 0; llldIndex < EPON_MAX_MAC_NUM; llldIndex++)
  {
    off += mvOsSPrintf(buf+off, "[%02d]", llldIndex);

	for (queueIndex = 0; queueIndex < EPON_MAX_QUEUE; queueIndex++)
	{
	  counter = onuEponPmDbaAddBytePerLlidAndQueueGet(llldIndex, queueIndex);
	  off += mvOsSPrintf(buf+off, " %8u", counter);
	}
	off += mvOsSPrintf(buf+off, "\n");
  }

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

  return(off);
}

/*******************************************************************************
**
**  onuEponUiAddLlidFifoBytes
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function add bytes for LLID FIFO for DBA report
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiAddLlidFifoBytes(MV_U32 llId, MV_U32 counter)
{
  onuEponPmDbaAddBytePerLlidFifo(llId, counter);
}

/*******************************************************************************
**
**  onuEponUiShowLlidFifoBytes
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function show bytes added for queueset FIFO for DBA report
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiShowLlidFifoBytes(char* buf)
{
  MV_U32 llldIndex;
  MV_U32 counter;
  int off = 0;

  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "Additional Bytes per LLID FIFO\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------------------------------\n");
  off += mvOsSPrintf(buf+off, "LLID0     LLID1     LLID2     LLID3     LLID4     LLID5     LLID6     LLID7   \n");

  for (llldIndex = 0; llldIndex < EPON_MAX_MAC_NUM; llldIndex++)
  {
	counter = onuEponPmDbaAddBytePerLlidFifoGet(llldIndex);
	off += mvOsSPrintf(buf+off, "%8u  ", counter);
  }
  off += mvOsSPrintf(buf+off, "\n");
  off += mvOsSPrintf(buf+off, "------------------------------------------------------------------------------\n");

  return(off);
}

/*******************************************************************************
**
**  onuEponUiShowRandom
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function show random generation counters
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiShowRandom(char *buf)
{
	int off = 0;
	int i;
	MV_U32 randomShift = 0;
	MV_U32 randomRange = 0;

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

	off += mvOsSPrintf(buf+off, "------------------------------------------------------------------------------\n");
	off += mvOsSPrintf(buf+off, "onuEponPmRandomGet was called %d times ", g_OnuEponRandomCount);

	if (g_OnuEponRandomCount != 0) {
		off += mvOsSPrintf(buf+off, "and the following random values were generated:");
		for (i = 0; i < g_OnuEponRandomCount; i++) {
			if ((i % 4) == 0) /* 4 values in one row */
				off += mvOsSPrintf(buf+off, "\n");
			off += mvOsSPrintf(buf+off, "0x%08x\t", g_OnuEponRandomValues[i]);
		}
		off += mvOsSPrintf(buf+off, "\n");
		off += mvOsSPrintf(buf+off, "------------------------------------------------------------------------------\n");
		off += mvOsSPrintf(buf+off, "The same random values after processing:");
		for (i = 0; i < g_OnuEponRandomCount; i++) {
			if ((i % 4) == 0) /* 4 values in one row */
				off += mvOsSPrintf(buf+off, "\n");

			randomShift = ((g_OnuEponRandomValues[i] >> 16) & 0xF);
			randomRange = ((g_OnuEponRandomValues[i] >> randomShift) & regRandomMaskThreshold);
			off += mvOsSPrintf(buf+off, "%04d\t", randomRange);
		}
		off += mvOsSPrintf(buf+off, "\n");
	} else
		off += mvOsSPrintf(buf+off, ", no random values were generated\n");

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

/*******************************************************************************
**
**  onuEponUiShowPcsStat
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function show PCS statistics
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiShowPcsStat(char *buf)
{
	S_PcsPm statCounters;
	int off = 0;

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

	onuEponPmPcsPmGet(&statCounters);

	off += mvOsSPrintf(buf+off, "Accumulated counter values in DB:\n");
	off += mvOsSPrintf(buf+off, "\n");
	off += mvOsSPrintf(buf+off, "legalFrameCnt                     0x%08x\n", statCounters.legalFrameCnt);
	off += mvOsSPrintf(buf+off, "maxFrameSizeErrCnt                0x%08x\n", statCounters.maxFrameSizeErrCnt);
	off += mvOsSPrintf(buf+off, "parityLenErrCnt                   0x%08x\n", statCounters.parityLenErrCnt);
	off += mvOsSPrintf(buf+off, "longGateErrCnt                    0x%08x\n", statCounters.longGateErrCnt);
	off += mvOsSPrintf(buf+off, "protocolErrCnt                    0x%08x\n", statCounters.protocolErrCnt);
	off += mvOsSPrintf(buf+off, "minFrameSizeErrCnt                0x%08x\n", statCounters.minFrameSizeErrCnt);
	off += mvOsSPrintf(buf+off, "legalFecFrameCnt                  0x%08x\n", statCounters.legalFecFrameCnt);
	off += mvOsSPrintf(buf+off, "legalNonFecFrameCnt               0x%08x\n", statCounters.legalNonFecFrameCnt);
	off += mvOsSPrintf(buf+off, "------------------------------------------------------------------------------\n");

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCfgHelpShow
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print cfg help
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     message length
**
*******************************************************************************/
int onuEponUiCfgHelpShow(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 [enable]        > rxEn            - onu RX enbale, Disable[0], Enable[1]\n");
	off += mvOsSPrintf(buf+off, " echo [enable][macId] > txEn            - onu mac TX enbale, Disable[0], Enable[1]\n");
	off += mvOsSPrintf(buf+off, " echo [enable]        > ctrlTimerEn     - control timer for  reception of MPCP "
										"/ GATES, Disable[0], Enable[1]\n");
	off += mvOsSPrintf(buf+off, " echo [interval]      > ctrlTimerVal    - control timer interval\n");
	off += mvOsSPrintf(buf+off, " echo [limit][mask]   > ctrlTimerRandom - control timer random reset, expire limit"
										" and expire duration\n");
	off += mvOsSPrintf(buf+off, " echo [enable][T0 val][T0 time][T1 val][T1 time]\n");
	off += mvOsSPrintf(buf+off, "                      > rprtTimerCfg - report dba timer config\n");
	off += mvOsSPrintf(buf+off, " echo [queue][Threshold][llid]\n");
	off += mvOsSPrintf(buf+off, "                      > dbaHwParamsCfg   - configuration of HW DBA queues "
										"(Max Threshold 0xFFFF)\n");
	off += mvOsSPrintf(buf+off, " echo [interval]      > dbaSwIntervalCfg - configure SW report interval\n");
	off += mvOsSPrintf(buf+off, " echo [#qset][qBitMap][T0][T1][T2]\n");
	off += mvOsSPrintf(buf+off, "                      > dbaSwParamsCfg   - simulate configuration of SW DBA "
										"queues for LLID 0\n");
	off += mvOsSPrintf(buf+off, " echo [qset][queue]   > dbaSwOptionCfg   - configure SW report direction [0]normal"
										" [1]reverse\n");
	off += mvOsSPrintf(buf+off, " echo [time][state]   > holdoverDebug    - simulate configuration of Holdover\n");
	off += mvOsSPrintf(buf+off, " echo [state]         > silenceMode      - Set Silence Mode\n");
	off += mvOsSPrintf(buf+off, " echo [state]         > silenceSim       - simulate Silence Mode\n");
	off += mvOsSPrintf(buf+off, " echo [dummy]         > dgDebug          - simulate reception of Dying Gasp "
										"Interrupt\n");
	off += mvOsSPrintf(buf+off, " echo [#Queue][Thresh]> dgCfg            - configure Dying Gasp DBA report\n");
	off += mvOsSPrintf(buf+off, " echo [module][Level][Options] > printMask - change printing options\n");
	off += mvOsSPrintf(buf+off, " echo [enable][pattern][burst][duration]\n");
	off += mvOsSPrintf(buf+off, "      [period]        > pattern          - start enable[1] or stop[0] transmission"
										" of pattern: 0x1-1T, 0x2-2T, 0x80-RPBS"
										"-9, 0x82-RPBS-15, 0x83-RPBS-23 in "
										"burst: 0-static, 1- periodic for "
										"duration: peac time interval"
										"[micro seconds] in period - full cicle"
										" time interval[micro seconds]\n");
	if (devId == MV_6601_DEV_ID) {
		off += mvOsSPrintf(buf+off, " echo [latency][size] > pcsFrameLimits   - Configure PCS Frame Size "
											"limits\n");
		off += mvOsSPrintf(buf+off, " echo [threshold]     > rxDataFifoThresh - Configure RX Parser Data FIFO "
											"threshold\n");
        off += mvOsSPrintf(buf+off, " echo [pkt2kSupported] > pkt2kEn - Configure 2K packet supported\r\n");
		off += mvOsSPrintf(buf+off, " echo [txMask][txP][serdesP][xvrP][burstEn] > ddmTxPolarity - Configure "
											" DDM Polarity settings\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 dbaSwCfgPrint                       - dump DBA cfg\n");
	if (devId == MV_6601_DEV_ID) {
		off += mvOsSPrintf(buf+off, " cat pcsFrameLimits                     - dump PCS Frame Size Limits\n");
		off += mvOsSPrintf(buf+off, " cat rxDataFifoThresh                   - dump RX Parser Data FIFO "
											"threshold\n");
        off += mvOsSPrintf(buf+off, " cat pkt2kEn                            - dump 2K packet supported registers\r\n");
	}
	off += mvOsSPrintf(buf+off, "============================================================================\n");

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCountersReadClearFlag
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu RX enable
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgMacRxEn(MV_U32 enable)
{
  mvOnuEponMacOnuRxEnableSet(enable);
}

/*******************************************************************************
**
**  onuEponUiCfgMacTxEn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu mac TX enable
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgMacTxEn(MV_U32 enable, MV_U32 macId)
{
	onuEponMiCfgMacTxEn(enable, macId);
}

/*******************************************************************************
**
**  onuEponUiCfgMpcpTimerEn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu mac MPCP timer enable
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgMpcpTimerEn(MV_U32 enable)
{
  onuEponIsrTimerMpcpStateSet((enable == 1) ? (MV_TRUE) : (MV_FALSE));
}

/*******************************************************************************
**
**  onuEponUiCfgMpcpTimerVal
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu mac MPCP timer enable
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgMpcpTimerVal(MV_U32 value)
{
  onuEponIsrTimerMpcpIntervalSet(value);
}

/*******************************************************************************
**
**  onuEponUiCfgMpcpTimerRandom
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu mac MPCP timer random reset
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgMpcpTimerRandom(MV_U32 limit, MV_U32 mask)
{
  onuEponIsrTimerMpcpRandomResetSet(limit, mask);
}

/*******************************************************************************
**
**  onuEponUiCfgRprtTimerEn
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config onu periodic report message transmit
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgRprtTimerEn(MV_U32 enable, MV_U32 t0_val, MV_U32 t0_time, MV_U32 t1_val, MV_U32 t1_time)
{
  onuEponIsrTimerHwReportStateSet(((enable == 1) ? (MV_TRUE) : (MV_FALSE)),
							   	  t0_val, t0_time, t1_val, t1_time);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaHwDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure HW DBA queues thresholds for LLID 0
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDbaHwDebug(MV_U32 queueId, MV_U32 threshold, MV_U32 llid)
{
  mvOnuEponMacTxmCppReportQueueX(queueId, (threshold / 64), llid);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaSwRprtDir
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure DBA SW report direction [0]Normal [1]Reverse
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDbaSwRprtDir(MV_U32 queueSetDir, MV_U32 queueDir)
{
  onuEponDbOnuDbaSwModeQueuesetDirSet(queueSetDir);
  onuEponDbOnuDbaSwModeQueueDirSet(queueDir);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaSwDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function simulate configuration of DBA queues for LLID 0
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDbaSwDebug(MV_U32 queueSet, MV_U32 queueBitMap,
						    MV_U32 queueSet0, MV_U32 queueSet1, MV_U32 queueSet2, MV_U32 queueSet3)
{
  MV_U32         idx;
  MV_U32         qsetidx;
  MV_U32         numOfQueues = 0;
  S_EponIoctlDba ioctlDba;

  memset (&ioctlDba, 0, sizeof(S_EponIoctlDba));

  for (qsetidx = 0; qsetidx < queueSet; qsetidx++)
  {
	for (idx = 0; idx < EPON_MAX_QUEUE; idx++)
	{
	  if (queueBitMap & (1 << idx))
	  {
		if (qsetidx == 0)
		{
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].state     = 1;
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].threshold = queueSet0;
		}
		else if (qsetidx == 1)
		{
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].state     = 1;
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].threshold = queueSet1;
		}
		else if (qsetidx == 2)
		{
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].state     = 1;
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].threshold = queueSet2;
		}
		else if (qsetidx == 3)
		{
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].state     = 1;
			ioctlDba.dbaLlid[0].threshold[qsetidx][idx].threshold = queueSet3;
		}

		if (qsetidx == 0) numOfQueues++;
	  }
	}
  }

  ioctlDba.validLlid[0]              = 1;
  ioctlDba.dbaLlid[0].numOfQueueSets = queueSet;
  ioctlDba.dbaLlid[0].numOfQueues    = numOfQueues;

  onuEponMiDbaConfig(&ioctlDba);
}

/*******************************************************************************
**
**  onuEponUiCfgDgCfg
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure DG DBA report
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDgCfg(MV_U32 numOfQueue, MV_U32 queueReport)
{
  onuEponPonMngDbaDgSwRprtCfg(numOfQueue, queueReport);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaSwInterval
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configure Sw DBA interval
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDbaSwInterval(MV_U32 interval)
{
  onuEponDbOnuSwRprtMacTimerIntervalSet(interval);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaCfgPrint
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print configuration of DBA queues for LLID 0
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiCfgDbaCfgPrint(char* buf)
{
  MV_U32 llidIdx;
  MV_U32 queueSetIdx;
  MV_U32 queueIdx;
  MV_U32 threshold;
  MV_U32 state;
  MV_U32 numOfQueueSets;
  MV_U32 numOfQueues;
  int off = 0;

  for (llidIdx = 0; llidIdx < EPON_MAX_MAC_NUM; llidIdx++)
  {
    if (onuEponDbOnuDbaLlidActiveStatusGet(llidIdx) == ONU_DBA_ACTIVE_LLID)
    {
      numOfQueueSets = onuEponDbOnuDbaNumOfQueuesetGet(llidIdx);
      numOfQueues    = onuEponDbOnuDbaNumOfQueuesGet(llidIdx);

  	  off += mvOsSPrintf(buf+off, "LLID[%d]: #Queuesets = (%d), #Queues = (%d)\n",
  			             llidIdx, numOfQueueSets, numOfQueues);

      for (queueSetIdx = 0; queueSetIdx < numOfQueueSets; queueSetIdx++)
      {
        off += mvOsSPrintf(buf+off, "Queueset[%d]: Queues:", queueSetIdx);

        /* Queue Id */
        /* ======== */
        for (queueIdx = 0; queueIdx < EPON_MAX_QUEUE; queueIdx++)
        {
      	  onuEponDbOnuDbaQueueThresholdGet(&threshold, &state, queueIdx, queueSetIdx, llidIdx);

      	  off += mvOsSPrintf(buf+off, " [%d-%3s-0x%04x]",
                             queueIdx, ((state == 0) ? "off" : "on"), ((state == 0) ? 0 : threshold));
        }

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

  return(off);
}

/*******************************************************************************
**
**  onuEponUiCfgDbaStaticCfgPrint
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function print static configuration of DBA info
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiCfgDbaStaticCfgPrint(char* buf)
{
  MV_U32 llidIdx;
  MV_U32 queueSetIdx;
  MV_U32 queueIdx;
  MV_U32 threshold;
  MV_U32 state;
  MV_U32 numOfQueueSets;
  MV_U32 numOfQueues;
  int off = 0;

  for (llidIdx = 0; llidIdx < EPON_MAX_MAC_NUM; llidIdx++)
  {
    if (onuEponDbOnuDbaLlidActiveStatusGet(llidIdx) == ONU_DBA_ACTIVE_LLID)
    {
      numOfQueueSets = onuEponDbOnuDbaNumOfQueuesetGet(llidIdx);
      numOfQueues    = onuEponDbOnuDbaNumOfQueuesGet(llidIdx);

  	  off += mvOsSPrintf(buf+off, "LLID[%d]: #Queuesets = (%d), #Queues = (%d)\n",
  			             llidIdx, numOfQueueSets, numOfQueues);

      for (queueSetIdx = 0; queueSetIdx < numOfQueueSets; queueSetIdx++)
      {
        off += mvOsSPrintf(buf+off, "Queueset[%d]: Queues:", queueSetIdx);

        /* Queue Id */
        /* ======== */
        for (queueIdx = 0; queueIdx < EPON_MAX_QUEUE; queueIdx++)
        {
      	  onuEponDbOnuDbaQueueThresholdGet(&threshold, &state, queueIdx, queueSetIdx, llidIdx);

      	  off += mvOsSPrintf(buf+off, " [%d-%3s-0x%04x]",
                             queueIdx, ((state == 0) ? "off" : "on"), ((state == 0) ? 0 : threshold));
        }

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

  return(off);
}



/*******************************************************************************
**
**  onuEponUiCfgHoldoverDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function simulate configuration of Holdover
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgHoldoverDebug(MV_U32 time, MV_U32 state)
{
  S_EponIoctlHoldOver ioctlHoldover;

  ioctlHoldover.holdoverState = state;
  ioctlHoldover.holdoverTime  = time;

  onuEponMiHoldoverConfig(&ioctlHoldover);
}

/*******************************************************************************
**
**  onuEponUiCfgSilenceModeDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function simulate configuration of Silence
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSilenceModeDebug(MV_U32 state)
{
  S_EponIoctlSilence ioctlSilence;

  ioctlSilence.silenceState = state;

  onuEponMiSilenceConfig(&ioctlSilence);
}

/*******************************************************************************
**
**  onuEponUiCfgSilenceSimDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function simulate configuration of Silence
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSilenceSimDebug(void)
{
  MV_STATUS status;
  S_EponIoctlSilence ioctlSilence;

  ioctlSilence.silenceState = 1;

  onuEponMiSilenceConfig(&ioctlSilence);

  status  = mvOnuEponMacGenOnuConfigAutoAckSet(0);
  status |= mvOnuEponMacGenOnuConfigAutoRequestSet(0);
  if (status != MV_OK)
  {
	mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE,
			   "ERROR: (%s:%d) Failed to disable auto request / ack\n\r", __FILE_DESC__, __LINE__);
	return;
  }

  onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonSilenceTimerId[0]), 0, ONU_PON_TIMER_SILENCE_INTERVAL, 1);
}

/*******************************************************************************
**
**  onuEponUiCfgSilenceDebug
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function simulate reception of DG interrupt
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgDgDebug(MV_U32 dummy)
{
  mvOnuPonMacDgInterruptDis();
  onuPonDyingGaspProcess();
  onuEponDgIsrRoutine();
}

/*******************************************************************************
**
**  onuEponUiCfgSetPatternBurst
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function config start/stop onu transmission of pattern burst
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSetPatternBurst(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);
  }
}

/*******************************************************************************
**
**  onuEponUiCfgSetPcsFrameLimits
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures PCS Frame Limits
**
**  PARAMETERS:  MV_U32 latency - FED decoder latency in unit of clock cycles
**               MV_U32 size    - Maximum frame size
**
**  OUTPUTS:     none
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSetPcsFrameLimits(MV_U32 latency, MV_U32 size)
{
	mvOnuEponMacPcsFrameSizeLimitsSet(size, latency);
}

/*******************************************************************************
**
**  onuEponUiCfgShowPcsFrameLimits
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function shows PCS Frame Limits
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiCfgShowPcsFrameLimits(char* buf)
{
	int off = 0;
	MV_STATUS status;
	MV_U32 size,latency;

	status = mvOnuEponMacPcsFrameSizeLimitsGet(&size, &latency);

	if (status != MV_OK)
		off += mvOsSPrintf(buf+off, "Failed to obtain PCS Frame Limits!\n");
	else {
		off += mvOsSPrintf(buf+off, "\n");
		off += mvOsSPrintf(buf+off, "FEC Decoder Latency = %#x\n", latency);
		off += mvOsSPrintf(buf+off, "Maximum Frame Size  = %#x\n", size);
	}

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCfgSetRxDataFifoThresh
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures RX Parser Data FIFO Threshold
**
**  PARAMETERS:  MV_U32 threshold - RX Data FIFO MAX allowed capacity
**
**  OUTPUTS:     none
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSetRxDataFifoThresh(MV_U32 threshold)
{
	mvOnuEponMacRxpDataFifoThresholdSet(threshold);
}

/*******************************************************************************
**
**  onuEponUiCfgShowRxDataFifoThresh
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function shows RX Parser Data FIFO Threshold
**
**  PARAMETERS:  char* buf
**
**  OUTPUTS:     char* buf
**
**  RETURNS:     void
**
*******************************************************************************/
int onuEponUiCfgShowRxDataFifoThresh(char* buf)
{
	int off = 0;
	MV_STATUS status;
	MV_U32 threshold;

	status = mvOnuEponMacRxpDataFifoThresholdGet(&threshold);

	if (status != MV_OK)
		off += mvOsSPrintf(buf+off, "Failed to obtain RX Parser Data FIFO Threshold!\n");
	else {
		off += mvOsSPrintf(buf+off, "\n");
		off += mvOsSPrintf(buf+off, "RX Parser Data FIFO Threshold = %#x\n", threshold);
	}

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCfgSetPkt2kEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures 2K packet supported
**
**  PARAMETERS:  MV_U32 enable - 2K packet supported enable or disable
**
**  OUTPUTS:     none
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSetPkt2kEnable(MV_U32 enable)
{
    /* Before setting register, needs to disable Rx */
    mvOnuEponMacPcsRxEnableSet(EPON_PCS_CONFIG_RX_DISABLE); 
    
    mvEponApi2kSupportedSet(enable);

    /* After setting register, enable Rx */
    mvOnuEponMacPcsRxEnableSet(EPON_PCS_CONFIG_RX_ENABLE);
}

/*******************************************************************************
**
**  onuEponUiCfgShowPkt2kEnable
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function shows 2K packet supported
**
**  PARAMETERS:  char *buf
**
**  OUTPUTS:     char *buf
**
**  RETURNS:     offset of buf
**
*******************************************************************************/
int onuEponUiCfgShowPkt2kEnable(char* buf)
{
    int off = 0;
	MV_STATUS status;
	MV_U32 frameSizeLimitSize;
    MV_U32 frameSizeLimitLatency;
    MV_U32 dataFifoThreshold;

    status = mvOnuEponMacPcsFrameSizeLimitsGet(&frameSizeLimitSize, &frameSizeLimitLatency);
	status |= mvOnuEponMacRxpDataFifoThresholdGet(&dataFifoThreshold);

	if (status != MV_OK)
		off += mvOsSPrintf(buf+off, "Failed to obtain 2K packet support related register value!\r\n");
	else {
		off += mvOsSPrintf(buf+off, "\r\n");
		off += mvOsSPrintf(buf+off, "PcsFrameSizeLimitSize    = %#d\r\n", frameSizeLimitSize);
        off += mvOsSPrintf(buf+off, "PcsFrameSizeLimitLatency = %#d\r\n", frameSizeLimitLatency);
        off += mvOsSPrintf(buf+off, "DataFifoThreshold        = %#d\r\n", dataFifoThreshold);
	}

	return(off);
}

/*******************************************************************************
**
**  onuEponUiCfgSetDdmTxPolarity
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function configures DDM TX polarity
**
**  PARAMETERS:  MV_U32 txEnable
**               MV_U32 txPol
**               MV_U32 serdesPol
**               MV_U32 xvrPol
**               MV_U32 burstEn
**
**  OUTPUTS:     none
**
**  RETURNS:     void
**
*******************************************************************************/
void onuEponUiCfgSetDdmTxPolarity(MV_U32 txEnable, MV_U32 txPol, MV_U32 serdesPol, MV_U32 xvrPol, MV_U32 burstEn)
{
#if (!defined PON_Z1) && (!defined PON_Z2)
	mvOnuEponMacDdmTxPolaritySet(txEnable, txPol, serdesPol, xvrPol, burstEn);
#endif
}


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

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

/* ========================================================================== */
/*                            Info Commands                                   */
/* ========================================================================== */
static ssize_t epon_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, "infoEpon"))
  	return(onuEponUiInfoShow(buf));
  else if (!strcmp(name, "alarmEpon"))
    return(onuEponUiAlarmShow(buf));
  else if (!strcmp(name, "helpEInfo"))
    return(onuEponUiInfoHelpShow(buf));

  return 0;
}

static ssize_t epon_info_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, "%x %x %x", &param1, &param2, &param3);

  raw_local_irq_save(flags);

  if      (!strcmp(name, "readRegEpon"))
    onuEponUiDebugReadReg((MV_U32)param1, (MV_U32)param2);                     /* readOffset, readEntry */
  else if (!strcmp(name, "writeRegEpon"))
    onuEponUiDebugWriteReg((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);    /*  writeOffset, writeEntry, regValue */
  else
    printk("%s: illegal operation <%s>\n", __FUNCTION__, attr->attr.name);

  raw_local_irq_restore(flags);

  return(len);
}

/* ========================================================================== */
/*                            Info Attributes                                 */
/* ========================================================================== */
static DEVICE_ATTR(infoEpon,     S_IRUSR, epon_info_show, epon_info_store);
static DEVICE_ATTR(alarmEpon,    S_IRUSR, epon_info_show, epon_info_store);
static DEVICE_ATTR(helpEInfo,    S_IRUSR, epon_info_show, epon_info_store);
static DEVICE_ATTR(readRegEpon,  S_IWUSR, epon_info_show, epon_info_store);
static DEVICE_ATTR(writeRegEpon, S_IWUSR, epon_info_show, epon_info_store);

static struct attribute *epon_info_attrs[] = {
	&dev_attr_infoEpon.attr,
	&dev_attr_alarmEpon.attr,
    &dev_attr_readRegEpon.attr,
    &dev_attr_writeRegEpon.attr,
    &dev_attr_helpEInfo.attr,
	NULL
};

static struct attribute_group epon_info_group =
{
  .name = "info",
  .attrs = epon_info_attrs,
};

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

/* ========================================================================== */
/*                            Pm Commands                                     */
/* ========================================================================== */
static ssize_t epon_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, "rxCnt"))
		return(onuEponUiRxCountersShow(buf));
	else if (!strcmp(name, "txCnt"))
		return(onuEponUiTxCountersShow(buf));
	else if (!strcmp(name, "swCnt"))
		return(onuEponUiSwCountersShow(buf));
	else if (!strcmp(name, "gpmCnt"))
		return(onuEponUiGpmCountersShow(buf));
	else if (!strcmp(name, "allCnt"))
		return(onuEponUiAllCountersShow(buf));
	else if (!strcmp(name, "showDbaBytesPerLlidQueue"))
		return(onuEponUiShowLlidQueueBytes(buf));
	else if (!strcmp(name, "showDbaBytesPerLlidFifo"))
		return(onuEponUiShowLlidFifoBytes(buf));
	else if (!strcmp(name, "showRandom"))
		return(onuEponUiShowRandom(buf));
	else if (!strcmp(name, "showPcsStat"))
		return(onuEponUiShowPcsStat(buf));
	else if (!strcmp(name, "helpPm"))
		return(onuEponUiPmHelpShow(buf));

	return 0;
}

static ssize_t epon_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  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, "cntRdClrState"))
		onuEponUiCountersReadClearFlag((MV_BOOL)param1);
	else if (!strcmp(name, "addDbaBytesPerLlidQueue"))
		onuEponUiAddLlidQueueBytes(param1, param2, param3);
	else if (!strcmp(name, "addDbaBytesPerLlidFifo"))
		onuEponUiAddLlidFifoBytes(param1, param2);
	else
		printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);

	raw_local_irq_restore(flags);

  return(len);
}

/* ========================================================================== */
/*                            PM Attributes                                   */
/* ========================================================================== */
static DEVICE_ATTR(rxCnt,                    S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(txCnt,                    S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(swCnt,                    S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(gpmCnt,                   S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(allCnt,                   S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(showDbaBytesPerLlidQueue, S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(addDbaBytesPerLlidQueue,  S_IWUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(showDbaBytesPerLlidFifo,  S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(addDbaBytesPerLlidFifo,   S_IWUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(cntRdClrState,            S_IWUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(showRandom,               S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(showPcsStat,              S_IRUSR, epon_pm_show, epon_pm_store);
static DEVICE_ATTR(helpPm,                   S_IRUSR, epon_pm_show, epon_pm_store);


static struct attribute *epon_pm_attrs[] = {
	&dev_attr_rxCnt.attr,
	&dev_attr_txCnt.attr,
	&dev_attr_swCnt.attr,
	&dev_attr_gpmCnt.attr,
	&dev_attr_allCnt.attr,
	&dev_attr_showDbaBytesPerLlidQueue.attr,
	&dev_attr_addDbaBytesPerLlidQueue.attr,
	&dev_attr_showDbaBytesPerLlidFifo.attr,
	&dev_attr_addDbaBytesPerLlidFifo.attr,
	&dev_attr_cntRdClrState.attr,
	&dev_attr_showRandom.attr,
	&dev_attr_showPcsStat.attr,
	&dev_attr_helpPm.attr,
	NULL
};

static struct attribute_group epon_pm_group =
{
  .name = "pm",
  .attrs = epon_pm_attrs,
};


/******************************************************************************/
/* ========================================================================== */
/*                            Cfg Group                                       */
/* ========================================================================== */
/******************************************************************************/

/* ========================================================================== */
/*                            Cfg Commands                                    */
/* ========================================================================== */
static ssize_t cfg_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, "printMask"))
		return ponOnuPrintStatus(buf);
	else if (!strcmp(name, "dbaSwCfgPrint"))
		return(onuEponUiCfgDbaCfgPrint(buf));
	else if (!strcmp(name, "dbaStaticCfgPrint"))
		return(onuEponUiCfgDbaStaticCfgPrint(buf));
	else if (!strcmp(name, "helpCfg"))
		return(onuEponUiCfgHelpShow(buf));
	else if (devId == MV_6601_DEV_ID) {
		if (!strcmp(name, "pcsFrameLimits"))
			return(onuEponUiCfgShowPcsFrameLimits(buf));
		else if (!strcmp(name, "rxDataFifoThresh"))
			return(onuEponUiCfgShowRxDataFifoThresh(buf));
        else if (!strcmp(name, "pkt2kEn"))
        {
            return onuEponUiCfgShowPkt2kEnable(buf);
        }
            
	}

	return 0;
}


static ssize_t cfg_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;
	unsigned int  param6 = 0;
	MV_U32 devId = mvCtrlModelGet();

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

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

	raw_local_irq_save(flags);

	if (!strcmp(name, "rxEn"))
		onuEponUiCfgMacRxEn((MV_U32)param1);
	else if (!strcmp(name, "txEn"))
		onuEponUiCfgMacTxEn((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "ctrlTimerEn"))
		onuEponUiCfgMpcpTimerEn((MV_U32)param1);
	else if (!strcmp(name, "ctrlTimerVal"))
		onuEponUiCfgMpcpTimerVal((MV_U32)param1);
	else if (!strcmp(name, "ctrlTimerRandom"))
		onuEponUiCfgMpcpTimerRandom((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "rprtTimerCfg"))
		onuEponUiCfgRprtTimerEn((MV_U32)param1, (MV_U32)param2, (MV_U32)param3, (MV_U32)param4, (MV_U32)param5);
	else if (!strcmp(name, "dbaHwParamsCfg"))
		onuEponUiCfgDbaHwDebug((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);
	else if (!strcmp(name, "dbaSwIntervalCfg"))
		onuEponUiCfgDbaSwInterval((MV_U32)param1);
	else if (!strcmp(name, "dbaSwParamsCfg"))
		onuEponUiCfgDbaSwDebug((MV_U32)param1, (MV_U32)param2, (MV_U32)param3, (MV_U32)param4,
				       (MV_U32)param5, (MV_U32)param6);
	else if (!strcmp(name, "dbaSwOptionCfg"))
		onuEponUiCfgDbaSwRprtDir((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "holdoverDebug"))
		onuEponUiCfgHoldoverDebug((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "silenceMode"))
		onuEponUiCfgSilenceModeDebug((MV_U32)param1);
	else if (!strcmp(name, "silenceSim"))
		onuEponUiCfgSilenceSimDebug();
	else if (!strcmp(name, "dgDebug"))
		onuEponUiCfgDgDebug((MV_U32)param1);
	else if (!strcmp(name, "dgCfg"))
		onuEponUiCfgDgCfg((MV_U32)param1, (MV_U32)param2);
	else if (!strcmp(name, "printMask"))					/* module, print level, options */
		ponOnuChangePrintStatus((MV_U32)param1, (MV_U32)param2, (MV_U32)param3);
	else if (!strcmp(name, "pattern"))
		onuEponUiCfgSetPatternBurst((MV_U32)param1,(MV_U32)param2,(MV_U32)param3,(MV_U32)param4,(MV_U32)param5);
	else if (devId == MV_6601_DEV_ID) {
		if (!strcmp(name, "pcsFrameLimits"))
			onuEponUiCfgSetPcsFrameLimits((MV_U32)param1, (MV_U32)param2);
		else if (!strcmp(name, "rxDataFifoThresh"))
			onuEponUiCfgSetRxDataFifoThresh((MV_U32)param1);
        else if (!strcmp(name, "pkt2kEn"))
        {
            onuEponUiCfgSetPkt2kEnable((MV_U32)param1);
        }
		else if (!strcmp(name, "ddmTxPolarity")) /* txEnable, txPol, serdesPol, xvrPol, burstEn */
			onuEponUiCfgSetDdmTxPolarity((MV_U32)param1,(MV_U32)param2,(MV_U32)param3,
						     (MV_U32)param4,(MV_U32)param5);
		else
			printk(KERN_ERR "%s: illegal operation <%s>\n", __func__, attr->attr.name);
	} else
		printk("%s: illegal operation <%s>\n", __func__, attr->attr.name);

	raw_local_irq_restore(flags);

	return(len);
}

/* ========================================================================== */
/*                            Cfg Attributes                                  */
/* ========================================================================== */
static DEVICE_ATTR(rxEn,                    S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(txEn,                    S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(ctrlTimerEn,             S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(ctrlTimerVal,            S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(ctrlTimerRandom,         S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(rprtTimerCfg,            S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaHwParamsCfg,          S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaSwIntervalCfg,        S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaSwParamsCfg,          S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaSwOptionCfg,          S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaSwCfgPrint,           S_IRUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dbaStaticCfgPrint,       S_IRUSR, cfg_show, cfg_store);
static DEVICE_ATTR(holdoverDebug,           S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(silenceMode,             S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(silenceSim,              S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dgDebug,                 S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(dgCfg,                   S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(pattern,                 S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(printMask,               S_IRUSR | S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(pcsFrameLimits,          S_IWUSR | S_IRUSR, cfg_show, cfg_store);
static DEVICE_ATTR(rxDataFifoThresh,        S_IWUSR | S_IRUSR, cfg_show, cfg_store);
static DEVICE_ATTR(ddmTxPolarity,           S_IWUSR, cfg_show, cfg_store);
static DEVICE_ATTR(pkt2kEn,                 S_IWUSR | S_IRUSR, cfg_show, cfg_store);
static DEVICE_ATTR(helpCfg,                 S_IRUSR, cfg_show, cfg_store);
 
static struct attribute *cfg_attrs[] = {
	&dev_attr_rxEn.attr,
	&dev_attr_txEn.attr,
	&dev_attr_ctrlTimerEn.attr,
	&dev_attr_ctrlTimerVal.attr,
	&dev_attr_ctrlTimerRandom.attr,
	&dev_attr_rprtTimerCfg.attr,
	&dev_attr_dbaHwParamsCfg.attr,
	&dev_attr_dbaSwIntervalCfg.attr,
	&dev_attr_dbaSwParamsCfg.attr,
	&dev_attr_dbaSwOptionCfg.attr,
	&dev_attr_dbaSwCfgPrint.attr,
	&dev_attr_dbaStaticCfgPrint.attr,
	&dev_attr_holdoverDebug.attr,
	&dev_attr_silenceMode.attr,
	&dev_attr_silenceSim.attr,
	&dev_attr_dgDebug.attr,
	&dev_attr_dgCfg.attr,
	&dev_attr_pattern.attr,
	&dev_attr_printMask.attr,
	&dev_attr_pcsFrameLimits.attr,
	&dev_attr_rxDataFifoThresh.attr, 
	&dev_attr_ddmTxPolarity.attr,
	&dev_attr_pkt2kEn.attr, 
	&dev_attr_helpCfg.attr,
	NULL
};

static struct attribute_group cfg_group =
{
  .name = "cfg",
  .attrs = cfg_attrs,
};

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

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

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

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

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

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

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

void epon_sysfs_delete(void)
{
  struct device *pd;

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

  sysfs_remove_group(&pd->kobj, &epon_info_group);
  sysfs_remove_group(&pd->kobj, &epon_pm_group);
  sysfs_remove_group(&pd->kobj, &cfg_group);

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


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

  return(MV_OK);
}

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

  return(MV_OK);
}





