/******************************************************************************* | |
Copyright (C) Marvell International Ltd. and its affiliates | |
This software file (the "File") is owned and distributed by Marvell | |
International Ltd. and/or its affiliates ("Marvell") under the following | |
alternative licensing terms. Once you have made an election to distribute the | |
File under one of the following license alternatives, please (i) delete this | |
introductory statement regarding license alternatives, (ii) delete the two | |
license alternatives that you have not elected to use and (iii) preserve the | |
Marvell copyright notice above. | |
******************************************************************************** | |
Marvell Commercial License Option | |
If you received this File from Marvell and you have entered into a commercial | |
license agreement (a "Commercial License") with Marvell, the File is licensed | |
to you under the terms of the applicable Commercial License. | |
******************************************************************************** | |
Marvell GPL License Option | |
If you received this File from Marvell, you may opt to use, redistribute and/or | |
modify this File in accordance with the terms and conditions of the General | |
Public License Version 2, June 1991 (the "GPL License"), a copy of which is | |
available along with the File in the license.txt file or by writing to the Free | |
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or | |
on the worldwide web at http://www.gnu.org/licenses/gpl.txt. | |
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED | |
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY | |
DISCLAIMED. The GPL License provides additional details about this warranty | |
disclaimer. | |
******************************************************************************** | |
Marvell BSD License Option | |
If you received this File from Marvell, you may opt to use, redistribute and/or | |
modify this File under the following licensing terms. | |
Redistribution and use in source and binary forms, with or without modification, | |
are permitted provided that the following conditions are met: | |
* Redistributions of source code must retain the above copyright notice, | |
this list of conditions and the following disclaimer. | |
* Redistributions in binary form must reproduce the above copyright | |
notice, this list of conditions and the following disclaimer in the | |
documentation and/or other materials provided with the distribution. | |
* Neither the name of Marvell nor the names of its contributors may be | |
used to endorse or promote products derived from this software without | |
specific prior written permission. | |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | |
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
******************************************************************************/ | |
/****************************************************************************** | |
** FILE : gponOnuIsr.c ** | |
** ** | |
** DESCRIPTION : This file implements ONU GPON Interrupt handling ** | |
******************************************************************************* | |
* * | |
* MODIFICATION HISTORY: * | |
* * | |
* 29Oct06 Oren Ben Hayun created * | |
* =========================================================================== * | |
******************************************************************************/ | |
/* Include Files | |
------------------------------------------------------------------------------*/ | |
#include "gponOnuHeader.h" | |
/* Local Constant | |
------------------------------------------------------------------------------*/ | |
#define __FILE_DESC__ "mv_pon/core/gpon/gponOnuIsr.c" | |
#define MV_NO_XVR_RST (0xFF) | |
/* Global Variables | |
------------------------------------------------------------------------------*/ | |
extern spinlock_t onuPonIrqLock; | |
/* Local Variables | |
------------------------------------------------------------------------------*/ | |
MV_U32 g_onuGponPreviousInterrupt = ONU_GPON_INT_ALARMS; | |
MV_U32 g_onuGponCurrentInterrupt = 0; | |
S_OnuGponIsrCounters g_onuGponIsrCounters; | |
MV_BOOL g_ponDebugMode = MV_FALSE; | |
/* Export Functions | |
------------------------------------------------------------------------------*/ | |
/* Local Functions | |
------------------------------------------------------------------------------*/ | |
MV_STATUS onuGponIsrXvrReset(void); | |
/******************************************************************************/ | |
/* ========================================================================== */ | |
/* Operational Section */ | |
/* ========================================================================== */ | |
/******************************************************************************/ | |
/******************************************************************************* | |
** | |
** onuGponIsrInit | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function reset onu interrupt counters | |
** | |
** PARAMETERS: None | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: MV_OK | |
** | |
*******************************************************************************/ | |
MV_STATUS onuGponIsrInit(void) | |
{ | |
MV_U32 i; | |
g_onuGponIsrCounters.interruptReadError = 0; | |
g_onuGponIsrCounters.ploamStatusNoInterrupt = 0; | |
for (i = 0; i < ONU_GPON_ISR_TYPE_MAX ; i++) | |
{ | |
g_onuGponIsrCounters.sendMessageError[i] = 0; | |
g_onuGponIsrCounters.setEventError[i] = 0; | |
} | |
for (i = 0; i < ON_GPON_MAX_ALARMS ; i++) | |
{ | |
g_onuGponIsrCounters.interruptSameStatus[i] = 0; | |
} | |
return(MV_OK); | |
} | |
#ifndef PON_FPGA | |
/******************************************************************************* | |
** | |
** onuGponIsrXvrResetTimerHndl | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function is called by the GPON Interrupt handler to execute | |
** XVR reset sequence in case of a problem with XVR signal detect | |
** | |
** PARAMETERS: unsigned long data | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: None | |
** | |
*******************************************************************************/ | |
void onuGponIsrXvrResetTimerHndl(unsigned long data) | |
{ | |
MV_STATUS status; | |
unsigned long flags; | |
spin_lock_irqsave(&onuPonIrqLock, flags); | |
onuPonResourceTbl_s.onuPonIsrXvrRstTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE; | |
status = onuGponIsrXvrReset(); | |
if (status != MV_NO_XVR_RST) | |
{ | |
if ((onuPonResourceTbl_s.onuPonIsrXvrRstTimerId.onuPonTimerPeriodic) != 0) | |
onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonIsrXvrRstTimerId)); | |
} | |
else | |
{ | |
onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonIsrXvrRstTimerId)); | |
} | |
spin_unlock_irqrestore(&onuPonIrqLock, flags); | |
} | |
/******************************************************************************* | |
** | |
** onuGponDgIsrRoutine | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function implements Dying Gasp | |
** | |
** PARAMETERS: None | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: None | |
** | |
*******************************************************************************/ | |
void onuGponDgIsrRoutine(void) | |
{ | |
onuGponPonMngIntrDgHandler(); | |
} | |
#endif /* PON_FPGA */ | |
/******************************************************************************* | |
** | |
** onuGponIsrLowRoutine | |
** onuGponIsrRoutine | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function implements interrupt polling mode, it polls the | |
** current status of an interrupt compare it to the previous | |
** status, and if an interrupt is active trigger the operation | |
** of the pon manager task. | |
** | |
** PARAMETERS: None, void* param | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: None, void* | |
** | |
*******************************************************************************/ | |
/******************************************************************************* | |
** | |
** onuGponIsrLowRoutine | |
** | |
*******************************************************************************/ | |
void onuGponIsrLowRoutine(MV_U32 *interruptEvent, MV_U32 *interruptStatus) | |
{ | |
MV_U32 interrupt; | |
MV_U32 interruptRawEvent; | |
MV_U32 bip8InterruptValue; | |
#ifdef MV_GPON_PERFORMANCE_CHECK | |
S_GponPerformanceCheckNode *tmpPmCheckNode; | |
#endif /* MV_GPON_PERFORMANCE_CHECK */ | |
#ifdef MV_GPON_PERFORMANCE_CHECK | |
tmpPmCheckNode = &(g_GponPmCheck.pmCheckNode[PON_ISR_PERFORMANCE]); | |
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, | |
&(tmpPmCheckNode->uSecCntStart[tmpPmCheckNode->uSecCntIdx]), 0); | |
#endif /* MV_GPON_PERFORMANCE_CHECK */ | |
mvOnuGponMacPonInterruptGet(&interrupt); | |
g_onuGponCurrentInterrupt &= 0xFFFF0000; | |
g_onuGponCurrentInterrupt |= interrupt; | |
interruptRawEvent = (g_onuGponCurrentInterrupt >> ONU_GPON_EVENT_SHIFT) & | |
ONU_GPON_INTERRUPTS; | |
if (interruptRawEvent & ONU_GPON_BIP_INERVAL_MASK) | |
{ | |
mvOnuGponMacBipInterruptStatusValueGet(&bip8InterruptValue); | |
onuGponDbBipInterruptStatusValueSet(bip8InterruptValue); | |
} | |
*interruptEvent = (g_onuGponCurrentInterrupt >> ONU_GPON_EVENT_SHIFT) & ONU_GPON_INTERRUPTS; | |
*interruptStatus = (g_onuGponCurrentInterrupt ) & ONU_GPON_INTERRUPTS; | |
onuGponSyncLog(ONU_GPON_LOG_INTERRUPT, g_onuGponCurrentInterrupt, 0, 0); | |
g_onuGponCurrentInterrupt = 0; | |
#ifdef MV_GPON_PERFORMANCE_CHECK | |
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, | |
&(tmpPmCheckNode->uSecCntStop[tmpPmCheckNode->uSecCntIdx]), 0); | |
if(tmpPmCheckNode->uSecCntIdx < 255) tmpPmCheckNode->uSecCntIdx++; | |
#endif /* MV_GPON_PERFORMANCE_CHECK */ | |
} | |
/******************************************************************************* | |
** | |
** onuGponIsrRoutine | |
** | |
*******************************************************************************/ | |
void onuGponIsrRoutine(MV_U32 event, MV_U32 status) | |
{ | |
MV_BOOL state; | |
MV_U32 interruptEvent; | |
MV_U32 interruptStatus; | |
#ifdef MV_GPON_DEBUG_PRINT | |
MV_U32 timer = 0; | |
#endif | |
#ifdef MV_GPON_HW_INTERRUPT | |
onuGponIsrLowRoutine(&interruptEvent, &interruptStatus); | |
#else | |
interruptEvent = event; | |
interruptStatus = status; | |
#endif /* MV_GPON_HW_INTERRUPT */ | |
if (g_ponDebugMode != MV_TRUE) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, &timer, 0); | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event(0x%08x) Status(0x%08x) timestamp(%d)\n", | |
__FILE_DESC__, __LINE__, interruptEvent, interruptStatus, timer); | |
#endif | |
if (interruptEvent & ONU_GPON_XVR_SIGNAL_DETECT_STATUS_MASK) | |
{ | |
state = ponXvrFunc(interruptStatus, ONU_GPON_XVR_SIGNAL_DETECT_STATUS_MASK); | |
if (state == MV_TRUE) | |
{ | |
onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOS_ALARM, MV_FALSE); | |
/* Set signal detect to ON */ | |
onuGponDbOnuSignalDetectSet(1); | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Set signal detect to ON = 1 \n", __FILE_DESC__, __LINE__); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
#ifndef PON_FPGA | |
onuGponIsrXvrReset(); | |
onuGponIsrXvrResetStateSet(MV_TRUE); | |
//onuGponPonMngIntrMessageHandler(); | |
#endif /* PON_FPGA */ | |
} | |
else if (state == MV_FALSE) | |
{ | |
onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOS_ALARM, MV_TRUE); | |
/* Set signal detect to OFF */ | |
onuGponDbOnuSignalDetectSet(0); | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Set signal detect to OFF = 0\n", __FILE_DESC__, __LINE__); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
onuGponSyncLog(ONU_GPON_LOG_INTERRUPT_XVR_SD, state, 0, 0); | |
} | |
if (interruptEvent & ONU_GPON_LOS_ALARM_MASK) | |
{ | |
// state = (interruptStatus & ONU_GPON_LOS_ALARM_MASK) ? MV_TRUE : MV_FALSE; | |
// onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOS_ALARM, state); | |
} | |
if (interruptEvent & ONU_GPON_LOF_ALARM_MASK) | |
{ | |
state = (interruptStatus & ONU_GPON_LOF_ALARM_MASK) ? MV_TRUE : MV_FALSE; | |
onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LOF_ALARM, state); | |
onuGponSyncLog(ONU_GPON_LOG_INTERRUPT_LOF, state, 0, 0); | |
// if (state == MV_TRUE) | |
// { | |
// /* Set DS Sync Ind to OFF */ | |
// //onuGponDbOnuDsSyncOnSet(0); | |
// } | |
// else if (state == MV_FALSE) | |
// { | |
// /* Set DS Sync Ind to ON */ | |
// //onuGponDbOnuDsSyncOnSet(1); | |
// } | |
if (state != MV_TRUE) | |
onuGponPonMngIntrMessageHandler(); | |
} | |
if (interruptEvent & ONU_GPON_LCDG_ALARM_MASK) | |
{ | |
// state = (interruptStatus & ONU_GPON_LCDG_ALARM_MASK) ? MV_TRUE : MV_FALSE; | |
// onuGponPonMngIntrAlarmHandler(ONU_PON_MNGR_LCDG_ALARM, state); | |
} | |
if (interruptEvent & ONU_GPON_DS_PLOAM_MASK) | |
{ | |
onuGponPonMngIntrMessageHandler(); | |
} | |
if (interruptEvent & ONU_GPON_BIP_INERVAL_MASK) | |
{ | |
onuGponPonMngIntrBeCounterHandler(); | |
} | |
if (interruptEvent & ONU_GPON_RAM_TEST_GRX_PARITY_ERR_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
if (interruptEvent & ONU_GPON_RAM_TEST_GEM_PARITY_ERR_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
if (interruptEvent & ONU_GPON_RAM_TEST_GTX_PARITY_ERR_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
if (interruptEvent & ONU_GPON_RAM_TEST_UTM_PARITY_ERR_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
if (interruptEvent & ONU_GPON_PHY_READY_STATUS_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
if (interruptEvent & ONU_GPON_PHY_SIGNAL_DETECT_STATUS_MASK) | |
{ | |
#ifdef MV_GPON_DEBUG_PRINT | |
mvPonPrint(PON_PRINT_DEBUG, PON_ISR_MODULE, | |
"DEBUG: (%s:%d) Event 0x%x - Not supported\n", __FILE_DESC__, __LINE__, interruptEvent); | |
#endif /* MV_GPON_DEBUG_PRINT */ | |
} | |
} | |
} | |
/******************************************************************************* | |
** | |
** onuGponPonMngDebugModeSet | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function configure onu debug mode | |
** | |
** PARAMETERS: MV_BOOL mode | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: None | |
** | |
*******************************************************************************/ | |
void onuGponPonMngDebugModeSet(MV_BOOL mode) | |
{ | |
g_ponDebugMode = mode; | |
} | |
/******************************************************************************* | |
** | |
** onuGponPonMngDebugModeGet | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function returns onu debug mode | |
** | |
** PARAMETERS: None | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: Debug mode | |
** | |
*******************************************************************************/ | |
MV_BOOL onuGponPonMngDebugModeGet(void) | |
{ | |
return(g_ponDebugMode); | |
} | |
#ifndef PON_FPGA | |
/******************************************************************************* | |
** | |
** onuGponIsrXvrReset | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function reset xvr | |
** | |
** PARAMETERS: None | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: MV_OK or error | |
** | |
*******************************************************************************/ | |
MV_STATUS onuGponIsrXvrReset(void) | |
{ | |
MV_STATUS status; | |
MV_U32 onuState; | |
MV_U32 initDone; | |
MV_U32 durationStart = 0; | |
MV_U32 durationEnd = 0; | |
onuState = onuGponDbOnuStateGet(); | |
if ((onuState == ONU_GPON_01_INIT) || | |
((onuState == ONU_GPON_07_EMERGANCY_STOP) && (onuGponAsicAlarmStatusGet() == ONU_GPON_ALARM_ON)) || | |
((onuState == ONU_GPON_06_POPUP) && ((onuGponAlarmGet(ONU_GPON_ALARM_LOS) == ONU_GPON_ALARM_OFF) && | |
(onuGponAlarmGet(ONU_GPON_ALARM_LOF) == ONU_GPON_ALARM_ON)))) | |
{ | |
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, &durationStart, 0); | |
onuGponSyncLog(ONU_GPON_LOG_INTERRUPT_SERDES_START, 0, 0, 0); | |
status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_0_RX_INIT, 0x1, 0); | |
if (status != MV_OK) | |
return(status); | |
do | |
{ | |
status = asicOntMiscRegRead(mvAsicReg_PON_SERDES_PHY_CTRL_0_INIT_DONE, &initDone, 0); | |
if (status != MV_OK) | |
return(status); | |
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, &durationEnd, 0); | |
if (abs((durationEnd - durationStart)) >= 6000) | |
return (MV_OK); | |
} while (initDone == 0); | |
status = asicOntMiscRegWrite(mvAsicReg_PON_SERDES_PHY_CTRL_0_RX_INIT, 0x0, 0); | |
if (status != MV_OK) | |
return(status); | |
onuGponSyncLog(ONU_GPON_LOG_INTERRUPT_SERDES_STOP, 0, 0, 0); | |
} | |
else | |
{ | |
return(MV_NO_XVR_RST); | |
} | |
return (MV_OK); | |
} | |
/******************************************************************************* | |
** | |
** onuGponIsrXvrResetStateSet | |
** ____________________________________________________________________________ | |
** | |
** DESCRIPTION: The function enable / disable onu xvr reset timer | |
** | |
** PARAMETERS: MV_BOOL mode | |
** | |
** OUTPUTS: None | |
** | |
** RETURNS: MV_OK or error | |
** | |
*******************************************************************************/ | |
MV_STATUS onuGponIsrXvrResetStateSet(MV_BOOL mode) | |
{ | |
MV_STATUS rcode = MV_OK; | |
if (mode == MV_TRUE) | |
{ | |
onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonIsrXvrRstTimerId)); | |
} | |
else | |
{ | |
onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonIsrXvrRstTimerId)); | |
} | |
return (rcode); | |
} | |
#endif /* PON_FPGA */ | |