/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); } } } }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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(®ReqAutoRes, ®AckAutoRes, &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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }
/******************************************************************************* ** ** 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); }