Exemplo n.º 1
0
/*******************************************************************************
**
**  onuEponSetup
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function execute onu setup init sequence
**               
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**               MV_ERROR
**                   
*******************************************************************************/
MV_STATUS onuEponSetup(void)
{
  MV_STATUS rcode;

  /* init onu base address */
  rcode = onuEponGlbAddrInit();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) Failed to init onu base address\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* init onu database */
  rcode = onuEponDbInit();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) Failed to init onu database\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* init onu Asic */
  rcode = onuEponAsicInit();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) Failed to init asic\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  return(MV_OK);
}
Exemplo n.º 2
0
/*******************************************************************************
**
**  onuEponIrqRegister
**  ____________________________________________________________________________
**
**  DESCRIPTION: EPON Interrupt register
**               
**  PARAMETERS:  none
** 
**  OUTPUTS:     none
**                               
**  RETURNS:     EPON Interrupt number
**
*******************************************************************************/
MV_STATUS onuEponIrqRegister(S_onuPonIrq *irqId)
{
  int rcode;

  rcode = request_irq(irqId->onuPonIrqNum, onuEponIrqRoutine, IRQF_DISABLED, "mvEpon", (void*)irqId);
  if (rcode) 
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) epon interrupt register\n", __FILE_DESC__, __LINE__);
    free_irq(irqId->onuPonIrqNum, NULL);
    return(MV_ERROR);
  }

#ifndef PON_FPGA
  rcode = request_irq(irqId->onuDgIrqNum, onuEponDgIrqRoutine, IRQF_DISABLED, "mvDyGasp", (void*)irqId);
  if (rcode) 
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) EPON Dying Gasp interrupt register\n", __FILE_DESC__, __LINE__);
    free_irq(irqId->onuDgIrqNum, NULL);
    return(MV_ERROR);
  }
#endif /* PON_FPGA */

  return(MV_OK);
}
Exemplo n.º 3
0
/*******************************************************************************
**
**  onuGponPonMngPloamProcess
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function Hadnle single received PLAOM message
**               
**  PARAMETERS:  MV_U8 onuId
**               MV_U8 msgId
**               MV_U8 *msgData    
**
**  OUTPUTS:     None
**
**  RETURNS:     None 
**
*******************************************************************************/
void onuGponPonMngPloamProcess(MV_U8 onuId, MV_U8 msgId, MV_U8 *msgData)
{
  MV_U32          appOnuId;
  MV_U32          onuState;
  GPONFUNCPTR     ptrFunc;
  S_OnuGponGenTbl *onuGponGenTbl_p = &(onuGponDb_s.onuGponGenTbl_s);
  MV_U32          *msgData_p = msgData;

  /* get onu Id */
  appOnuId = onuGponDbOnuIdGet();

  /* get onu state */
  onuState = onuGponDbOnuStateGet();

  /* Filter for messages with invalid ONU Id */
  if ((onuId == ONU_GPON_BROADCAST_ONU_ID) || (onuId == appOnuId))
  {
    /* Handle valid messages */
    if ((msgId >= ONU_GPON_DS_MSG_OVERHEAD) && (msgId <= ONU_GPON_DS_MSG_EXT_BURST_LEN))
    {
      /* Call the relevant event function */
      ptrFunc = (onuGponGenTbl_p->onuGponStateAndEventTbl[(msgId)][onuState]);
      if (ptrFunc == NULL)
      {
        mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE,
                   "ERROR: (%s:%d) Msg function is NULL, onuId(%d), msgId(%d)\n", 
                   __FILE_DESC__, __LINE__, onuId, msgId);
      }
      else
      {
        (*ptrFunc)(onuId, msgId, msgData);
      }           

      onuGponSyncLog(ONU_GPON_LOG_MSG, onuId, msgId, 0);
      onuGponSyncLog(ONU_GPON_LOG_MSG_CONTENT, *(msgData_p), *(msgData_p + 1), *(msgData_p + 2));
    }
    /* handle invalid messages */
    else
    {
      /* Call the relevant function */
      ptrFunc = (onuGponGenTbl_p->onuGponStateAndEventTbl[ONU_GPON_EVENT_ALM_GEN_MEM][onuState]);
      if (ptrFunc == NULL)
      {
        mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE,
                   "ERROR: (%s:%d) Msg function is NULL, onuId(%d), msgId(%d)\n", 
                   __FILE_DESC__, __LINE__, onuId, msgId);
      }
      else
      {
        (*ptrFunc)(ONU_GPON_ALARM_MEM, 0, NULL);
      }           
    } 
  } 
}
Exemplo n.º 4
0
/*******************************************************************************
**
**  onuGponPonMngIntrAlarmHandler
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function implements the pon manager interrupt alarm 
**               functionality 
**               - handle alarms (LOS, LOF, and LCDG)
**               
**  PARAMETERS:  MV_U32 alarm    
**               MV_U32 alarmStatus
**
**  OUTPUTS:     None
**
**  RETURNS:     None 
**
*******************************************************************************/
void onuGponPonMngIntrAlarmHandler(MV_U32 alarm, MV_BOOL alarmStatus)
{
  MV_U32          onuState;
  MV_U32          alarmIndex;
  MV_U32          alarmEvent;
  GPONFUNCPTR     ptrFunc;
  S_OnuGponGenTbl *onuGponGenTbl_p;
  MV_U32          eventBase;

  /* Events State Machine Table */
  onuGponGenTbl_p = &(onuGponDb_s.onuGponGenTbl_s);

  /* get onu state */
  onuState = onuGponDbOnuStateGet();

  /* Get the Alarm Index in the Event Table */
  switch (alarm)
  {
  case ONU_PON_MNGR_LOS_ALARM:
    alarmIndex = ONU_GPON_ALARM_LOS;
    alarmEvent = ONU_GPON_EVENT_ALARM_LOS;
    break;
  case ONU_PON_MNGR_LOF_ALARM: 
    alarmIndex = ONU_GPON_ALARM_LOF;
    alarmEvent = ONU_GPON_EVENT_ALARM_LOF;
    break;
  case ONU_PON_MNGR_LCDG_ALARM:
    alarmIndex = ONU_GPON_ALARM_LCDG;
    alarmEvent = ONU_GPON_EVENT_ALARM_LCDG;
    break;
  default:
    mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE,
               "ERROR: (%s:%d) Unkown Alarm Type, alarm(%d), status(%d)\n", 
               __FILE_DESC__, __LINE__, alarm, alarmStatus);
    return;
  }

  /* Get the Base Enum in the Event Table */
  eventBase = (alarmStatus == MV_TRUE) ? ONU_GPON_ALARM_GEN_BASE : ONU_GPON_ALARM_CAN_BASE;

  /* handle alarm deactivation */
  ptrFunc = onuGponGenTbl_p->onuGponStateAndEventTbl[eventBase + alarmEvent][onuState];
  if (ptrFunc == NULL)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE,
               "ERROR: (%s:%d) Cancel alarm - function is NULL, alarm(%d), status(%d)\n", 
               __FILE_DESC__, __LINE__, alarm, alarmStatus);
  }
  else
  {
    (*ptrFunc)(alarmIndex, 0, NULL);
  }
}
/*******************************************************************************
**
**  onuPonDyingGaspExit
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function forces system reset after dying gasp
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuPonDyingGaspExit(void)
{
	if (mvBoardIdGet() == DB_88F6535_BP_ID) {
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "\n\n\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "=========================================\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "======= Dying Gasp Detected =============\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "======= System Need To Reboot !!!!! =====\n");
		mvPonPrint(PON_PRINT_INFO, PON_INIT_MODULE, "=========================================\n");
	}

	return(MV_OK);
}
Exemplo n.º 6
0
/*******************************************************************************
**
**  onuEponAlarmProcess
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function process the current alarm state and notify screen
**               
**  PARAMETERS:  MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     None 
**                   
*******************************************************************************/
void onuEponAlarmProcess(void)
{
  MV_U32 onuEponPreviousAlarmState;
  MV_U32 onuEponCurrentAlarmState;
  MV_U32 onuEponChangeAlarm;

  /* get the ASIC prvious alarm status */
  onuEponPreviousAlarmState = onuEponPreviousAlarm;

  /* get the ASIC current alarm status */
  onuEponCurrentAlarmState = onuEponCurrentAlarm;

  /* alarm changed */
  if ((onuEponCurrentAlarmState ^ onuEponPreviousAlarmState) != 0)
  {
    onuEponChangeAlarm = (onuEponCurrentAlarmState ^ onuEponPreviousAlarmState);

    if ((onuEponChangeAlarm & onuEponCurrentAlarmState) != 0)
    {
      if (onuEponChangeAlarm & ONU_EPON_XVR_SD_MASK)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, 
                   "INFO: (%s:%d) === XVR SD On ===\n\r", __FILE_DESC__, __LINE__);
      }

      if (onuEponChangeAlarm & ONU_EPON_SERDES_SD_MASK)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, 
                   "INFO: (%s:%d) === SERDES SD On ===\n\r", __FILE_DESC__, __LINE__);
      }
    }
    else /* ((onuEponChangeAlarm & onuEponCurrentAlarmState) == 0) */
    {
      if (onuEponChangeAlarm & ONU_EPON_XVR_SD_MASK)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, 
                   "INFO: (%s:%d) === XVR SD Off ===\n\r", __FILE_DESC__, __LINE__);
      }

      if (onuEponChangeAlarm & ONU_EPON_SERDES_SD_MASK)
      {
        mvPonPrint(PON_PRINT_INFO, PON_ALARM_MODULE, 
                   "INFO: (%s:%d) === SERDES SD Off ===\n\r", __FILE_DESC__, __LINE__);
      }
    }

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

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

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

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

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

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

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

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

	spin_lock_irqsave(&onuPonIrqLock, flags);

	onuPonResourceTbl_s.onuPonPatternBurstTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE;

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

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

	onuPonPatternBurstTransmit(is_transmit_up);

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

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

	spin_unlock_irqrestore(&onuPonIrqLock, flags);
}
Exemplo n.º 9
0
/*******************************************************************************
**
**  onuEponApiTxPmGet
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Tx counters                           
**                
**  PARAMETERS:  S_EponIoctlTxPm *rxPm
**               MV_BOOL         clear
**               MV_U32          macId
**
**  OUTPUTS:     None 
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuEponApiTxPmGet(S_EponIoctlTxPm *txPm, MV_BOOL clear, MV_U32 macId)
{
  MV_STATUS  status;
  S_EponTxPm inCounters;

  status = onuEponPmTxPmGet(&inCounters, macId);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiTxPmGet", __FILE_DESC__, __LINE__); 
    return(status);
  }

  txPm->ctrlRegReqFramesCnt = inCounters.ctrlRegReqFramesCnt - g_OnuEponOutPm[macId].tx.ctrlRegReqFramesCnt;
  txPm->ctrlRegAckFramesCnt = inCounters.ctrlRegAckFramesCnt - g_OnuEponOutPm[macId].tx.ctrlRegAckFramesCnt;
  txPm->reportFramesCnt     = inCounters.reportFramesCnt     - g_OnuEponOutPm[macId].tx.reportFramesCnt;    
  txPm->dataFramesCnt       = inCounters.dataFramesCnt       - g_OnuEponOutPm[macId].tx.dataFramesCnt;      
  txPm->txAllowedBytesCnt   = inCounters.txAllowedBytesCnt   - g_OnuEponOutPm[macId].tx.txAllowedBytesCnt;  

  if (clear == MV_TRUE)
  {
    g_OnuEponOutPm[macId].tx.ctrlRegReqFramesCnt = inCounters.ctrlRegReqFramesCnt;
    g_OnuEponOutPm[macId].tx.ctrlRegAckFramesCnt = inCounters.ctrlRegAckFramesCnt;
    g_OnuEponOutPm[macId].tx.reportFramesCnt     = inCounters.reportFramesCnt;   
    g_OnuEponOutPm[macId].tx.dataFramesCnt       = inCounters.dataFramesCnt;      
    g_OnuEponOutPm[macId].tx.txAllowedBytesCnt   = inCounters.txAllowedBytesCnt;
  }

  return(MV_OK);
}
Exemplo n.º 10
0
/*******************************************************************************
**
**  onuEponApiRxPmGet
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Rx counters                           
**                
**  PARAMETERS:  S_EponIoctlRxPm *rxPm
**               MV_BOOL         clear
**               MV_U32          macId
**
**  OUTPUTS:     None 
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuEponApiRxPmGet(S_EponIoctlRxPm *rxPm,  MV_BOOL clear, MV_U32 macId)
{
  MV_STATUS status;
  S_RxPm    inCounters;

  status = onuEponPmRxPmGet(&inCounters, macId);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiRxPmGet", __FILE_DESC__, __LINE__); 
    return(status);
  }

  rxPm->fcsErrorFramesCnt = inCounters.fcsErrorFramesCnt - g_OnuEponOutPm[macId].rx.fcsErrorFramesCnt;
  rxPm->shortFramesCnt    = inCounters.shortFramesCnt    - g_OnuEponOutPm[macId].rx.shortFramesCnt;
  rxPm->longFramesCnt     = inCounters.longFramesCnt     - g_OnuEponOutPm[macId].rx.longFramesCnt; 
  rxPm->dataFramesCnt     = inCounters.dataFramesCnt     - g_OnuEponOutPm[macId].rx.dataFramesCnt; 
  rxPm->ctrlFramesCnt     = inCounters.ctrlFramesCnt     - g_OnuEponOutPm[macId].rx.ctrlFramesCnt; 
  rxPm->reportFramesCnt   = inCounters.reportFramesCnt   - g_OnuEponOutPm[macId].rx.reportFramesCnt;  
  rxPm->gateFramesCnt     = inCounters.gateFramesCnt     - g_OnuEponOutPm[macId].rx.gateFramesCnt;    

  if (clear == MV_TRUE)
  {
    g_OnuEponOutPm[macId].rx.fcsErrorFramesCnt = inCounters.fcsErrorFramesCnt;
    g_OnuEponOutPm[macId].rx.shortFramesCnt    = inCounters.shortFramesCnt;   
    g_OnuEponOutPm[macId].rx.longFramesCnt     = inCounters.longFramesCnt;    
    g_OnuEponOutPm[macId].rx.dataFramesCnt     = inCounters.dataFramesCnt;    
    g_OnuEponOutPm[macId].rx.ctrlFramesCnt     = inCounters.ctrlFramesCnt;    
    g_OnuEponOutPm[macId].rx.reportFramesCnt   = inCounters.reportFramesCnt;   
    g_OnuEponOutPm[macId].rx.gateFramesCnt     = inCounters.gateFramesCnt;     
  }

  return(MV_OK);
}
Exemplo n.º 11
0
/*******************************************************************************
**
**  onuEponApiFecReConfig
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function re-configure onu FEC
**               
**  PARAMETERS:  MV_U32 rxGenFecEn
**               MV_U32 txGenFecEn
**               MV_U32 txMacFecEn[8]
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**                   
*******************************************************************************/
MV_STATUS onuEponApiFecReConfig(void)
{
  MV_STATUS status;
  MV_U32    regReqAutoRes;
  MV_U32    regAckAutoRes;
  MV_U32    reportAutoRes;
  MV_U32    rxGenFecEn;
  MV_U32    txGenFecEn;   
  MV_U32    txMacFecEn;   

  onuEponDbOnuCfgGet(&regReqAutoRes, &regAckAutoRes, &reportAutoRes, &rxGenFecEn, &txGenFecEn, &txMacFecEn);

  mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE, 
			 "DEBUG: (%s:%d) onuEponApiFecReConfig, regReqAutoRes(%d), regAckAutoRes(%d), reportAutoRes(%d), rxGenFecEn(%d), txGenFecEn(%d), txMacFecEn(0x%x)\n", 
			 __FILE_DESC__, __LINE__, regReqAutoRes, regAckAutoRes, reportAutoRes, rxGenFecEn, txGenFecEn, txMacFecEn);

  status = mvOnuEponMacGenOnuConfigSet(rxGenFecEn, txGenFecEn, reportAutoRes, regAckAutoRes, regReqAutoRes, txMacFecEn);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiFecReConfig", __FILE_DESC__, __LINE__); 
    return(status);
  }

  if (rxGenFecEn)
  {
	status = mvOnuEponMacPcsDelaySet(0x1058);
	if (status != MV_OK)
	{
	  mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
	  		   "ERROR: (%s:%d) onuEponApiFecReConfig", __FILE_DESC__, __LINE__); 
	  return(status);
	}
  }
  else
  {
	status = mvOnuEponMacPcsDelaySet(0x1C58);
	if (status != MV_OK)
	{
	  mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
	  		 "ERROR: (%s:%d) onuEponApiFecReConfig", __FILE_DESC__, __LINE__); 
	  return(status);
	}
  }

  return(MV_OK);
}
Exemplo n.º 12
0
/*******************************************************************************
**
**  onuEponApiTransmitOamFrame
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function transmit OAM frame via FIFO
**               
**  PARAMETERS:  S_OnuEponCtrlBuffer *frame
**               MV_U32              macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**                   
*******************************************************************************/
MV_STATUS onuEponApiTransmitOamFrame(S_OnuEponCtrlBuffer *frame, MV_U32 macId)
{
  MV_STATUS status;

  if (onuEponDbOnuStateGet(0) != ONU_EPON_03_OPERATION) 
  {
	mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE, 
	  		 "ERROR: (%s:%d) onuEponApiTransmitOamFrame, ONU not registered", __FILE_DESC__, __LINE__); 
	return(MV_OK);
  }

  status = onuEponOamAllocMsg(frame, macId);
  if (status != MV_OK)
  {
	mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE, 
			   "ERROR: (%s:%d) onuEponApiTransmitOamFrame", __FILE_DESC__, __LINE__); 
	return(status);
  }

  return(MV_OK);
}
Exemplo n.º 13
0
/*******************************************************************************
**
**  onuEponInit
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function init ONU
**               
**  PARAMETERS:  IOCTL Init data
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**           
*******************************************************************************/
MV_STATUS onuEponInit(S_EponIoctlInit *ioctlInit)
{
  MV_STATUS status;

  /*re-set DBA mode */
  status = onuEponDbaModeInit(ONU_DBA_SW_RPRT_MODE);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) onuEponDbaModeInit\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* re-set DDM polarity */
  status = mvOnuEponMacDdmTxPolaritySet(ONU_DEF_DDM_CFG_TX_EN_OR, ioctlInit->xvrPolarity);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacDdmTxPolaritySet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  onuEponDbXvrPolaritySet(ioctlInit->xvrPolarity);
  mvOnuPonMacBurstEnablePolarityInit(ioctlInit->xvrPolarity);

#ifndef PON_FPGA
  /* enable onu dying gasp interrupt mask */
  status = mvOnuPonMacDgInterruptEn(ioctlInit->dgPolarity);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuPonMacDgInterruptEn\n", __FILE_DESC__, __LINE__);
    return(status);
  }
#endif /* PON_FPGA */

  return(MV_OK);
}
Exemplo n.º 14
0
/*******************************************************************************
**
**  onuEponApiDgCallbackRegister
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function register Dying Gasp callback function
**               
**  PARAMETERS:  DYINGGASPFUNC dgCallBack 
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**                   
*******************************************************************************/
MV_STATUS onuEponApiDgCallbackRegister(DYINGGASPFUNC dgCallBack)
{
  MV_STATUS status;

  status = onuEponDbDgCallbackSet(dgCallBack);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponDbDgCallbackSet", __FILE_DESC__, __LINE__); 
    return(status);
  }

  return(MV_OK);
}
Exemplo n.º 15
0
/*******************************************************************************
**
**  onuEponApiEncryptionKeyConfig
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function configure onu Encryption Key
**               
**  PARAMETERS:  MV_U32 encryptKey
**               MV_U32 encryptKeyIndex
**               MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**                   
*******************************************************************************/
MV_STATUS onuEponApiEncryptionKeyConfig(MV_U32 encryptKey, MV_U32 encryptKeyIndex, MV_U32 macId)
{
  MV_STATUS status;

  status = mvOnuEponMacRxpEncKeySet(encryptKey, encryptKeyIndex, macId); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiEncryptionKeyConfig", __FILE_DESC__, __LINE__); 
    return(status);
  }

  return(MV_OK);
}
Exemplo n.º 16
0
/*******************************************************************************
**
**  onuEponApiStatusNotifyRegister
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function register status callback function
**               
**  PARAMETERS:  STATUSNOTIFYFUNC notifyCallBack 
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**                   
*******************************************************************************/
MV_STATUS onuEponApiStatusNotifyRegister(STATUSNOTIFYFUNC notifyCallBack)
{
  MV_STATUS status;

  status = onuEponDbStatusNotifySet(notifyCallBack);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) ponOnuApiStatusNotifyRegister", __FILE_DESC__, __LINE__); 
    return(status);
  }

  return(MV_OK);
}
Exemplo n.º 17
0
/*******************************************************************************
**
**  onuEponApiEncryptionConfig
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function configure onu Encryption
**               
**  PARAMETERS:  MV_U32 onuEncryptCfg
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK
**                   
*******************************************************************************/
MV_STATUS onuEponApiEncryptionConfig(MV_U32 onuEncryptCfg)
{
  MV_STATUS status;

  status = mvOnuEponMacRxpEncConfigSet(onuEncryptCfg);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiEncryptionConfig", __FILE_DESC__, __LINE__); 
    return(status);
  }

  return(MV_OK);
}
Exemplo n.º 18
0
/*******************************************************************************
**
**  onuPonMngInterfaceCreate
**  ____________________________________________________________________________
**
**  DESCRIPTION: The function create management interface - char device
**
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**
*******************************************************************************/
MV_STATUS onuPonMngInterfaceCreate(void)
{
	int   rcode;
	dev_t dev;

	dev   = MKDEV(MV_PON_MAJOR, 0);
	rcode = register_chrdev_region(dev, PON_NUM_DEVICES, PON_DEV_NAME);
	if (rcode < 0) {
		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
				   "ERROR: (%s:%d) Pon Char Device\n", __FILE_DESC__, __LINE__);
		return(MV_ERROR);
	}

	cdev_init(&ponDev.cdev, &ponCdevFops);
	ponDev.cdev.owner = THIS_MODULE;
	ponDev.drvMode = E_PON_DRIVER_UNDEF_MODE;

	rcode = cdev_add(&ponDev.cdev, dev, 1);
	if (rcode < 0) {
		mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
				   "ERROR: (%s:%d) Pon Char Device Add\n", __FILE_DESC__, __LINE__);

		cdev_del(&ponDev.cdev);
		unregister_chrdev_region(dev, PON_NUM_DEVICES);

		return(MV_ERROR);
	}

	/* create device for udev */
	pon_udev_class = class_create(THIS_MODULE, PON_DEV_NAME);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
	pon_udev_dev   = device_create(pon_udev_class, NULL, dev, PON_DEV_NAME);
#else
	pon_udev_dev   = device_create(pon_udev_class, NULL, dev, NULL, PON_DEV_NAME);
#endif
	return(MV_OK);
}
Exemplo n.º 19
0
/*******************************************************************************
**
**  onuEponApiGpmPmGet
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               Gpm counters                           
**                
**  PARAMETERS:  S_EponIoctlGpmPm *rxPm
**               MV_BOOL          clear
**               MV_U32           macId
**
**  OUTPUTS:     None 
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuEponApiGpmPmGet(S_EponIoctlGpmPm *gpmPm, MV_BOOL clear, MV_U32 macId)
{
  MV_STATUS status;
  S_GpmPm   inCounters;

  status = onuEponPmGpmPmGet(&inCounters, macId);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiTxPmGet", __FILE_DESC__, __LINE__); 
    return(status);
  }


  gpmPm->grantValidCnt                 = inCounters.grantValidCnt                 - g_OnuEponOutPm[macId].gpm.grantValidCnt;                
  gpmPm->grantMaxFutureTimeErrorCnt    = inCounters.grantMaxFutureTimeErrorCnt    - g_OnuEponOutPm[macId].gpm.grantMaxFutureTimeErrorCnt;   
  gpmPm->minProcTimeErrorCnt           = inCounters.minProcTimeErrorCnt           - g_OnuEponOutPm[macId].gpm.minProcTimeErrorCnt;          
  gpmPm->lengthErrorCnt                = inCounters.lengthErrorCnt                - g_OnuEponOutPm[macId].gpm.lengthErrorCnt;               
  gpmPm->discoveryAndRegCnt            = inCounters.discoveryAndRegCnt            - g_OnuEponOutPm[macId].gpm.discoveryAndRegCnt;           
  gpmPm->fifoFullErrorCnt              = inCounters.fifoFullErrorCnt              - g_OnuEponOutPm[macId].gpm.fifoFullErrorCnt;             
  gpmPm->opcDiscoveryNotRegBcastCnt    = inCounters.opcDiscoveryNotRegBcastCnt    - g_OnuEponOutPm[macId].gpm.opcDiscoveryNotRegBcastCnt;   
  gpmPm->opcRegisterNotDiscoveryCnt    = inCounters.opcRegisterNotDiscoveryCnt    - g_OnuEponOutPm[macId].gpm.opcRegisterNotDiscoveryCnt;   
  gpmPm->opcDiscoveryNotRegNotBcastCnt = inCounters.opcDiscoveryNotRegNotBcastCnt - g_OnuEponOutPm[macId].gpm.opcDiscoveryNotRegNotBcastCnt;
  gpmPm->opcDropGrantCnt               = inCounters.opcDropGrantCnt               - g_OnuEponOutPm[macId].gpm.opcDropGrantCnt;              
  gpmPm->opcHiddenGrantCnt             = inCounters.opcHiddenGrantCnt             - g_OnuEponOutPm[macId].gpm.opcHiddenGrantCnt;            
  gpmPm->opcBackToBackCnt              = inCounters.opcBackToBackCnt              - g_OnuEponOutPm[macId].gpm.opcBackToBackCnt;             

  if (clear == MV_TRUE)
  {
    g_OnuEponOutPm[macId].gpm.grantValidCnt                 = inCounters.grantValidCnt;                
    g_OnuEponOutPm[macId].gpm.grantMaxFutureTimeErrorCnt    = inCounters.grantMaxFutureTimeErrorCnt;   
    g_OnuEponOutPm[macId].gpm.minProcTimeErrorCnt           = inCounters.minProcTimeErrorCnt;          
    g_OnuEponOutPm[macId].gpm.lengthErrorCnt                = inCounters.lengthErrorCnt;               
    g_OnuEponOutPm[macId].gpm.discoveryAndRegCnt            = inCounters.discoveryAndRegCnt;           
    g_OnuEponOutPm[macId].gpm.fifoFullErrorCnt              = inCounters.fifoFullErrorCnt;             
    g_OnuEponOutPm[macId].gpm.opcDiscoveryNotRegBcastCnt    = inCounters.opcDiscoveryNotRegBcastCnt;   
    g_OnuEponOutPm[macId].gpm.opcRegisterNotDiscoveryCnt    = inCounters.opcRegisterNotDiscoveryCnt;   
    g_OnuEponOutPm[macId].gpm.opcDiscoveryNotRegNotBcastCnt = inCounters.opcDiscoveryNotRegNotBcastCnt;
    g_OnuEponOutPm[macId].gpm.opcDropGrantCnt               = inCounters.opcDropGrantCnt;              
    g_OnuEponOutPm[macId].gpm.opcHiddenGrantCnt             = inCounters.opcHiddenGrantCnt;            
    g_OnuEponOutPm[macId].gpm.opcBackToBackCnt              = inCounters.opcBackToBackCnt;             
  }

  return(MV_OK);
}
Exemplo n.º 20
0
/*******************************************************************************
**
**  onuEponSwitchOn
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function execute onu switchOn init sequence
**               
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or MV_ERROR
**                   
*******************************************************************************/
MV_STATUS onuEponSwitchOn(void)
{
  MV_STATUS rcode;

  /* init onu RTOS resources */
  rcode = onuEponRtosResourceInit();
  if (rcode != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) onuPonRtosResourceInit\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  onuEponAppInit();

  /* onu epon counters table */ 
  onuEponPmInit();

  return(MV_OK);
}
Exemplo n.º 21
0
/*******************************************************************************
**
**  onuEponAlarmSet
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function set onu epon alarm 
**               
**  PARAMETERS:  MV_U32  alarm
**               MV_BOOL status
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK 
**                   
*******************************************************************************/
MV_STATUS onuEponAlarmSet(MV_U32 alarm, MV_BOOL state)
{
  if ((alarm & ONU_EPON_ALARM_MASK) == 0)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_ALARM_MODULE, 
               "ERROR: (%s:%d) invalid alarm(%d) type\n\r", __FILE_DESC__, __LINE__, alarm);
    return(MV_ERROR);
  }

  if (state == MV_FALSE)
  {
    onuEponCurrentAlarm &= ~(alarm);
  }
  else
  {
    onuEponCurrentAlarm |=  (alarm);
  }

  onuEponAlarmProcess();

  return(MV_OK);
}
Exemplo n.º 22
0
/*******************************************************************************
**
**  onuEponApiSwPmGet
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function is used to retrieve and clear (if requested) ONU
**               SW counters                           
**                
**  PARAMETERS:  S_EponIoctlSwPm *swPm
**               MV_BOOL         clear
**               MV_U32          macId
**
**  OUTPUTS:     None 
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuEponApiSwPmGet(S_EponIoctlSwPm *swPm, MV_BOOL clear, MV_U32 macId)
{
  MV_STATUS status;
  S_SwPm    inCounters;
  MV_U32    index;

  status = onuEponPmSwPmGet(&inCounters, macId);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, 
               "ERROR: (%s:%d) onuEponApiSwPmGet", __FILE_DESC__, __LINE__); 
    return(status);
  }

  for (index = 0; index < MAX_EPON_RX_SW_CNT; index++)
  {
    swPm->swRxCnt[index] = inCounters.swRxCnt[index] - g_OnuEponOutPm[macId].sw.swRxCnt[index];
  }

  for (index = 0; index < MAX_EPON_TX_SW_CNT; index++)
  {
    swPm->swTxCnt[index] = inCounters.swTxCnt[index] - g_OnuEponOutPm[macId].sw.swTxCnt[index];
  }

  if (clear == MV_TRUE)
  {
    for (index = 0; index < MAX_EPON_RX_SW_CNT; index++)
    {
      g_OnuEponOutPm[macId].sw.swRxCnt[index] = inCounters.swRxCnt[index];
    }

    for (index = 0; index < MAX_EPON_TX_SW_CNT; index++)
    {
      g_OnuEponOutPm[macId].sw.swTxCnt[index] = inCounters.swTxCnt[index];
    }
  }

  return(MV_OK);
}
Exemplo n.º 23
0
/*******************************************************************************
**
**  onuEponOperate
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function execute onu operate init sequence
**               
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**           
*******************************************************************************/
MV_STATUS onuEponOperate(void)
{
  MV_STATUS status;
  MV_U32    interruptMask;

  /* enable onu pon interrupt mask */
  interruptMask = (ONU_EPON_INTERRUPTS);
  interruptMask &= ~(ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK);
  status = mvOnuEponMacPonInterruptMaskSet(interruptMask);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) Enable PON interrupt mask\n\r", __FILE_DESC__, __LINE__);
    return(status);
  }


  /* Enable MAC */
  status = mvOnuEponMacOnuRxEnableSet(ONU_RX_EN);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuRxEnableSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }
 
  status = mvOnuEponMacOnuTxEnableSet(ONU_TX_EN, 0);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuTxEnableSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, ONU_PHY_OUTPUT, 0); 
  if (status != MV_OK)
  {
	mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
	  		 "ERROR: (%s:%d) mvOnuEponMacOnuIOEnable\n\r", __FILE_DESC__, __LINE__);
	return(MV_ERROR);
  }

  /* start onu pon pon pm timer */
  onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonPmTimerId));

  /* start onu pon pon mpc timer */
  onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonMpcpTimerId));

  if (onuEponDbOnuSwRprtTimerTypeGet() == ONU_EPON_HW_DBA_RPRT_TIMER)
  {
    /* start onu pon pon tx module timer */
    onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonHwRprtTxModTimerId));

    /* Enable DBA Report message handling */
	onuEponIsrTimerHwReportStateSet(MV_TRUE, /* Enable */
									dbaRprtT0StateVal,
									dbaRprtT0StateInterval,
									dbaRprtT1StateVal,
									dbaRprtT1StateInterval);

  }

  return(MV_OK);
}
Exemplo n.º 24
0
/*******************************************************************************
**
**  onuEponAsicFiFoReInit
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function re-init onu EPON MAC Fifo 
**               
**  PARAMETERS:  None
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**                   
*******************************************************************************/
MV_STATUS onuEponAsicFiFoReInit(void)
{
  MV_STATUS status;
  MV_U32    rxEnable;
  MV_U32    txEnable;

  /* Disable all TX  */
  rxEnable = 1;
  txEnable = 0;
  status = mvOnuEponMacOnuEnableSet(rxEnable, txEnable);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuEnableSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* disable onu pon interrupt mask */
  mvOnuEponMacPonInterruptMaskSet(0);
  
  /* Turn on GMII MASK */ 
  /* Switch TX port to Standard GE mode */
  status = mvOnuEponMacTxmConfigSet(ONU_DEF_TXM_CFG_TFEC_1,
                                    ONU_DEF_TXM_CFG_TFEC_2, 
                                    ONU_DEF_TXM_CFG_CTRL_FIFO_DIS_FCS_OFF,
                                    ONU_DEF_TXM_CFG_MASK_GMII_ON,      
                                    ONU_DEF_TXM_CFG_BLOCK_DATA_OFF,    
                                    ONU_DEF_TXM_CFG_IPG_DONT_ADD,      
                                    ONU_DEF_TXM_CFG_MODE_GE,           
                                    ONU_DEF_TXM_CFG_ALIGNMENT_EVEN,    
                                    ONU_DEF_TXM_CFG_PRIORITY_RPRT_FIRST);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacTxmConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* Enable all TX  */
  rxEnable = 1;
  txEnable = 0xFF;
  status = mvOnuEponMacOnuEnableSet(rxEnable, txEnable);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuEnableSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* Wait 10ms */
  mvOsDelay(10);

  /* Disable all TX  */
  rxEnable = 1;
  txEnable = 0;
  status = mvOnuEponMacOnuEnableSet(rxEnable, txEnable);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuEnableSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* Switch TX port to Standard EPON mode */
  /* Turn off GMII MASK */ 
  status = mvOnuEponMacTxmConfigSet(ONU_DEF_TXM_CFG_TFEC_1,
                                    ONU_DEF_TXM_CFG_TFEC_2, 
                                    ONU_DEF_TXM_CFG_CTRL_FIFO_DIS_FCS_OFF,
                                    ONU_DEF_TXM_CFG_MASK_GMII_OFF,     
                                    ONU_DEF_TXM_CFG_BLOCK_DATA_OFF,    
                                    ONU_DEF_TXM_CFG_IPG_DONT_ADD,      
                                    ONU_DEF_TXM_CFG_MODE_EPON,         
                                    ONU_DEF_TXM_CFG_ALIGNMENT_EVEN,    
                                    ONU_DEF_TXM_CFG_PRIORITY_RPRT_FIRST);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacTxmConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }
  
  /* enable onu pon interrupt mask */
  mvOnuEponMacPonInterruptMaskSet(0x120);

  /* Enable all TX  */
 rxEnable = 1;
 txEnable = 0xFF;
 status = mvOnuEponMacOnuEnableSet(rxEnable, txEnable);
 if (status != MV_OK)
 {
   mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
              "ERROR: (%s:%d) mvOnuEponMacOnuEnableSet\n\r", __FILE_DESC__, __LINE__);
   return(MV_ERROR);
 }

  return(MV_OK);
}
Exemplo n.º 25
0
/*******************************************************************************
**
**  onuEponAsicReInit
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function re-init default onu EPON MAC configuration 
**               
**  PARAMETERS:  MV_U32 macId
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**                   
*******************************************************************************/
MV_STATUS onuEponAsicReInit(MV_U32 macId, MV_U32 silenceMode)
{
  MV_STATUS status;
  MV_U32    rxGenFecEn = 0;
  MV_U32    txGenFecEn = 0;
  MV_U32    txMacFecEn[8] = {0,0,0,0,0,0,0,0};

  status = mvOnuEponMacOnuStateSet(ONU_EPON_NOT_REGISTERD, macId);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuStateSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacTxmLlidSet(ONU_DEF_TX_LLID, macId); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacTxmLlidSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacRxpLlidDataSet(ONU_DEF_RX_LLID, macId); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacRxpLlidDataSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* handle silence mode */
  if ((onuEponDbOnuSilenceStateGet() != ONU_SILENCE_NOT_ACTIVE) &&
	  (silenceMode == ONU_SILENCE_ENABLED))
  {
	/* Clear onu Silence Timers */
	onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonSilenceTimerId[macId]));

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

	onuEponDbOnuCfgAutoSet(ONU_REG_REQ_AUTO_RES, ONU_REG_ACK_AUTO_RES, ONU_REPORT_AUTO_RES);
  }

  mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE,
			 "DEBUG: (%s:%d) onuEponAsicReInit, rxGenFecEn(%d), txGenFecEn(%d), txMacFecEn(%d,%d,%d,%d,%d,%d,%d,%d)\n", 
			 __FILE_DESC__, __LINE__, rxGenFecEn, txGenFecEn, txMacFecEn[0], txMacFecEn[1], txMacFecEn[2], txMacFecEn[3],
             txMacFecEn[4], txMacFecEn[5], txMacFecEn[6], txMacFecEn[7]);

  status = onuEponApiFecConfig(rxGenFecEn, txGenFecEn, txMacFecEn, ONU_FEC_CFG_RE_INIT); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
    		   "ERROR: (%s:%d) onuEponApiFecConfig\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* clear OAM SW FIFO - Tx */
  onuEponOamFlushAllMsg();

  mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE,
			 "DEBUG: (%s:%d) onuEponAsicReInit, onuEponOamFlushAllMsg\n\r", __FILE_DESC__, __LINE__);

#if 0 /* NOT USED */
  status = onuEponAsicQueueDisable(macId); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) onuEponAsicQueueDisable\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  if (macId == 0) 
  {
    status = onuEponAsicFiFoReInit(); 
    if (status != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
                 "ERROR: (%s:%d) onuEponMacFiFoReInit\n\r", __FILE_DESC__, __LINE__);
      return(MV_ERROR);
    }
  }
#endif  /* NOT USED */
  
  return(MV_OK);
}
Exemplo n.º 26
0
/*******************************************************************************
**
**  onuEponAsicInit
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function init default onu EPON MAC configuration 
**               
**  PARAMETERS:  MV_BOOL initTime - init indication flag, true = init sequence
**
**  OUTPUTS:     None
**
**  RETURNS:     MV_OK or error
**                   
*******************************************************************************/
MV_STATUS onuEponAsicInit(void)
{
  MV_STATUS status;
  MV_U32    macAddrHigh;
  MV_U32    macAddrLow;
#ifdef PON_Z2
  MV_U32    pcsConfig;
#endif /* PON_Z2 */
  MV_U32    macId;
//MV_U32    queueId;

#ifndef PON_FPGA
  status = onuEponSerdesInit();
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) onuEponSerdesInit\n", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

#endif /* PON_FPGA */

#ifndef PON_FPGA
  onuEponAsicLedsInit();
#endif /*PON_FPGA */

  /* Disable MAC */
  status = mvOnuEponMacOnuEnableSet(ONU_RX_DIS, ONU_TX_DIS);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuStateSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* MAC State */
  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) 
  {
    status = mvOnuEponMacOnuStateSet(ONU_EPON_NOT_REGISTERD, macId);
    if (status != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
                 "ERROR: (%s:%d) mvOnuEponMacOnuStateSet\n\r", __FILE_DESC__, __LINE__);
      return(MV_ERROR);
    }
  }

  /* Broadcast Address */
  status = mvOnuEponMacGenBcastAddrSet(ONU_BROADCAST_ADDR_HIGH, ONU_BROADCAST_ADDR_LOW);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenBcastAddrSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* Unicast Address */
  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) 
  {
    onuEponDbOnuMacAddrGet(&macAddrLow, &macAddrHigh, macId);

    status = mvOnuEponMacGenUcastAddrSet(macAddrHigh, macAddrLow, macId); 
    if (status != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
                 "ERROR: (%s:%d) mvOnuEponMacGenUcastAddrSet\n\r", __FILE_DESC__, __LINE__);
      return(MV_ERROR);
    }
  }

  status = mvOnuEponMacGenSyncTimeSet(ONU_DEF_SYNC_TIME, 
                                      ONU_DEF_SYNC_TIME_ADD, 
                                      ONU_DEF_SYNC_TIME_FORCE_SW, 
                                      ONU_DEF_SYNC_TIME_DIS_GATE_AUTO, 
                                      ONU_DEF_SYNC_TIME_DIS_DISCOVER_AUTO); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenSyncTimeSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacDdmDelaySet(ONU_DEF_DDM_DELAY); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvAsicReg_EPON_DDM_1814_CONFIG\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacRxpPacketForwardSet(ONU_CTRL_FRAME_TO_DATA_QUEUE,
                                           ONU_CTRL_FRAME_TO_CTRL_QUEUE,
                                           ONU_RPRT_FRAME_TO_DATA_QUEUE,
                                           ONU_RPRT_FRAME_TO_RPRT_QUEUE,
                                           ONU_SLOW_FRAME_TO_RPRT_QUEUE,
                                           ONU_SLOW_FRAME_TO_CTRL_QUEUE);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacRxpPacketForwardSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacOnuRegAutoUpdateStateSet(1);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacOnuAutoUpdateStateSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* ONU_REPORT_AUTO_RES is always ON */
  /* In case of SW Report via Control FIFO, the HW will send empty report - keep alive */ 
  status = mvOnuEponMacGenOnuConfigSet(ONU_RX_PCS_FEC_DIS, 
    								   ONU_TX_PCS_FEC_DIS, 
    								   ONU_REPORT_AUTO_RES,  
									   ONU_REG_ACK_AUTO_RES, 
    								   ONU_REG_REQ_AUTO_RES,
    								   ONU_TX_FEC_DIS); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenOnuConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacRxpPacketFilterSet(ONU_FORWARD_LLID_CRC_ERR_PKT, 
                                          ONU_FORWARD_LLID_FCS_ERR_PKT,
                                          ONU_FORWARD_LLID_GMII_ERR_PKT, 
                                          ONU_FORWARD_LLID_LEN_ERR_PKT,
                                          ONU_FORWARD_LLID_ALL_PKT, 
                                          ONU_FORWARD_LLID_7FFF_MODE_0_PKT,
                                          ONU_FORWARD_LLID_7FFF_MODE_1_PKT, 
                                          ONU_FORWARD_LLID_XXXX_MODE_1_PKT, 
                                          ONU_DROP_LLID_NNNN_MODE_1_PKT); 
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacRxpPacketFilterSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacGenLaserParamSet(ONU_DEF_LASER_ON_OFF_TIME, 
                                        ONU_DEF_LASER_ON_TIME, 
                                        ONU_DEF_LASER_OFF_TIME);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenLaserParamSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) 
  {
    status = mvOnuEponMacTxmLlidSet(ONU_DEF_TX_LLID, macId); 
    if (status != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
                 "ERROR: (%s:%d) mvOnuEponMacTxmLlidSet\n\r", __FILE_DESC__, __LINE__);
      return(MV_ERROR);
    }

    status = mvOnuEponMacRxpLlidDataSet(ONU_DEF_RX_LLID, macId); 
    if (status != MV_OK)
    {
      mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
                 "ERROR: (%s:%d) mvOnuEponMacRxpLlidDataSet\n\r", __FILE_DESC__, __LINE__);
      return(MV_ERROR);
    }
  }

#ifdef PON_Z1  
  status = mvOnuEponMacTxmConfigSet(ONU_DEF_TXM_CFG_MODE,     
                                    ONU_DEF_TXM_CFG_ALIGNMENT,
                                    ONU_DEF_TXM_CFG_PRIORITY);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacTxmConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }
#endif /* PON_Z1 */
#ifdef PON_Z2

  status = mvOnuEponMacTxmOverheadSet(0x0E01);
  if (status != MV_OK)
  {
	mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
			   "ERROR: (%s:%d) mvOnuEponMacTxmOverheadSet\n\r", __FILE_DESC__, __LINE__);
	return(MV_ERROR);
  }

  status = mvOnuEponMacTxmConfigSet(ONU_DEF_TXM_CFG_TFEC_1,
                                    ONU_DEF_TXM_CFG_TFEC_2, 
                                    ONU_DEF_TXM_CFG_CTRL_FIFO_DIS_FCS_OFF,
                                    ONU_DEF_TXM_CFG_MASK_GMII_OFF, 
                                    ONU_DEF_TXM_CFG_BLOCK_DATA_OFF,
                                    ONU_DEF_TXM_CFG_IPG_ADD,  
                                    ONU_DEF_TXM_CFG_MODE_EPON,     
                                    ONU_DEF_TXM_CFG_ALIGNMENT_EVEN,
                                    ONU_DEF_TXM_CFG_PRIORITY_CTRL_FIRST);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacTxmConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  pcsConfig = (ONU_DEF_PCS_CFG_RX_EN | ONU_DEF_PCS_CFG_TX_EN);
  status = mvOnuEponMacPcsConfigSet(pcsConfig); 
  if (status != MV_OK)              
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacPcsConfigSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacDdmTxPolaritySet(ONU_DEF_DDM_CFG_TX_EN_OR, 
                                        ONU_DEF_DDM_CFG_POLARITY_HIGH);
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacDdmTxPolaritySet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  onuEponDbXvrPolaritySet(ONU_DEF_DDM_CFG_POLARITY_HIGH);
  mvOnuPonMacBurstEnablePolarityInit(ONU_DEF_DDM_CFG_POLARITY_HIGH);

  status = mvOnuEponMacGpmDiscoveryGrantLengthSet(0x26,  /* grantLength */ 
                                                  0x06,  /* addOffsetForCalc */ 
                                                  0x32); /* grantLengthMultiTq */
  if (status != MV_OK)
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGpmDiscoveryGrantLengthSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacGenTimestampConfig(0x0,   /* gpmAddSyncTimeToTimestamp */
                                          0x760, /* gpmAimestampOffset */       
                                          0x1,   /* txmAddSyncTimeToTimestamp */
                                          0x0,   /* txmUseTimestampImage */
                                          0x77B);/* txmTimestampOffset) */     
  if (status != MV_OK)                             
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenTimestampConfig\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  /* ==================================== */
  /* ==         SW REPORT MODE         == */
  /* ==================================== */
  for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) 
  {
    status  = mvOnuEponMacTxmCppReportConfig(0xFF,  /* Queueset2 not supported - set to 0xFF (queueReportQ2) */ 
    									     0x1,   /* Queueset2 not supported - set to 0x1, Software (reportBitmapQ2) */ 
    									     0xFF,  /* Queueset1 supported - set to 0, means all 8 queues are active (queueReport) */ 
    									     1,     /* Number of queueSet - support for 1 queueset */ 
    									     0x1,   /* Queueset1 supported - set to 0x1, Software (reportBitmap) */
    									     macId);
//  /* Report is sent via EPON MAC FIFO */ 
//  /*                    ============= */
//  status |= mvOnuEponMacTxmCppReportBitMap(0, macId); /* Queueset1 - 8 queues enabled(0xFF) , Queueset1 - 8 queues disabled(0x00) */
//  status |= mvOnuEponMacTxmCppReportQueueSet(0, macId);  /* Number of queuesets - support for 1 queueset */
// 
//  for (queueId = 0; queueId < 7; queueId++) 
//  {
//    status |= mvOnuEponMacTxmCppReportQueueX(queueId, 0, macId);
//  }
//
//  status |= mvOnuEponMacTxmCppReportQueueX(queueId, 0, macId);
//  if (status != MV_OK)                             
//  {
//    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
//  		   "ERROR: (%s:%d) mvOnuEponMacTxmCppReport...\n\r", __FILE_DESC__, __LINE__);
//    return(MV_ERROR);
//  }
  }

  status = mvOnuEponMacGenUtmTcPeriodSet(0x100);
  if (status != MV_OK)                             
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenUtmTcPeriodSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuEponMacGenUtmTcPeriodEnSet(0x1);
  if (status != MV_OK)                             
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuEponMacGenUtmTcPeriodEnSet\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

  status = mvOnuPonMacBurstEnableInit();
  if (status != MV_OK)                             
  {
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE,
               "ERROR: (%s:%d) mvOnuPonMacBurstEnableInit\n\r", __FILE_DESC__, __LINE__);
    return(MV_ERROR);
  }

#endif /* PON_Z2 */   

  return(MV_OK);
}
Exemplo n.º 27
0
/*******************************************************************************
**
**  onuEponSerdesInit
**  ____________________________________________________________________________
** 
**  DESCRIPTION: The function set serdes
**               
**  PARAMETERS:  None
**
**  OUTPUTS:     None    
**
**  RETURNS:     MV_OK or error
**
*******************************************************************************/
MV_STATUS onuEponSerdesInit(void)
{
  MV_STATUS status;
  MV_U32    loop = 0;

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

  mvOsDelay(40);

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

  mvOsDelay(40);

  /* PON MAC init to GPON mode */
  /* ========================= */

  /* Put PON MAC to Reset */
  status = asicOntMiscRegWrite(mvAsicReg_PON_MAC_SW_RESET_CTRL, 0x0, 0); 
  if (status != MV_OK) 
    return(status);

  mvOsDelay(40);

  /* Switch to new PON MAC */
  status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_XPON_CTRL, 0, 0);
  if (status != MV_OK)
    return(status);

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

  /* Take PON MAC out of Reset */
  status = asicOntMiscRegWrite(mvAsicReg_PON_MAC_SW_RESET_CTRL, 0x1, 0);
  if (status != MV_OK)
    return(status);

  mvOsDelay(40);

  /* PON MAC init to EPON mode */
  /* ========================= */

  /* Put PON MAC to Reset */
  status = asicOntMiscRegWrite(mvAsicReg_PON_MAC_SW_RESET_CTRL, 0x0, 0);
  if (status != MV_OK)
    return(status);

  mvOsDelay(40);

  /* Switch to new PON MAC */
  status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_XPON_CTRL, 1, 0);
  if (status != MV_OK)
    return(status);

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

  /* Take PON MAC out of Reset */
  status = asicOntMiscRegWrite(mvAsicReg_PON_MAC_SW_RESET_CTRL, 0x1, 0); 
  if (status != MV_OK) 
    return(status);

  mvOsDelay(40);

  /*    EPON configuration of XVR SD is done by LSP code (mvBoardEnvSpec.h, mvCtrlEnvLib.c) */

  /*    EPON configuration/SerDes power up and init sequence   */
  /* ========================================================= */

  do 
  {
	loop++;

	status = onuEponSerdesPowerUpSeq();
	if      (status == MV_ERROR) return(status);
	else if (status == MV_OK)    break;

  } while (loop < 10);

  if (loop >= 10) 
  {
	mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, "======================================\n");
    mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, "========= Serdes Not Sync !!! ========\n");
	mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, "======================================\n");
  }

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

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

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

  mvOsDelay(40);

 // status  = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_1_BEN_IO_EN, 0x0, 0); 
 // if (status != MV_OK) 
 //   return(status);
 //
 // mvOsDelay(10);

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

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

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

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

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

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

	if (mvCtrlRevGet() == ONU_ASIC_REV_Z2) {

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

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

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

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

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

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

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

	/*set pattern type*/
	status  = asicOntMiscRegWrite(mvAsicReg_PT_PATTERN_DATA, pattern, 0);
	if (status != MV_OK)
		return(status);

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


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

	}

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

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

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

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

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

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

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

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

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

        polarity = onuP2PDbXvrBurstEnablePolarityGet();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return(status);
}