| /******************************************************************************* |
| 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. |
| |
| ******************************************************************************/ |
| |
| /******************************************************************************/ |
| /** **/ |
| /** MODULE : ONU EPON **/ |
| /** **/ |
| /** FILE : eponOnuMngr.c **/ |
| /** **/ |
| /** DESCRIPTION : This file implements ONU EPON Manager functionality **/ |
| /** **/ |
| /****************************************************************************** |
| * * |
| * MODIFICATION HISTORY: * |
| * * |
| * 26Jan10 oren_ben_hayun created * |
| * ========================================================================== * |
| * |
| ******************************************************************************/ |
| |
| /* Include Files |
| ------------------------------------------------------------------------------*/ |
| #include "eponOnuHeader.h" |
| |
| /* Local Constant |
| ------------------------------------------------------------------------------*/ |
| #define __FILE_DESC__ "mv_pon/core/epon/eponOnuMngr.c" |
| |
| #define OAM_MSG_NOT_TRANS (0xFFFF) |
| #define OAM_MSG_FIFO_LENGTH (16) |
| #define OAM_MSG_REGS (10) |
| #define OAM_MSG_DG_IND (1) |
| |
| #define DBA_RPRT_MAX_SIZE (35) /* Report via EPON REGS */ |
| |
| #define DBA_RPRT_PERIODIC_CYCLE (6) |
| #define DBA_RPRT_TX_FIFO_SIZE (4*1024) |
| |
| /* Global Variables |
| ------------------------------------------------------------------------------*/ |
| extern spinlock_t onuPonIrqLock; |
| |
| extern MV_U8 fixMacAddrs[8][6]; |
| |
| /* Local Variables |
| ------------------------------------------------------------------------------*/ |
| |
| /* HW DBA params */ |
| MV_U32 dbaRprtState = 0; /* TO */ |
| MV_U32 dbaRprtT0StateVal = 0x43FF; |
| MV_U32 dbaRprtT0StateInterval = ONU_PON_TIMER_HW_RPRT_T0_INTERVAL; |
| MV_U32 dbaRprtT1StateVal = 0x07FF; |
| MV_U32 dbaRprtT1StateInterval = ONU_PON_TIMER_HW_RPRT_T1_INTERVAL; |
| |
| /* SW DBA params */ |
| |
| MV_U32 llidDbaRprtCount = 0; |
| MV_U32 llidDbaRprtValue = 0; |
| |
| MV_U32 llidDbaRprtForOamMsgInd = 0; |
| |
| MV_U32 llidCounter[8] = {0,0,0,0,0,0,0,0}; |
| |
| MV_U32 llidQueueState[8][4][8] = { |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}} |
| }; |
| |
| MV_U32 llidQueueThreshold[8][4][8] = { |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}}, |
| {{0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}, |
| {0,0,0,0,0,0,0,0}} |
| }; |
| |
| MV_U32 llidNumOfQueuesets[8] = {0,0,0,0,0,0,0,0}; |
| |
| MV_U32 llidNumOfQueues[8] = {0,0,0,0,0,0,0,0}; |
| |
| MV_U32 llidQueuesBitMap[8] = {0,0,0,0,0,0,0,0}; |
| |
| MV_U32 llidNumOfReportBytes[8] = {0,0,0,0,0,0,0,0}; |
| |
| /* SW DBA array for Mix mode SW/HW */ |
| S_OnuEponDbaShadowRegMap dbaSwRprtRegShadow[] = |
| { |
| /* Index 0 - queueset*/{mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_SET, 0}, |
| /* Index 1 - bitmap*/ {mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, 0}, |
| /* Index 2 - queue0*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 0}, |
| /* Index 3 - queue1*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 0}, |
| /* Index 4 - queue2*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 0}, |
| /* Index 5 - queue3*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 0}, |
| /* Index 6 - queue4*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 0}, |
| /* Index 7 - queue5*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 0}, |
| /* Index 8 - queue6*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 0}, |
| /* Index 9 - queue7*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 0} |
| }; |
| |
| S_OnuEponDbaSwRprtRegMap dbaSwRprtRegMap[] = |
| { |
| /* 0 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_SET, 0, 0}, |
| /* 1 */ {mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, 0, 1}, |
| /* 2 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 8, 2}, |
| /* 3 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 0, 2}, |
| /* 4 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 8, 3}, |
| /* 5 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 0, 3}, |
| /* 6 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 8, 4}, |
| /* 7 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 0, 4}, |
| /* 8 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 8, 5}, |
| /* 9 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 0, 5}, |
| /* 10 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 8, 6}, |
| /* 11 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 0, 6}, |
| /* 12 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 8, 7}, |
| /* 13 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 0, 7}, |
| /* 14 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 8, 8}, |
| /* 15 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 0, 8}, |
| /* 16 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 8, 9}, |
| /* 17 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 0, 9}, |
| /* 18 */ {mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, 8, 1}, |
| /* 19 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 24, 2}, |
| /* 20 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 16, 2}, |
| /* 21 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 24, 3}, |
| /* 22 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 16, 3}, |
| /* 23 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 24, 4}, |
| /* 24 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 16, 4}, |
| /* 25 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 24, 5}, |
| /* 26 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 16, 5}, |
| /* 27 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 24, 6}, |
| /* 28 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 16, 6}, |
| /* 29 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 24, 7}, |
| /* 30 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 16, 7}, |
| /* 31 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 24, 8}, |
| /* 32 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 16, 8}, |
| /* 33 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 24, 9}, |
| /* 34 */ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 16, 9} |
| }; |
| |
| /* SW DBA array for Mix mode SW/HW */ |
| S_OnuEponDbaShadowRegMap dbaDgSwRprtRegShadow[] = |
| { |
| /* Index 0 - queueset*/{mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_SET, 0x00000001}, |
| /* Index 1 - bitmap*/ {mvAsicReg_EPON_TXM_CPP_RPRT_BIT_MAP, 0x000000FF}, |
| /* Index 2 - queue7*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_0, 0x00000000}, |
| /* Index 3 - queue6*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_1, 0x00000000}, |
| /* Index 4 - queue5*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_2, 0x00000000}, |
| /* Index 5 - queue4*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_3, 0x00000000}, |
| /* Index 6 - queue3*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_4, 0x00000000}, |
| /* Index 7 - queue2*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_5, 0x00000000}, |
| /* Index 8 - queue1*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_6, 0x00000000}, |
| /* Index 9 - queue0*/ {mvAsicReg_EPON_TXM_CPP_RPRT_QUEUE_7, 0x0000FFFF} |
| }; |
| |
| MV_U32 llidPacketFcsCompensation[] = |
| { |
| /* 0 0 add 0 */ 0, |
| /* 1 64 add 1/2 */ 2, |
| /* 2 128 add 1/4 */ 4, |
| /* 3 192 add 1/6 */ 6, |
| /* 4 256 add 1/5 */ 5, |
| /* 5 320 add 1/6 */ 6, |
| /* 6 384 add 1/8 */ 8, |
| /* 7 448 add 1/8 */ 8, |
| /* 8 512 add 1/8 */ 8, |
| /* 9 576 add 1/9 */ 9, |
| /* 10 640 add 1/10 */ 10, |
| /* 11 704 add 1/10 */ 10, |
| /* 12 768 add 1/10 */ 10, |
| /* 13 832 add 1/11 */ 11, |
| /* 14 896 add 1/11 */ 11, |
| /* 15 960 add 1/11 */ 11, |
| /* 16 1024 add 1/11 */ 11, |
| /* 17 1088 add 1/12 */ 12, |
| /* 18 1152 add 1/12 */ 12, |
| /* 19 1216 add 1/12 */ 12, |
| /* 20 1280 add 1/12 */ 12, |
| /* 21 1344 add 1/12 */ 12, |
| /* 22 1408 add 1/12 */ 12, |
| /* 23 1472 add 1/12 */ 12, |
| /* 24 1536 add 1/12 */ 12, |
| /* 25 1600 add 1/12 */ 12, |
| /* 26 1664 add 1/12 */ 12, |
| /* 27 1728 add 1/12 */ 12, |
| /* 28 1792 add 1/12 */ 12, |
| /* 29 1856 add 1/12 */ 12, |
| /* 30 1920 add 1/12 */ 12, |
| /* 31 1984 add 1/12 */ 12, |
| /* 32 2048 add 1/12 */ 12 |
| }; |
| |
| /* SW DBA report additional bandwidth params */ |
| MV_U32 rprtLowRateThreshold; |
| MV_U32 rprtLowRateValue; |
| MV_U32 rprtLowRateConstValue; |
| MV_U32 rprtHighRateThreshold; |
| MV_U32 rprtHighRateValue; |
| |
| /* SW DBA report message */ |
| MV_U8 reportMsg[40]; |
| MV_U8 reportMsgIdx; |
| |
| /* OAM message transmission handling */ |
| //S_OnuEponOamMsg oamDgMsgQueue; |
| S_OnuEponOamMsg oamMsgData[OAM_MSG_FIFO_LENGTH]; |
| |
| /* Data array pointers definition */ |
| MV_U8 oamMsgWriteIndex = 0; |
| MV_U8 oamMsgReadIndex = 0; |
| |
| /* Dying Gasp message parameters */ |
| MV_U16 dgMsgEtype = 0x8809; /* Slow Protocol */ |
| MV_U16 dgMsgSubType = 0x03; /* OAM */ |
| MV_U16 dgMsgFlags = 0x52; /* Dying Gasp */ |
| MV_U8 dgMsgCode = 0x0; /* Information OAMPDU */ |
| S_OnuEponCtrlBuffer dgOamMsg; |
| |
| /* Export Functions |
| ------------------------------------------------------------------------------*/ |
| |
| /* Local Functions |
| ------------------------------------------------------------------------------*/ |
| /* Interrupt handler Functions */ |
| void onuEponPonMngIntrAlarmHandler(MV_U32 alarm, MV_BOOL alarmStatus); |
| void onuEponPonMngIntrMessageHandler(MV_U32 msg); |
| void onuEponPonMngIntrRxCtrlFifoCleanup(void); |
| MV_STATUS onuEponPonMngIntrCtrlMessageHandler(S_OnuEponCtrlBuffer *ctrlBuf); |
| MV_STATUS onuEponPonMngIntrRprtMessageHandler(S_OnuEponCtrlBuffer *ctrlBuf); |
| MV_STATUS onuEponPonMngTimerRprtMessageHandler(MV_U32 macId); |
| |
| /* State Machine Functions */ |
| MV_STATUS onuEponPonMngRegMsgFlagAck(S_OnuEponRegMpcFrame *mpcFrame); |
| MV_STATUS onuEponPonMngRegMsgFlagNack(S_OnuEponRegMpcFrame *mpcFrame); |
| MV_STATUS onuEponPonMngRegMsgFlagReReg(S_OnuEponRegMpcFrame *mpcFrame); |
| MV_STATUS onuEponPonMngRegMsgFlagDeReg(S_OnuEponRegMpcFrame *mpcFrame); |
| |
| /* MPC Message Handling Functions */ |
| MV_STATUS onuEponReadCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf); |
| MV_STATUS onuEponRetrieveCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf); |
| MV_STATUS onuEponReadReportFrameData(S_OnuEponCtrlBuffer *ctrlBuf); |
| MV_STATUS onuEponRetrieveReportFrameData(S_OnuEponCtrlBuffer *ctrlBuf); |
| |
| void onuEponConvertN2HShort(void *srcValPtr, void *destValPtr); |
| void onuEponConvertN2HLong(void *srcValPtr, void *destValPtr); |
| void onuEponConvertH2NShort(void *srcValPtr, void *destValPtr); |
| void onuEponConvertH2NLong(void *srcValPtr, void *destValPtr); |
| |
| MV_STATUS onuEponOamMsgFifoInit(void); |
| MV_STATUS onuEponPonMngDbaParamsInit(void); |
| MV_STATUS onuEponPonMngDbaHwRprtHandler(void); |
| MV_STATUS onuEponPonMngDbaSwRprtHandler(void); |
| MV_STATUS onuEponPonMngDbaDgSwRprtHandler(void); |
| |
| MV_STATUS onuEponSendCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf, MV_U32 macId); |
| MV_BOOL onuEponSendCtrlFrameDataFreeStatus(MV_U32 macId); |
| |
| void onuEponDgMsgDefaultMessageInit(void); |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* Init Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngAlarmHandlerExecute |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function init EPON App |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponAppInit(void) |
| { |
| MV_U32 macId; |
| |
| onuEponOamMsgFifoInit(); |
| onuEponDgMsgDefaultMessageInit(); |
| onuEponPonMngDbaParamsInit(); |
| for (macId = 0; macId < 8; macId++) |
| onuEponDbaInfoUpdate(macId); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponOamMsgFifoInit |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function init OAM messages FIFO |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponOamMsgFifoInit(void) |
| { |
| memset(oamMsgData, 0, sizeof(S_OnuEponOamMsg) * 8); |
| // memset(&oamDgMsgQueue, 0, sizeof(S_OnuEponOamMsg)); |
| |
| return(MV_OK); |
| } |
| |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaParamsInit |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function init DBA Report parameters |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngDbaParamsInit(void) |
| { |
| rprtLowRateThreshold = ONU_EPON_DBA_LOW_RATE_THRESHOLD; |
| rprtLowRateValue = ONU_EPON_DBA_LOW_RATE_VALUE; |
| rprtLowRateConstValue = ONU_EPON_DBA_LOW_RATE_CONST_VALUE; |
| rprtHighRateThreshold = ONU_EPON_DBA_HIGH_RATE_THRESHOLD; |
| rprtHighRateValue = ONU_EPON_DBA_HIGH_RATE_VALUE; |
| |
| /* LLID0 configuration */ |
| onuEponPmGunitLlid0PktModMaxHeaderSizeSet(0); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponDbaInfoUpdate |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function init DBA Report parameters |
| ** |
| ** PARAMETERS: MV_U32 macId |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponDbaInfoUpdate(MV_U32 macId) |
| { |
| MV_U32 queueId; |
| MV_U32 queueSetId; |
| |
| llidNumOfQueues[macId] = onuEponDbOnuDbaNumOfQueuesGet(macId); |
| llidQueuesBitMap[macId] = onuEponDbOnuDbaQueuesBitMapGet(macId); |
| llidNumOfQueuesets[macId] = onuEponDbOnuDbaNumOfQueuesetGet(macId); |
| |
| llidNumOfReportBytes[macId] = (((llidNumOfQueuesets[macId] * llidNumOfQueues[macId]) * 2) + /* number of bytes for queues */ |
| llidNumOfQueuesets[macId] + /* number of bytes for bit map */ |
| 1); /* number of bytes for #queuesets */ |
| if (llidNumOfReportBytes[macId] > DBA_RPRT_MAX_SIZE) /* hardware limit */ |
| llidNumOfReportBytes[macId] = DBA_RPRT_MAX_SIZE; |
| |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE, |
| "MAC[%d] QSet(%d) Q(%d) Rbytes(%d)\n", |
| macId, llidNumOfQueuesets[macId], llidNumOfQueues[macId], llidNumOfReportBytes[macId]); |
| |
| for (queueSetId = 0; queueSetId < llidNumOfQueuesets[macId]; queueSetId++) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE, |
| "QSet(%d) Q[thres:state]", queueSetId); |
| |
| for (queueId = 0; queueId < EPON_MAX_QUEUE; queueId++) |
| { |
| onuEponDbOnuDbaQueueThresholdGet(&(llidQueueThreshold[macId][queueSetId][queueId]), |
| &(llidQueueState[macId][queueSetId][queueId]), |
| queueId, queueSetId, macId); |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE, |
| "[%d:%d]", |
| llidQueueThreshold[macId][queueSetId][queueId], |
| llidQueueState[macId][queueSetId][queueId]); |
| } |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "\n"); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* Alarm Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngAlarmHandlerExecute |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt alarm |
| ** functionality |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngAlarmHandlerExecute(MV_U32 macId) |
| { |
| MV_STATUS status; |
| MV_U32 startMacId; |
| MV_U32 endMacId; |
| MV_U32 interruptMask; |
| LINKSTATUSFUNC linkStatusCallback; |
| |
| if (macId == ALL_MAC_INDICATION) |
| { |
| startMacId = 0; |
| endMacId = EPON_MAX_MAC_NUM; |
| } |
| else |
| { |
| startMacId = macId; |
| endMacId = macId + 1; |
| } |
| |
| if ((macId == 0) || (macId == ALL_MAC_INDICATION)) |
| { |
| if (onuEponDbModeGet() == E_EPON_IOCTL_STD_MODE) |
| { |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "===================\n"); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "== MPCP Sync Off ==\n"); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "===================\n"); |
| } |
| } |
| |
| if (onuEponDbOnuSwRprtTimerTypeGet() == ONU_EPON_SW_DBA_RPRT_TIMER) |
| { |
| /* Stop SW DBA event miss timer */ |
| onuEponIsrTimerEventMissStateSet(MV_FALSE); |
| |
| /* Clear onu DBA Report interrupt */ |
| mvOnuEponMacPonInterruptMaskGet(&interruptMask); |
| interruptMask &= ~(ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK); |
| mvOnuEponMacPonInterruptMaskSet(interruptMask); |
| } |
| else |
| { |
| /* Clear onu DBA Report Timer */ |
| onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonHwRprtTimerId)); |
| } |
| |
| /* handle silence mode */ |
| if (onuEponDbOnuSilenceStateGet() != ONU_SILENCE_NOT_ACTIVE) |
| { |
| |
| /* Clear onu Silence Timers */ |
| for (macId = startMacId; macId < endMacId; macId++) |
| { |
| 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; |
| } |
| |
| onuEponDbOnuCfgAutoSet(ONU_REG_REQ_AUTO_RES, ONU_REG_ACK_AUTO_RES, ONU_REPORT_AUTO_RES); |
| } |
| |
| for (macId = startMacId; macId < endMacId; macId++) |
| { |
| /* re-init onu database */ |
| status = onuEponDbReInit(macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Failed to re-init onu database\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| |
| /* init onu Asic */ |
| status = onuEponAsicReInit(macId, ONU_SILENCE_DISABLED); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Failed to re-init onu EPON MAC\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| } |
| |
| /* Call link status callback function */ |
| linkStatusCallback = onuEponDbLinkStatusCallbackGet(); |
| if (linkStatusCallback != NULL) |
| { |
| if (onuEponForceTxDownStateGet(0) != MV_TRUE) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_ISR_INT_MODULE, |
| "DEBUG: (%s:%d) Notify link is DOWN\n", __FILE_DESC__, __LINE__); |
| linkStatusCallback(MV_FALSE); |
| } |
| } |
| |
| if (onuEponDbOnuHoldoverStateGet() != ONU_HOLDOVER_NOT_ACTIVE) |
| { |
| if (onuEponDbOnuHoldoverExecGet() != ONU_HOLDOVER_NOT_ACTIVE) |
| { |
| onuEponDbOnuHoldoverExecSet(ONU_HOLDOVER_NOT_ACTIVE); |
| } |
| } |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrAlarmHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt alarm |
| ** functionality |
| ** |
| ** PARAMETERS: MV_U32 alarm |
| ** MV_U32 alarmStatus |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngIntrAlarmHandler(MV_U32 alarm, MV_BOOL alarmStatus) |
| { |
| if (alarmStatus != MV_FALSE) { |
| |
| /* alarm is ON */ |
| if (onuEponDbOnuHoldoverStateGet() != ONU_HOLDOVER_NOT_ACTIVE) { |
| if (onuEponDbOnuHoldoverExecGet() != ONU_HOLDOVER_ACTIVE) { |
| /* start onu epon pon holdover timer */ |
| onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonHoldoverTimerId)); |
| onuEponDbOnuHoldoverExecSet(ONU_HOLDOVER_ACTIVE); |
| mvPonPrint(PON_PRINT_DEBUG, PON_ISR_STATE_MODULE, |
| "DEBUG: (%s:%d) Holdover Timer Start(Intr)\n", __FILE_DESC__, __LINE__); |
| } |
| } else |
| onuEponPonMngAlarmHandlerExecute(ALL_MAC_INDICATION); |
| |
| /* update alarm */ |
| onuEponAlarmSet(alarm, alarmStatus); |
| |
| } else { |
| |
| /* alarm is OFF */ |
| if (onuEponDbOnuHoldoverStateGet() != ONU_HOLDOVER_NOT_ACTIVE) { |
| if (onuEponDbOnuHoldoverExecGet() != ONU_HOLDOVER_NOT_ACTIVE) { |
| /* stop onu epon pon holdover timer */ |
| onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonHoldoverTimerId)); |
| onuEponDbOnuHoldoverExecSet(ONU_HOLDOVER_NOT_ACTIVE); |
| mvPonPrint(PON_PRINT_DEBUG, PON_ISR_STATE_MODULE, |
| "DEBUG: (%s:%d) Holdover Timer Stop\n", __FILE_DESC__, __LINE__); |
| } |
| } |
| |
| /* update alarm */ |
| onuEponAlarmSet(alarm, alarmStatus); |
| } |
| } |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* Register Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrRegHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt register |
| ** functionality |
| ** |
| ** PARAMETERS: MV_U32 reg |
| ** MV_U32 regStatus |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngIntrRegHandler(MV_U32 reg, MV_BOOL regStatus) |
| { |
| MV_STATUS status; |
| MV_U32 delay; |
| MV_U32 laser; |
| |
| /* Register State Active */ |
| if (regStatus != MV_FALSE) |
| { |
| delay = ((0x0 << 8) | (0x0 + ONU_DEF_DDM_DELAY)); |
| status = mvOnuEponMacDdmDelaySet(delay); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, |
| "ERROR: (%s:%d) mvAsicReg_EPON_DDM_1814_CONFIG\n\r", __FILE_DESC__, __LINE__); |
| } |
| |
| laser = (ONU_DEF_LASER_ON_OFF_TIME << 24) | |
| (ONU_DEF_LASER_OFF_TIME << 8) | |
| (ONU_DEF_LASER_ON_TIME); |
| 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_API_MODULE, |
| "ERROR: (%s:%d) mvOnuEponMacGenLaserParamSet\n\r", __FILE_DESC__, __LINE__); |
| } |
| |
| mvPonPrint(PON_PRINT_INFO, PON_API_MODULE, |
| "Register State[ON]: DDM_Config(0x%x) LASER_PARAM(0x%x)\n\r", delay, laser); |
| } |
| /* Register State Not - Active */ |
| else |
| { |
| delay = ONU_DEF_DDM_DELAY; |
| status = mvOnuEponMacDdmDelaySet(delay); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, |
| "ERROR: (%s:%d) mvAsicReg_EPON_DDM_1814_CONFIG\n\r", __FILE_DESC__, __LINE__); |
| } |
| |
| laser = (ONU_DEF_LASER_ON_OFF_TIME << 24) | |
| (ONU_DEF_LASER_OFF_TIME << 8) | |
| (ONU_DEF_LASER_ON_TIME); |
| 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_API_MODULE, |
| "ERROR: (%s:%d) mvOnuEponMacGenLaserParamSet\n\r", __FILE_DESC__, __LINE__); |
| } |
| |
| mvPonPrint(PON_PRINT_INFO, PON_API_MODULE, |
| "Register State[OFF]: DDM_Config(0x%x) LASER_PARAM(0x%x)\n\r", delay, laser); |
| } |
| |
| |
| } |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* Message Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngTimerHwRprtTxModHndl |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function transmit OAM frame handling |
| ** |
| ** PARAMETERS: unsigned long data |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngTimerHwRprtTxModHndl(unsigned long data) |
| { |
| unsigned long flags; |
| |
| spin_lock_irqsave(&onuPonIrqLock, flags); |
| |
| onuPonResourceTbl_s.onuPonHwRprtTxModTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE; |
| |
| onuEponPonMngTxCtrlMessageHandler(); |
| |
| if ((onuPonResourceTbl_s.onuPonHwRprtTxModTimerId.onuPonTimerPeriodic) != 0) |
| onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonHwRprtTxModTimerId)); |
| |
| spin_unlock_irqrestore(&onuPonIrqLock, flags); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngTxCtrlMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt MPC message |
| ** functionality |
| ** |
| ** PARAMETERS: MV_U32 msg |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngTxCtrlMessageHandler(void) |
| { |
| MV_STATUS status; |
| |
| status = onuEponOamHandleMsg(); |
| if (status != OAM_MSG_NOT_TRANS) |
| llidDbaRprtForOamMsgInd = 1; |
| |
| if (onuEponDbOnuSwRprtTimerTypeGet() == ONU_EPON_SW_DBA_RPRT_TIMER) |
| onuEponPonMngSwRprtMessageHandler(); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngHwRprtMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA HW report functionality |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngHwRprtMessageHandler(void) |
| { |
| MV_STATUS status; |
| |
| status = onuEponPonMngDbaHwRprtHandler(); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "ERROR: (%s:%d) Handle HW DBA Report\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngSwRprtMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA SW report functionality |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngSwRprtMessageHandler(void) |
| { |
| MV_STATUS status; |
| |
| status = onuEponPonMngDbaSwRprtHandler(); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "ERROR: (%s:%d) Handle SW DBA Report\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager message handling functionality |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngIntrMessageHandler(MV_U32 msg) |
| { |
| MV_STATUS status; |
| S_OnuEponCtrlBuffer ctrlBuf; |
| |
| memset((void*)&ctrlBuf, 0, sizeof (S_OnuEponCtrlBuffer)); |
| |
| if (msg == ONU_EPON_RX_CTRL_MSG) { |
| do { |
| status = onuEponRetrieveCtrlFrameData(&ctrlBuf); |
| if (status != MV_OK) |
| return; |
| |
| status = onuEponPonMngIntrCtrlMessageHandler(&ctrlBuf); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Handle Rx Ctrl Frame\n\r", __FILE_DESC__, __LINE__); |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_RX_ERROR_FRAME_CNT, 0); |
| return; |
| } |
| } while (status == MV_OK); |
| |
| } else if (msg == ONU_EPON_RX_RPRT_MSG) { |
| |
| status = onuEponRetrieveReportFrameData(&ctrlBuf); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Report Frame\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| |
| status = onuEponPonMngIntrRprtMessageHandler(&ctrlBuf); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Handle Rx Report Frame\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| |
| } else { |
| |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Unsupported Frame\n\r", __FILE_DESC__, __LINE__); |
| return; |
| } |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrRxCtrlFifoCleanup |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function clear the pon manager RX ctrl message FIFO |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngIntrRxCtrlFifoCleanup(void) |
| { |
| MV_STATUS status; |
| S_OnuEponCtrlBuffer ctrlBuf; |
| |
| memset((void*)&ctrlBuf, 0, sizeof (S_OnuEponCtrlBuffer)); |
| |
| do { |
| status = onuEponRetrieveCtrlFrameData(&ctrlBuf); |
| |
| } while (status == MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrCtrlMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt MPC Ctrl |
| ** message functionality |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngIntrCtrlMessageHandler(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| MV_STATUS status; |
| S_OnuEponGenMpcFrame *genMpcMsg; |
| S_OnuEponRegMpcFrame *regMpcMsg; |
| MV_U16 regOpcode; |
| MV_U16 regFlags; |
| |
| genMpcMsg = (S_OnuEponGenMpcFrame *)ctrlBuf->data; |
| onuEponConvertN2HShort(&genMpcMsg->genMpcPdu.opCode, ®Opcode); |
| |
| if (regOpcode == MPC_OPCODE_REGISTER) { |
| |
| regMpcMsg = (S_OnuEponRegMpcFrame *)ctrlBuf->data; |
| regFlags = regMpcMsg->regMpcPdu.flags; |
| |
| if (regFlags == REGISTER_FLAGS_ACK) { |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_REGISTER_ACK_CNT, 0); |
| |
| status = onuEponPonMngRegMsgFlagAck(regMpcMsg); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Register with flag Ack\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| } else if (regFlags == REGISTER_FLAGS_NACK) { |
| |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_REGISTER_NACK_CNT, 0); |
| |
| status = onuEponPonMngRegMsgFlagNack(regMpcMsg); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Register with flag Nack\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| } else if (regFlags == REGISTER_FLAGS_REREG) { |
| |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_REGISTER_REREG_FRAME_CNT, 0); |
| |
| status = onuEponPonMngRegMsgFlagReReg(regMpcMsg); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Register with flag Re-Register\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| } else if (regFlags == REGISTER_FLAGS_DEREG) { |
| |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_REGISTER_DEREG_FRAME_CNT, 0); |
| |
| status = onuEponPonMngRegMsgFlagDeReg(regMpcMsg); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Register with flag De-Register\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| } else { |
| |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Invalid Control message flag(%d)\n\r", __FILE_DESC__, __LINE__, regFlags); |
| return(MV_ERROR); |
| } |
| |
| } |
| |
| return(MV_OK); |
| |
| } /* end of onuEponPonMngIntrCtrlMessageHandler */ |
| |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrRprtMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt MPC Report |
| ** message functionality |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngIntrRprtMessageHandler(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Report Messages are handled by the EPON MAC\n\r", __FILE_DESC__, __LINE__); |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngTimerRprtMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager interrupt MPC Report |
| ** message transmit function |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngTimerRprtMessageHandler(MV_U32 macId) |
| { |
| MV_STATUS status; |
| S_OnuEponCtrlBuffer ctrlBuf; |
| S_OnuEponGenMpcFrame *genMpcMsg; |
| MV_U16 msgEtype = 0x8808; |
| MV_U16 msgOpcode = 0x0003; |
| MV_U16 reportIdx; |
| MV_U16 frameIdx; |
| |
| /* clear message */ |
| memset(&ctrlBuf, 0, MIN_RPRT_FRAME_LEN); |
| |
| /* set message length */ |
| ctrlBuf.length = MIN_RPRT_FRAME_LEN; |
| |
| genMpcMsg = (S_OnuEponGenMpcFrame *)&(ctrlBuf.data); |
| |
| /* update message content */ |
| genMpcMsg->stdEthFrame.destAddr[0] = 0x01; |
| genMpcMsg->stdEthFrame.destAddr[1] = 0x80; |
| genMpcMsg->stdEthFrame.destAddr[2] = 0xC2; |
| genMpcMsg->stdEthFrame.destAddr[3] = 0x00; |
| genMpcMsg->stdEthFrame.destAddr[4] = 0x00; |
| genMpcMsg->stdEthFrame.destAddr[5] = 0x01; |
| |
| onuEponConvertH2NShort(&msgEtype, &genMpcMsg->stdEthFrame.etherType); |
| |
| onuEponConvertH2NShort(&msgOpcode, &genMpcMsg->genMpcPdu.opCode); |
| |
| genMpcMsg->genMpcPdu.timeStamp = 0; |
| |
| genMpcMsg->stdEthFrame.srcAddr[0] = fixMacAddrs[macId][0]; |
| genMpcMsg->stdEthFrame.srcAddr[1] = fixMacAddrs[macId][1]; |
| genMpcMsg->stdEthFrame.srcAddr[2] = fixMacAddrs[macId][2]; |
| genMpcMsg->stdEthFrame.srcAddr[3] = fixMacAddrs[macId][3]; |
| genMpcMsg->stdEthFrame.srcAddr[4] = fixMacAddrs[macId][4]; |
| genMpcMsg->stdEthFrame.srcAddr[5] = fixMacAddrs[macId][5]; |
| |
| for (reportIdx = 0, frameIdx = 20; reportIdx < 40; reportIdx++, frameIdx++) |
| { |
| ctrlBuf.data[frameIdx] = reportMsg[reportIdx]; |
| } |
| |
| status = onuEponSendCtrlFrameData(&ctrlBuf, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Handle OAM Message\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** ======================================================================== ** |
| ** SW Report Section ** |
| ** ======================================================================== ** |
| *******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaSwRprtAddQueueSetThreshold |
| ** |
| *******************************************************************************/ |
| //void onuEponPonMngDbaSwRprtAddQueueSetThreshold(MV_32 queueSetIdx, MV_32 queueIdx) |
| //{ |
| // if (llidQueueState[queueSetIdx][queueIdx] != 0) |
| // { |
| // if (llidCounter[queueIdx] > llidQueueThreshold[queueSetIdx][queueIdx]) |
| // { |
| // reportMsg[reportMsgIdx++] = ((llidQueueThreshold[queueSetIdx][queueIdx] >> 8) & 0xFF); |
| // reportMsg[reportMsgIdx++] = (llidQueueThreshold[queueSetIdx][queueIdx] & 0xFF); |
| // } |
| // else |
| // { |
| // reportMsg[reportMsgIdx++] = ((llidCounter[queueIdx] >> 8) & 0xFF); |
| // reportMsg[reportMsgIdx++] = (llidCounter[queueIdx] & 0xFF); |
| // } |
| // } |
| //} |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaSwRprtHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA SW report handler |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngDbaSwRprtHandler(void) |
| { |
| MV_STATUS status = MV_OK; |
| MV_U32 idx; |
| MV_U32 llidIdx; |
| MV_32 queueSetIdx; |
| MV_32 queueIdx; |
| MV_U32 msgIdx; |
| MV_U32 msgTmpData; |
| MV_U32 llidQueuesByteCount; |
| MV_U32 llidTotalByteCount; |
| MV_U32 llidAvePacketLength; |
| MV_U32 llidPacketCountCompensationIdx; |
| MV_U32 llidPacketCountCompensation; |
| MV_U32 llidPacketCount = 0; |
| MV_U32 llidTransmittedPacketCount = 0; |
| MV_U32 tmpLlidHighQueue; /* highest queue according to mng configuration */ |
| MV_U32 llidTxFecState = 0; |
| MV_U32 ts[10] = {0}; |
| MV_U32 *pTs = ts; |
| MV_U32 interval[6] = {0}; |
| #define COLLECT_DBA_TS mvOnuEponMacGenLocalTimeStampGet(pTs++) |
| |
| for (llidIdx = 0; llidIdx < EPON_MAX_MAC_NUM; llidIdx++) { |
| |
| llidQueuesByteCount = 0; |
| llidTotalByteCount = 0; |
| llidPacketCount = 0; |
| llidPacketCountCompensation = 0; |
| |
| /* Non-active LLID */ |
| if (onuEponDbOnuDbaLlidActiveStatusGet(llidIdx) != ONU_DBA_ACTIVE_LLID) |
| continue; |
| |
| COLLECT_DBA_TS; |
| |
| /* ======================= */ |
| /* Retrieve Queue Counters */ |
| /* ======================= */ |
| |
| /* update counters in case FEC is enabled */ |
| onuEponDbOnuTxFecCfgGet(&llidTxFecState, llidIdx); |
| |
| queueSetIdx = 0; |
| |
| for (queueIdx = 0; queueIdx < EPON_MAX_QUEUE; queueIdx++) { |
| /* for each queue */ |
| if (llidQueuesBitMap[llidIdx] & (1 << queueIdx)) { |
| |
| status = onuEponPmGunitLlidQueueCntGet(llidIdx, queueIdx, &(llidCounter[queueIdx])); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Llid[%d] Queue[%d] Cnt Get Failed\n\r", |
| __FILE_DESC__, __LINE__, llidIdx, queueIdx); |
| return(MV_ERROR); |
| } |
| |
| } else |
| llidCounter[queueIdx] = 0; |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "SW DBA, queue[%d] count[%d]\n", queueIdx, llidCounter[queueIdx]); |
| |
| /* convert to TQ units */ |
| llidCounter[queueIdx] /= 2; |
| |
| /* sum queues TQ to verify data was received */ |
| llidQueuesByteCount += llidCounter[queueIdx]; |
| } /* for each queue */ |
| |
| /* Count the number of transmitted words in the GPUnit without - checksum and header modified bytes */ |
| /* Counter is clear-on-read */ |
| onuEponPmGunitLlid0PktModPktCountGet(&llidPacketCount); |
| |
| tmpLlidHighQueue = onuEponDbOnuDbaHighestReportQueueGet(llidIdx); |
| |
| llidTotalByteCount = (llidQueuesByteCount * 2) + (llidPacketCount * 2); |
| |
| COLLECT_DBA_TS; |
| |
| /* =========================== */ |
| /* Low-Rate and Birsty Traffic */ |
| /* =========================== */ |
| /* Incase there is no data was found in the LLID queues, and */ |
| /* The LLID packet count != 0, meaning packets were transmitted towards the GPON MAC */ |
| /* Add the number of transmitted packets in words + threshold LLID to the highest queue report */ |
| /* The number of transmitted packets does include packets checksum and header modified bytes */ |
| /* The threshold is used to compensate checksum and header modified bytes */ |
| /* The report is sent maximum of DBA_RPRT_PERIODIC_CYCLE (6) intervals, it will be periodicly transmitted */ |
| /* until is identifes data in the LLID Queues or LLID FIFO. */ |
| /* In case of very low rate traffic, it send the report DBA_RPRT_PERIODIC_CYCLE (6) intervals. */ |
| /* This WA is to compensate the "breathing" scheme of OLT DBA GATE allocation */ |
| if (llidQueuesByteCount == 0) { |
| |
| if (llidPacketCount != 0) { |
| |
| llidDbaRprtCount = DBA_RPRT_PERIODIC_CYCLE; |
| /* If the previous GATE allowed large traffic burst, so all packets from queues got TXed and |
| * packet counter indicates more packets than theoretically can be waiting in TX FIFO, |
| * limit the counter value to the FIFO size in order to avoid bandwidth oversubscribtion needed |
| * for FIFO release |
| */ |
| if (llidPacketCount > DBA_RPRT_TX_FIFO_SIZE) |
| llidDbaRprtValue = DBA_RPRT_TX_FIFO_SIZE; |
| else |
| llidDbaRprtValue = llidPacketCount; |
| } |
| |
| if ((llidDbaRprtCount > 0) && (llidDbaRprtCount <= DBA_RPRT_PERIODIC_CYCLE)) { |
| |
| llidCounter[tmpLlidHighQueue] += (llidDbaRprtValue + (rprtLowRateConstValue / 2)); |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_WA_MODULE, |
| "DBA WA[%d], PktCnt(%d), RprtCnt(%d)\n", |
| llidDbaRprtCount, llidDbaRprtValue, llidCounter[tmpLlidHighQueue]); |
| |
| llidDbaRprtCount--; |
| } |
| |
| } else { |
| |
| llidDbaRprtCount = 0; |
| llidDbaRprtValue = 0; |
| } |
| |
| COLLECT_DBA_TS; |
| |
| /* ================= */ |
| /* High-Rate Traffic */ |
| /* ================= */ |
| /* Incase data was found in the LLID queues, the 4K FIFO is full */ |
| /* If total number of bytes in the LLID queues is less the 8192 bytes */ |
| /* Add configurable number of TQ (default to 1000) to highest queue report */ |
| if ((llidQueuesByteCount > 0) && (llidQueuesByteCount < (rprtHighRateThreshold / 2))) |
| llidCounter[tmpLlidHighQueue] += (rprtHighRateValue / 2); |
| |
| /* =========== */ |
| /* OAM Traffic */ |
| /* =========== */ |
| if (llidDbaRprtForOamMsgInd == 1) { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "SW DBA, OAM Message addition to highQ[%d], \n", tmpLlidHighQueue); |
| |
| llidCounter[tmpLlidHighQueue] += (rprtLowRateValue / 2); |
| |
| llidDbaRprtForOamMsgInd = 0; |
| } |
| |
| COLLECT_DBA_TS; |
| |
| /* =========== */ |
| /* FEC Section */ |
| /* =========== */ |
| if (llidTxFecState != 0) { |
| |
| status = onuEponPmTxDataPmLastIntervalGet(&llidTransmittedPacketCount, llidIdx); |
| if (status != MV_OK) { |
| for (queueIdx = 0; queueIdx < EPON_MAX_QUEUE; queueIdx++) { |
| if (llidCounter[queueIdx] != 0) |
| llidCounter[queueIdx] = (llidCounter[queueIdx] + (llidCounter[queueIdx] / 12));/* default */ |
| } |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_FEC_MODULE, "SW DBA FEC, default setting\n"); |
| |
| } else { |
| |
| if (llidTransmittedPacketCount != 0) { |
| |
| llidAvePacketLength = (llidTotalByteCount / llidTransmittedPacketCount); |
| llidPacketCountCompensationIdx = ((llidAvePacketLength / 64) + 1); |
| |
| if (llidPacketCountCompensationIdx > 32/*limit*/) |
| llidPacketCountCompensationIdx = 32; |
| |
| llidPacketCountCompensation = llidPacketFcsCompensation[llidPacketCountCompensationIdx]; |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_FEC_MODULE, |
| "SW DBA FEC, Total Bytes(%d), Total Pkt, Ave Pkt(%d), CompIdx(%d), CompVal(%d)\n", |
| llidTotalByteCount, llidTransmittedPacketCount, |
| llidAvePacketLength, llidPacketCountCompensationIdx, llidPacketCountCompensation); |
| |
| for (queueIdx = 0; queueIdx < EPON_MAX_QUEUE; queueIdx++) { |
| if (llidCounter[queueIdx] != 0) |
| llidCounter[queueIdx] = |
| (llidCounter[queueIdx] + (llidCounter[queueIdx] / llidPacketCountCompensation)); |
| } |
| |
| } /* llidTransmittedPacketCount != 0 */ |
| } /* onuEponPmTxDataPmLastIntervalGet() == MV_OK */ |
| } /* llidTxFecState != 0 */ |
| |
| COLLECT_DBA_TS; |
| |
| /* ==================== */ |
| /* Build Report Message */ |
| /* ==================== */ |
| /* Support for normal report |
| ** Queue Set: [Qset1, Qset2, .., QsetN, BC] |
| ** Queue: [Queue0, .., QueueN] |
| ** Report is sent via EPON REGISTERS |
| ** =================== */ |
| memset(reportMsg, 0, 40); |
| |
| reportMsgIdx = 0; |
| reportMsg[reportMsgIdx++] = llidNumOfQueuesets[llidIdx]; |
| |
| /* update queueset reports */ |
| for (queueSetIdx = 0; queueSetIdx < llidNumOfQueuesets[llidIdx]; queueSetIdx++) { |
| |
| reportMsg[reportMsgIdx++] = llidQueuesBitMap[llidIdx]; |
| |
| for (queueIdx = (EPON_MAX_QUEUE - 1); queueIdx >= 0; queueIdx--) { |
| if (llidQueueState[llidIdx][queueSetIdx][queueIdx] != 0) { |
| if (llidCounter[queueIdx] > llidQueueThreshold[llidIdx][queueSetIdx][queueIdx]) { |
| reportMsg[reportMsgIdx++] = ((llidQueueThreshold[llidIdx][queueSetIdx][queueIdx] >> 8) & 0xFF); |
| reportMsg[reportMsgIdx++] = (llidQueueThreshold[llidIdx][queueSetIdx][queueIdx] & 0xFF); |
| } else { |
| reportMsg[reportMsgIdx++] = ((llidCounter[queueIdx] >> 8) & 0xFF); |
| reportMsg[reportMsgIdx++] = (llidCounter[queueIdx] & 0xFF); |
| } |
| } |
| } /* for each queue */ |
| } /* for each queueset */ |
| |
| /* Build report in message format */ |
| for (idx = 0; idx < OAM_MSG_REGS; idx++) |
| dbaSwRprtRegShadow[idx].shadow = 0; |
| |
| for (msgIdx = 0; msgIdx < llidNumOfReportBytes[llidIdx]; msgIdx++) { |
| |
| msgTmpData = ((((MV_U32)(reportMsg[msgIdx])) << dbaSwRprtRegMap[msgIdx].shift) | |
| (dbaSwRprtRegShadow[dbaSwRprtRegMap[msgIdx].shadowIdx].shadow)); |
| dbaSwRprtRegShadow[dbaSwRprtRegMap[msgIdx].shadowIdx].shadow = msgTmpData; |
| } |
| |
| /* =================== */ |
| /* Send Report Message */ |
| /* =================== */ |
| for (msgIdx = 0; msgIdx < OAM_MSG_REGS; msgIdx++) { |
| |
| status = asicOntGlbRegWrite(dbaSwRprtRegShadow[msgIdx].reg, |
| dbaSwRprtRegShadow[msgIdx].shadow, |
| llidIdx); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Llid[%d] msgIdx[%d] Regiter write failed\n\r", |
| __FILE_DESC__, __LINE__, llidIdx, msgIdx); |
| return(MV_ERROR); |
| } |
| } |
| |
| COLLECT_DBA_TS; |
| |
| for (idx = 0; idx < 4; idx++) { |
| if (ts[idx + 1] > ts[idx]) |
| interval[idx] = (MV_U32)(-1) - ts[idx] + ts[idx + 1]; |
| else |
| interval[idx] = ts[idx + 1] - ts[idx]; |
| interval[5] += interval[idx]; |
| } |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_TS_MODULE, |
| "llid[%d] ticks - QC[%d], LR[%d], HR[%d], FEC[%d], TX[%d], TOTAL[%d - %dnS]\n\r", |
| llidIdx, interval[0], interval[1], interval[2], interval[3], interval[4], interval[5], |
| interval[5] * 16); |
| |
| } /* For each LLID */ |
| |
| return(status); |
| } /* enf of onuEponPonMngDbaSwRprtHandler */ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaSwRprtHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA SW report handler |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngDbaDgSwRprtHandler(void) |
| { |
| MV_STATUS status = MV_OK; |
| MV_U32 llidIdx; |
| MV_U32 msgIdx; |
| |
| for (llidIdx = 0; llidIdx < EPON_MAX_MAC_NUM; llidIdx++) { |
| /* Active LLID */ |
| /* =========== */ |
| if (onuEponDbOnuDbaLlidActiveStatusGet(llidIdx) == ONU_DBA_ACTIVE_LLID) { |
| /* Send Report Message */ |
| /* =================== */ |
| for (msgIdx = 0; msgIdx < OAM_MSG_REGS; msgIdx++) { |
| status = asicOntGlbRegWrite(dbaDgSwRprtRegShadow[msgIdx].reg, |
| dbaDgSwRprtRegShadow[msgIdx].shadow, |
| llidIdx); |
| if (status != MV_OK) |
| return(MV_ERROR); |
| } |
| } |
| } |
| |
| return(status); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaDgSwRprtCfg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function build DG DBA SW report |
| ** |
| ** PARAMETERS: MV_U32 numOfQueue |
| ** MV_U32 queueReport |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngDbaDgSwRprtCfg(MV_U32 numOfQueue, MV_U32 queueReport) |
| { |
| MV_U32 msgIdx; |
| MV_U32 msgIdx_2; |
| MV_U8 bitMapArray[] = { /* 0 */ 0x00, |
| /* 1 */ 0x80, |
| /* 2 */ 0xC0, |
| /* 3 */ 0xE0, |
| /* 4 */ 0xF0, |
| /* 5 */ 0xF8, |
| /* 6 */ 0xFC, |
| /* 7 */ 0xFE, |
| /* 8 */ 0xFF}; |
| |
| if (numOfQueue > 8) numOfQueue = 8; |
| if (queueReport > 0xFFFF) queueReport = 0xFFFF; |
| |
| /* bit map */ |
| dbaDgSwRprtRegShadow[1].shadow = bitMapArray[numOfQueue]; |
| |
| /* queues */ |
| for (msgIdx = 2; msgIdx < (2 + numOfQueue); msgIdx++) |
| dbaDgSwRprtRegShadow[msgIdx].shadow = queueReport; |
| |
| for (msgIdx_2 = msgIdx; msgIdx_2 < 10; msgIdx_2++) |
| dbaDgSwRprtRegShadow[msgIdx_2].shadow = 0; |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "DG DBA Report\n"); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queueset - 0x%08X\n", dbaDgSwRprtRegShadow[0].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Bitmap - 0x%08X\n", dbaDgSwRprtRegShadow[1].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-0 - 0x%08X\n", dbaDgSwRprtRegShadow[2].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-1 - 0x%08X\n", dbaDgSwRprtRegShadow[3].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-2 - 0x%08X\n", dbaDgSwRprtRegShadow[4].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-3 - 0x%08X\n", dbaDgSwRprtRegShadow[5].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-4 - 0x%08X\n", dbaDgSwRprtRegShadow[6].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-5 - 0x%08X\n", dbaDgSwRprtRegShadow[7].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-6 - 0x%08X\n", dbaDgSwRprtRegShadow[8].shadow); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "Queue-7 - 0x%08X\n", dbaDgSwRprtRegShadow[9].shadow); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDbaHwRprtHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA HW report handler |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngDbaHwRprtHandler(void) |
| { |
| MV_STATUS status; |
| MV_U32 highRprtQueue; |
| MV_U32 macId; |
| |
| if (dbaRprtState == 0) |
| { |
| for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) |
| { |
| highRprtQueue = onuEponDbOnuDbaHighestReportQueueGet(macId); |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "HW DBA report[T0], mac(%d), highest(%d)\n", macId, highRprtQueue); |
| |
| status = mvOnuEponMacTxmCppReportQueueX(highRprtQueue, dbaRprtT0StateVal, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) onuEponSendCtrlFrameData\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| } |
| |
| onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonHwRprtTimerId), 0, dbaRprtT0StateInterval, 1); |
| dbaRprtState = 1; |
| } |
| else if (dbaRprtState == 1) |
| { |
| for (macId = 0; macId < EPON_MAX_MAC_NUM; macId++) |
| { |
| highRprtQueue = onuEponDbOnuDbaHighestReportQueueGet(macId); |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_DBA_MODULE, |
| "HW DBA report[T1], mac(%d), highest(%d)\n", macId, highRprtQueue); |
| |
| status = mvOnuEponMacTxmCppReportQueueX(highRprtQueue, dbaRprtT1StateVal, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) onuEponSendCtrlFrameData\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| } |
| |
| onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonHwRprtTimerId), 0, dbaRprtT1StateInterval, 1); |
| dbaRprtState = 0; |
| } |
| |
| return (0); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngTimerHwRprtCfg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager DBA timer report config |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngTimerHwRprtCfg(MV_U32 t0_val, MV_U32 t0_time, MV_U32 t1_val, MV_U32 t1_time) |
| { |
| dbaRprtT0StateVal = t0_val; |
| dbaRprtT0StateInterval = t0_time; |
| dbaRprtT1StateVal = t1_val; |
| dbaRprtT1StateInterval = t1_time; |
| |
| return (0); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngTimerSilenceHndl |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager silence timer handler |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngTimerSilenceHndl(unsigned long macId) |
| { |
| unsigned long flags; |
| |
| spin_lock_irqsave(&onuPonIrqLock, flags); |
| |
| onuPonResourceTbl_s.onuPonSilenceTimerId[macId].onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE; |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_SILENCE_MODULE, |
| "DEBUG: (%s:%d) Silence Timer[%d] Expire\n", __FILE_DESC__, __LINE__, macId); |
| onuEponPonMngAlarmHandlerExecute(macId); |
| |
| if ((onuPonResourceTbl_s.onuPonSilenceTimerId[macId].onuPonTimerPeriodic) != 0) |
| onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonSilenceTimerId[macId])); |
| |
| spin_unlock_irqrestore(&onuPonIrqLock, flags); |
| } |
| |
| #ifndef PON_FPGA |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* OAM - Dying Gasp Message Handling Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDgMsgPrint |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function print DG message |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngDgMsgPrint(void) |
| { |
| S_OnuEponOamFrame *oamMsg; |
| |
| oamMsg = ((S_OnuEponOamFrame*)(&(dgOamMsg.data[0]))); |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "\n" |
| "DG Message\n" |
| "==========\n" |
| "DestMac[%x:%x:%x:%x:%x:%x] SrcMac[%x:%x:%x:%x:%x:%x]\n" |
| "Etype[0x%x] flags[%x] code[0x%x]\n", |
| oamMsg->stdEthFrame.destAddr[0], oamMsg->stdEthFrame.destAddr[1], |
| oamMsg->stdEthFrame.destAddr[2], oamMsg->stdEthFrame.destAddr[3], |
| oamMsg->stdEthFrame.destAddr[4], oamMsg->stdEthFrame.destAddr[5], |
| oamMsg->stdEthFrame.srcAddr[0], oamMsg->stdEthFrame.srcAddr[1], |
| oamMsg->stdEthFrame.srcAddr[2], oamMsg->stdEthFrame.srcAddr[3], |
| oamMsg->stdEthFrame.srcAddr[4], oamMsg->stdEthFrame.srcAddr[5], |
| dgMsgEtype, oamMsg->stdOamHeader.subType, |
| dgMsgFlags, oamMsg->stdOamHeader.code); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngDgMessageHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager dying gasp interrupt |
| ** message transmit function |
| ** |
| ** PARAMETERS: MV_U32 macId |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngDgMessageHandler(MV_U32 macId) |
| { |
| MV_STATUS status = MV_ERROR; |
| MV_U32 transNum = 0; |
| MV_U32 maxTransNum = 100; |
| |
| onuEponPonMngDbaDgSwRprtHandler(); |
| do |
| { |
| if (onuEponSendCtrlFrameDataFreeStatus(macId) != MV_TRUE) |
| continue; |
| |
| status = onuEponSendCtrlFrameData(&dgOamMsg, macId); |
| transNum++; |
| |
| } while ((status != MV_OK) && (transNum <= maxTransNum)); |
| |
| // status = onuEponDgAllocMsg(&dgOamMsg, macId); |
| // if (status != MV_OK) |
| // { |
| // mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| // "ERROR: (%s:%d) onuEponPonMngDgMessageHandler", __FILE_DESC__, __LINE__); |
| // return(status); |
| // } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponDgMsgDefaultMessageInit |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: Create default dying gasp interrupt message |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponDgMsgDefaultMessageInit(void) |
| { |
| MV_U32 macId = 0; |
| S_OnuEponOamFrame *oamMsg; |
| |
| /* clear message */ |
| memset(&dgOamMsg, 0, sizeof(S_OnuEponCtrlBuffer)); |
| |
| /* set message length */ |
| dgOamMsg.length = MIN_DG_FRAME_LEN; |
| |
| /* update message content */ |
| oamMsg = ((S_OnuEponOamFrame*)(&(dgOamMsg.data[0]))); |
| |
| oamMsg->stdEthFrame.destAddr[0] = 0x01; |
| oamMsg->stdEthFrame.destAddr[1] = 0x80; |
| oamMsg->stdEthFrame.destAddr[2] = 0xC2; |
| oamMsg->stdEthFrame.destAddr[3] = 0x00; |
| oamMsg->stdEthFrame.destAddr[4] = 0x00; |
| oamMsg->stdEthFrame.destAddr[5] = 0x02; |
| |
| oamMsg->stdEthFrame.srcAddr[0] = fixMacAddrs[macId][0]; |
| oamMsg->stdEthFrame.srcAddr[1] = fixMacAddrs[macId][1]; |
| oamMsg->stdEthFrame.srcAddr[2] = fixMacAddrs[macId][2]; |
| oamMsg->stdEthFrame.srcAddr[3] = fixMacAddrs[macId][3]; |
| oamMsg->stdEthFrame.srcAddr[4] = fixMacAddrs[macId][4]; |
| oamMsg->stdEthFrame.srcAddr[5] = fixMacAddrs[macId][5]; |
| |
| onuEponConvertH2NShort(&dgMsgEtype, &oamMsg->stdEthFrame.etherType); |
| |
| oamMsg->stdOamHeader.subType = dgMsgSubType; |
| |
| onuEponConvertH2NShort(&dgMsgFlags, &oamMsg->stdOamHeader.flags); |
| |
| oamMsg->stdOamHeader.code = dgMsgCode; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngIntrDgHandler |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function implements the pon manager dying gasp interrupt |
| ** handler function |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_STATUS |
| ** |
| *******************************************************************************/ |
| void onuEponPonMngIntrDgHandler(void) |
| { |
| static MV_U32 first_time = 1; |
| DYINGGASPFUNC dgCallback; |
| MV_U32 macId = 0; |
| |
| onuEponPonMngDgMessageHandler(macId); |
| |
| if (first_time) |
| { |
| dgCallback = onuEponDbDgCallbackGet(); |
| |
| if (dgCallback != NULL) |
| { |
| dgCallback(); |
| first_time = 0; |
| } |
| } |
| |
| onuPonDyingGaspExit(); |
| |
| onuEponPonMngDgMsgPrint(); |
| } |
| |
| #endif /* PON_FPGA */ |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* MPC State Machine Handling Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngRegMsgFlagAck |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function is called when REGISTER message with flag Ack is |
| ** received |
| ** |
| ** PARAMETERS: S_OnuEponRegMpcFrame *mpcFrame |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngRegMsgFlagAck(S_OnuEponRegMpcFrame *mpcFrame) |
| { |
| MV_STATUS status; |
| MV_U32 macId; |
| MV_U32 macState; |
| MV_U16 msgEtype; |
| MV_U16 msgSyncTime; |
| MV_U16 msgLlid; |
| MV_U16 msgOpcode; |
| MV_U8 msgFlags; |
| MV_U8 msgEchoedPendingGrants; |
| MV_U32 interruptMask; |
| LINKSTATUSFUNC linkStatusCallback; |
| |
| status = matchDestAddressToMacId(mpcFrame->stdEthFrame.destAddr, &macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MAC_ADDR_MODULE, |
| "ERROR: (%s:%d) matchDestAddressToMacId, invalid dest addr [%02X:%02X:%02X:%02X:%02X:%02X]\n", |
| __FILE_DESC__, __LINE__, |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5]); |
| return(MV_OK); |
| } |
| |
| onuEponConvertN2HShort(&mpcFrame->stdEthFrame.etherType, &msgEtype); |
| onuEponConvertN2HShort(&mpcFrame->genMpcPdu.opCode, &msgOpcode); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.assignedLlidPort, &msgLlid); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.syncTime, &msgSyncTime); |
| msgFlags = mpcFrame->regMpcPdu.flags; |
| msgEchoedPendingGrants = mpcFrame->regMpcPdu.echoedPendingGrants; |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "\n" |
| "REGISTER [Flag=Ack] Message\n" |
| "===========================\n" |
| "DestMac[%x:%x:%x:%x:%x:%x] SrcMac[%x:%x:%x:%x:%x:%x]\n" |
| "Etype[0x%x] Opcode[%x] Sync[0x%x], LLID[%x] Grant[%x] Flag[%x]\n", |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5], |
| mpcFrame->stdEthFrame.srcAddr[0], mpcFrame->stdEthFrame.srcAddr[1], |
| mpcFrame->stdEthFrame.srcAddr[2], mpcFrame->stdEthFrame.srcAddr[3], |
| mpcFrame->stdEthFrame.srcAddr[4], mpcFrame->stdEthFrame.srcAddr[5], |
| msgEtype, |
| msgOpcode, |
| msgSyncTime, |
| msgLlid, |
| msgEchoedPendingGrants, |
| msgFlags); |
| |
| /* Validate mac state was updated by HW */ |
| status = mvOnuEponMacOnuStateGet(&macState, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) mvOnuEponMacOnuStateGet\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| if (macState != ONU_EPON_REGISTERED) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Mac[%d] state is not Registered!!!!\n\r", __FILE_DESC__, __LINE__, macId); |
| return(MV_ERROR); |
| } |
| |
| onuEponApiFecReConfig(); |
| |
| if (onuEponDbOnuSwRprtTimerTypeGet() == ONU_EPON_SW_DBA_RPRT_TIMER) |
| { |
| /* Set onu DBA Report interrupt */ |
| mvOnuEponMacPonInterruptMaskGet(&interruptMask); |
| interruptMask |= (ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK); |
| mvOnuEponMacPonInterruptMaskSet(interruptMask); |
| onuEponDbaSwRprtMacTimerCfg(onuEponDbOnuSwRprtMacTimerIntervalGet()); |
| |
| /* Start SW DBA event miss timer */ |
| onuEponIsrTimerEventMissStateSet(MV_TRUE); |
| |
| } |
| else |
| { |
| onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonHwRprtTimerId)); |
| } |
| |
| onuEponDbPktTxLlidSet(msgLlid, macId); |
| onuEponDbPktRxLlidSet(msgLlid, macId); |
| onuEponDbOnuStateSet(ONU_EPON_03_OPERATION, macId); |
| onuPonLedHandler(ONU_PON_SYNC_LED, ACTIVE_LED_ON); |
| |
| #if 0 /* NOT USED */ |
| status = onuEponAsicQueueEnable(macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, |
| "ERROR: (%s:%d) onuEponAsicQueueEnable\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| #endif /* NOT USED */ |
| |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "= ONU Mac[%d] Registered =\n\r", macId); |
| if (macId == 0) |
| { |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "==================\n"); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "== MPCP Sync On ==\n"); |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, "==================\n"); |
| } |
| |
| /* Call link status callback function */ |
| linkStatusCallback = onuEponDbLinkStatusCallbackGet(); |
| if (linkStatusCallback != NULL) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_ISR_INT_MODULE, |
| "DEBUG: (%s:%d) Notify link is UP\n", __FILE_DESC__, __LINE__); |
| linkStatusCallback(MV_TRUE); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngRegMsgFlagNack |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function is called when REGISTER message with flag Nack |
| ** is received |
| ** |
| ** PARAMETERS: S_OnuEponRegMpcFrame *mpcFrame |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngRegMsgFlagNack(S_OnuEponRegMpcFrame *mpcFrame) |
| { |
| MV_STATUS status; |
| MV_U32 macId; |
| MV_U16 msgEtype; |
| MV_U16 msgSyncTime; |
| MV_U16 msgLlid; |
| MV_U16 msgOpcode; |
| MV_U8 msgFlags; |
| MV_U8 msgEchoedPendingGrants; |
| |
| status = matchDestAddressToMacId(mpcFrame->stdEthFrame.destAddr, &macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MAC_ADDR_MODULE, |
| "ERROR: (%s:%d) matchDestAddressToMacId, invalid dest addr [%02X:%02X:%02X:%02X:%02X:%02X]\n", |
| __FILE_DESC__, __LINE__, |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5]); |
| return(MV_OK); |
| } |
| |
| onuEponConvertN2HShort(&mpcFrame->stdEthFrame.etherType, &msgEtype); |
| onuEponConvertN2HShort(&mpcFrame->genMpcPdu.opCode, &msgOpcode); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.assignedLlidPort, &msgLlid); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.syncTime, &msgSyncTime); |
| msgFlags = mpcFrame->regMpcPdu.flags; |
| msgEchoedPendingGrants = mpcFrame->regMpcPdu.echoedPendingGrants; |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "\n" |
| "REGISTER [Flag=Nack] Message\n" |
| "============================\n" |
| "DestMac[%x:%x:%x:%x:%x:%x] SrcMac[%x:%x:%x:%x:%x:%x]\n" |
| "Etype[0x%x] Opcode[%x] Sync[0x%x], LLID[%x] Grant[%x] Flag[%x]\n", |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5], |
| mpcFrame->stdEthFrame.srcAddr[0], mpcFrame->stdEthFrame.srcAddr[1], |
| mpcFrame->stdEthFrame.srcAddr[2], mpcFrame->stdEthFrame.srcAddr[3], |
| mpcFrame->stdEthFrame.srcAddr[4], mpcFrame->stdEthFrame.srcAddr[5], |
| msgEtype, |
| msgOpcode, |
| msgSyncTime, |
| msgLlid, |
| msgEchoedPendingGrants, |
| msgFlags); |
| |
| |
| if (onuEponDbOnuSilenceStateGet() != ONU_SILENCE_NOT_ACTIVE) |
| { |
| status = mvOnuEponMacGenOnuConfigAutoAckSet(0); |
| status |= mvOnuEponMacGenOnuConfigAutoRequestSet(0); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Failed to disable auto request / ack\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| onuEponDbOnuCfgAutoSet(ONU_REG_REQ_SW_RES, ONU_REG_ACK_SW_RES, ONU_REPORT_AUTO_RES); |
| |
| onuPonTimerUpdate(&(onuPonResourceTbl_s.onuPonSilenceTimerId[macId]), macId, ONU_PON_TIMER_SILENCE_INTERVAL, 1); |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_SILENCE_MODULE, |
| "DEBUG: (%s:%d) Silence Timer Start\n", __FILE_DESC__, __LINE__); |
| } |
| else |
| { |
| onuEponPonMngAlarmHandlerExecute(macId); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngRegMsgFlagReReg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function is called when REGISTER message with flag re-register |
| ** is received |
| ** |
| ** PARAMETERS: S_OnuEponRegMpcFrame *mpcFrame |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngRegMsgFlagReReg(S_OnuEponRegMpcFrame *mpcFrame) |
| { |
| MV_STATUS status; |
| MV_U32 macId; |
| MV_U32 macState; |
| MV_U16 msgEtype; |
| MV_U16 msgSyncTime; |
| MV_U16 msgLlid; |
| MV_U16 msgOpcode; |
| MV_U8 msgFlags; |
| MV_U8 msgEchoedPendingGrants; |
| |
| status = matchDestAddressToMacId(mpcFrame->stdEthFrame.destAddr, &macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MAC_ADDR_MODULE, |
| "ERROR: (%s:%d) matchDestAddressToMacId, invalid dest addr [%02X:%02X:%02X:%02X:%02X:%02X]\n", |
| __FILE_DESC__, __LINE__, |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5]); |
| return(MV_OK); |
| } |
| |
| onuEponConvertN2HShort(&mpcFrame->stdEthFrame.etherType, &msgEtype); |
| onuEponConvertN2HShort(&mpcFrame->genMpcPdu.opCode, &msgOpcode); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.assignedLlidPort, &msgLlid); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.syncTime, &msgSyncTime); |
| msgFlags = mpcFrame->regMpcPdu.flags; |
| msgEchoedPendingGrants = mpcFrame->regMpcPdu.echoedPendingGrants; |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "\n" |
| "REGISTER [Flag=ReReg] Message\n" |
| "=============================\n" |
| "DestMac[%x:%x:%x:%x:%x:%x] SrcMac[%x:%x:%x:%x:%x:%x]\n" |
| "Etype[0x%x] Opcode[%x] Sync[0x%x], LLID[%x] Grant[%x] Flag[%x]\n", |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5], |
| mpcFrame->stdEthFrame.srcAddr[0], mpcFrame->stdEthFrame.srcAddr[1], |
| mpcFrame->stdEthFrame.srcAddr[2], mpcFrame->stdEthFrame.srcAddr[3], |
| mpcFrame->stdEthFrame.srcAddr[4], mpcFrame->stdEthFrame.srcAddr[5], |
| msgEtype, |
| msgOpcode, |
| msgSyncTime, |
| msgLlid, |
| msgEchoedPendingGrants, |
| msgFlags); |
| |
| /* Validate mac state was updated by HW */ |
| status = mvOnuEponMacOnuStateGet(&macState, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) mvOnuEponMacOnuStateGet\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| if (macState != ONU_EPON_REGISTERED) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Mac[%d] state is not Registered!!!!\n\r", __FILE_DESC__, __LINE__, macId); |
| return(MV_ERROR); |
| } |
| |
| onuEponDbPktTxLlidSet(msgLlid, macId); |
| onuEponDbPktRxLlidSet(msgLlid, macId); |
| onuEponDbOnuStateSet(ONU_EPON_03_OPERATION, macId); |
| onuPonLedHandler(ONU_PON_SYNC_LED, ACTIVE_LED_ON); |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "= ONU Mac[%d] Registered =\n\r", macId); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponPonMngRegMsgFlagDeReg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function is called when REGISTER message with flag de-register |
| ** is received |
| ** |
| ** PARAMETERS: S_OnuEponRegMpcFrame *mpcFrame |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponPonMngRegMsgFlagDeReg(S_OnuEponRegMpcFrame *mpcFrame) |
| { |
| MV_STATUS status; |
| MV_U32 macId; |
| MV_U32 interruptMask; |
| MV_U16 msgEtype; |
| MV_U16 msgSyncTime; |
| MV_U16 msgLlid; |
| MV_U16 msgOpcode; |
| MV_U8 msgFlags; |
| MV_U8 msgEchoedPendingGrants; |
| LINKSTATUSFUNC linkStatusCallback; |
| |
| status = matchDestAddressToMacId(mpcFrame->stdEthFrame.destAddr, &macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_DEBUG, PON_MNG_MAC_ADDR_MODULE, |
| "ERROR: (%s:%d) matchDestAddressToMacId, invalid dest addr [%02X:%02X:%02X:%02X:%02X:%02X]\n", |
| __FILE_DESC__, __LINE__, |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5]); |
| return(MV_OK); |
| } |
| |
| onuEponConvertN2HShort(&mpcFrame->stdEthFrame.etherType, &msgEtype); |
| onuEponConvertN2HShort(&mpcFrame->genMpcPdu.opCode, &msgOpcode); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.assignedLlidPort, &msgLlid); |
| onuEponConvertN2HShort(&mpcFrame->regMpcPdu.syncTime, &msgSyncTime); |
| msgFlags = mpcFrame->regMpcPdu.flags; |
| msgEchoedPendingGrants = mpcFrame->regMpcPdu.echoedPendingGrants; |
| |
| mvPonPrint(PON_PRINT_INFO, PON_MNG_MODULE, |
| "\n" |
| "REGISTER [Flag=DeReg] Message\n" |
| "=============================\n" |
| "DestMac[%x:%x:%x:%x:%x:%x] SrcMac[%x:%x:%x:%x:%x:%x]\n" |
| "Etype[0x%x] Opcode[%x] Sync[0x%x], LLID[%x] Grant[%x] Flag[%x]\n", |
| mpcFrame->stdEthFrame.destAddr[0], mpcFrame->stdEthFrame.destAddr[1], |
| mpcFrame->stdEthFrame.destAddr[2], mpcFrame->stdEthFrame.destAddr[3], |
| mpcFrame->stdEthFrame.destAddr[4], mpcFrame->stdEthFrame.destAddr[5], |
| mpcFrame->stdEthFrame.srcAddr[0], mpcFrame->stdEthFrame.srcAddr[1], |
| mpcFrame->stdEthFrame.srcAddr[2], mpcFrame->stdEthFrame.srcAddr[3], |
| mpcFrame->stdEthFrame.srcAddr[4], mpcFrame->stdEthFrame.srcAddr[5], |
| msgEtype, |
| msgOpcode, |
| msgSyncTime, |
| msgLlid, |
| msgEchoedPendingGrants, |
| msgFlags); |
| |
| if (onuEponDbOnuSwRprtTimerTypeGet() == ONU_EPON_SW_DBA_RPRT_TIMER) |
| { |
| /* Stop SW DBA event miss timer */ |
| onuEponIsrTimerEventMissStateSet(MV_FALSE); |
| |
| /* Clear onu DBA Report interrupt */ |
| mvOnuEponMacPonInterruptMaskGet(&interruptMask); |
| interruptMask &= ~(ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK); |
| mvOnuEponMacPonInterruptMaskSet(interruptMask); |
| } |
| else |
| { |
| /* Clear onu DBA Report Timer */ |
| onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonHwRprtTimerId)); |
| } |
| |
| /* re-init onu database */ |
| status = onuEponDbReInit(macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Failed to re-init onu database\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| /* init onu Asic */ |
| status = onuEponAsicReInit(macId, ONU_SILENCE_ENABLED); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Failed to re-init onu EPON MAC\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| /* Call link status callback function */ |
| linkStatusCallback = onuEponDbLinkStatusCallbackGet(); |
| if (linkStatusCallback != NULL) |
| { |
| if (onuEponForceTxDownStateGet(0) != MV_TRUE) |
| linkStatusCallback(MV_FALSE); |
| } |
| |
| /* send signal to management layer */ |
| onuEponStatusNotify(0/*don't care*/); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************/ |
| /* ========================================================================== */ |
| /* MPC Message Handling Section */ |
| /* ========================================================================== */ |
| /******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** onuEponReadCtrlFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function read control frame from the Rx Control queue |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponReadCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| MV_STATUS status; |
| MV_U32 usedCount; |
| MV_U32 data; |
| MV_U32 index; |
| |
| status = mvOnuEponMacCpqRxCtrlQueueUsedCountGet(&usedCount); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Ctrl Queue Used Count\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| if (usedCount < ctrlBuf->length) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Not enough data, Frame Length = %d, usedCount = %d\n\r", |
| __FILE_DESC__, __LINE__, ctrlBuf->length, usedCount); |
| return(MV_ERROR); |
| } |
| |
| for(index = 0; index < ctrlBuf->length; index++) |
| { |
| status = mvOnuEponMacCpqRxCtrlQueueReadData(&data); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Ctrl Queue Data\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| else |
| { |
| ctrlBuf->data[index] = (MV_U8)data; |
| } |
| } |
| |
| onuEponPmSwRxCountersAdd(TOTAL_MPCP_RX_FRAME_CNT, 0); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponRetrieveCtrlFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function retrieve control frame from the Rx Control queue |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponRetrieveCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| MV_STATUS status; |
| MV_U32 usedHeaderCount; |
| MV_U32 flagLow; |
| MV_U32 flagHigh; |
| MV_U32 frameLength; |
| |
| ctrlBuf->length = 0; |
| |
| status = mvOnuEponMacCpqRxCtrlHeaderQueueUsedCountGet(&usedHeaderCount); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Ctrl Header Queue Used Count\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| if (usedHeaderCount <= 0) |
| { |
| return(MV_ERROR); |
| } |
| |
| status = mvOnuEponMacCpqRxCtrlHeaderQueueReadData(&flagLow, &flagHigh); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Ctrl Header Queue Data\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| frameLength = ((flagLow & MPC_FRAME_LENGTH_MASK) >> MPC_FRAME_LENGTH_SHIFT); |
| if ((frameLength > 0) && (frameLength <= sizeof(ctrlBuf->data))) |
| { |
| ctrlBuf->length = frameLength; |
| status = onuEponReadCtrlFrameData(ctrlBuf); |
| if (status != MV_OK) |
| { |
| return(status); |
| } |
| } |
| else |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Unexpected frame length %d\n\r", __FILE_DESC__, __LINE__, frameLength); |
| return(status); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponSendCtrlFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function check for free space for transmission of control frame |
| ** |
| ** PARAMETERS: MV_U32 macId |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_TRUE or MV_FALSE |
| ** |
| *******************************************************************************/ |
| MV_BOOL onuEponSendCtrlFrameDataFreeStatus(MV_U32 macId) |
| { |
| MV_STATUS status; |
| MV_U32 numFreeFrames; |
| MV_U32 numFreeData; |
| |
| status = mvOnuEponMacCpqTxCtrlHeaderQueueFree(&numFreeFrames, macId); |
| if (status != MV_OK) |
| return(MV_FALSE); |
| |
| status = mvOnuEponMacCpqTxCtrlQueueFree(&numFreeData, macId); |
| if (status != MV_OK) |
| return(MV_FALSE); |
| |
| if ((numFreeFrames <= 0) || (numFreeData < 256)) |
| return(MV_FALSE); |
| |
| return(MV_TRUE); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponSendCtrlFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function send control frame to the Tx Control queue |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** MV_U32 macId |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponSendCtrlFrameData(S_OnuEponCtrlBuffer *ctrlBuf, MV_U32 macId) |
| { |
| MV_STATUS status; |
| MV_U32 numFreeFrames; |
| MV_U32 numFreeData; |
| MV_U32 index; |
| |
| status = mvOnuEponMacCpqTxCtrlHeaderQueueFree(&numFreeFrames, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Tx Ctrl Header Queue\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| status = mvOnuEponMacCpqTxCtrlQueueFree(&numFreeData, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Tx Ctrl Queue\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| if (numFreeFrames <= 0) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) No free place in Tx Ctrl Header Queue (%d), data(%d)\n\r", |
| __FILE_DESC__, __LINE__, numFreeFrames, numFreeData); |
| return(MV_ERROR); |
| } |
| |
| if (numFreeData < ctrlBuf->length) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) No free place in Tx Ctrl Data Queue\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| for(index = 0; index < ctrlBuf->length; index++) |
| { |
| status = mvOnuEponMacCpqTxCtrlQueueWrite(ctrlBuf->data[index], macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Write Tx Ctrl Queue Data\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| } |
| |
| status = mvOnuEponMacCpqTxCtrlHeaderQueueWrite(ctrlBuf->length, macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Write Tx Ctrl Header Queue\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| onuEponPmSwTxCountersAdd(TOTAL_MPCP_TX_FRAME_CNT, macId); |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponReadReportFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function read report frame from the Rx report queue |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponReadReportFrameData(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| MV_STATUS status; |
| MV_U32 usedCount; |
| MV_U32 data; |
| MV_U32 index; |
| |
| status = mvOnuEponMacCpqRxRprtQueueUsedCountGet(&usedCount); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Report Queue Used Count\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| if (usedCount < ctrlBuf->length) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Not enough data, Frame Length = %i, usedCount = %i\n\r", |
| __FILE_DESC__, __LINE__, ctrlBuf->length, usedCount); |
| return(MV_ERROR); |
| } |
| |
| for(index = 0; index < usedCount; index++) |
| { |
| status = mvOnuEponMacCpqRxRprtQueueReadData(&data); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Report Queue Data\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| else |
| { |
| ctrlBuf->data[index] = (MV_U8)data; |
| } |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponRetrieveReportFrameData |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function retrieve report frame from the Rx report queue |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponRetrieveReportFrameData(S_OnuEponCtrlBuffer *ctrlBuf) |
| { |
| MV_STATUS status; |
| MV_U32 usedHeaderCount; |
| MV_U32 flagLow; |
| MV_U32 flagHigh; |
| MV_U32 frameLength; |
| |
| ctrlBuf->length = 0; |
| |
| status = mvOnuEponMacCpqRxRprtHeaderQueueUsedCountGet(&usedHeaderCount); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Report Header Queue Used Count\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| if (usedHeaderCount <= 0) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) No frames received, Used Header Count = %i\n\r", |
| __FILE_DESC__, __LINE__, usedHeaderCount); |
| return(MV_ERROR); |
| } |
| |
| status = mvOnuEponMacCpqRxRprtHeaderQueueReadData(&flagLow, &flagHigh); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Read Rx Report Header Queue Data\n\r", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| frameLength = flagLow & MPC_FRAME_LENGTH_MASK; |
| if (frameLength > 0 && frameLength <= sizeof(ctrlBuf->data)) |
| { |
| ctrlBuf->length = frameLength; |
| status = onuEponReadReportFrameData(ctrlBuf); |
| if (status != MV_OK) |
| { |
| return(status); |
| } |
| } |
| else |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_MNG_MODULE, |
| "ERROR: (%s:%d) Unexpected frame length %d\n\r", __FILE_DESC__, __LINE__, frameLength); |
| return(status); |
| } |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponConvertN2HShort |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function convert MV_U16 from Netwotk order to Host |
| ** |
| ** PARAMETERS: void *srcValPtr |
| ** void *destValPtr |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponConvertN2HShort(void *srcValPtr, void *destValPtr) |
| { |
| MV_U16 src; |
| MV_U16 dest; |
| |
| memcpy(&src, srcValPtr, sizeof(src)); |
| |
| dest = ((src & 0xFF) << 8) | |
| ((src >> 8) & 0xFF); |
| |
| memcpy(destValPtr, &dest, sizeof(dest)); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponConvertH2NShort |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function convert MV_U16 from Host order to Network |
| ** |
| ** PARAMETERS: void *srcValPtr |
| ** void *destValPtr |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponConvertH2NShort(void *srcValPtr, void *destValPtr) |
| { |
| MV_U16 src; |
| MV_U16 dest; |
| |
| memcpy(&src, srcValPtr, sizeof(src)); |
| |
| dest = ((src & 0xFF) << 8) | |
| ((src >> 8) & 0xFF); |
| |
| memcpy(destValPtr, &dest, sizeof(dest)); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponConvertN2HLong |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function convert MV_U32 from Netwotk order to Host |
| ** |
| ** PARAMETERS: void *srcValPtr |
| ** void *destValPtr |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponConvertN2HLong(void *srcValPtr, void *destValPtr) |
| { |
| MV_U32 src; |
| MV_U32 dest; |
| |
| memcpy(&src, srcValPtr, sizeof(src)); |
| |
| dest = ((src & 0xFF) << 24) | |
| (((src >> 8) & 0xFF) << 16) | |
| (((src >> 16) & 0xFF) << 8) | |
| ((src >> 24) & 0xFF); |
| |
| memcpy(destValPtr, &dest, sizeof(dest)); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponConvertH2NLong |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function convert MV_U32 from Host order to Network |
| ** |
| ** PARAMETERS: void *srcValPtr |
| ** void *destValPtr |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponConvertH2NLong(void *srcValPtr, void *destValPtr) |
| { |
| MV_U32 src; |
| MV_U32 dest; |
| |
| memcpy(&src, srcValPtr, sizeof(src)); |
| |
| dest = ((src & 0xFF) << 24) | |
| (((src >> 8) & 0xFF) << 16) | |
| (((src >> 16) & 0xFF) << 8) | |
| ((src >> 24) & 0xFF); |
| |
| memcpy(destValPtr, &dest, sizeof(dest)); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponOamHandleMsg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function transmit OAM frames from SW FIFO |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponOamHandleMsg(void) |
| { |
| MV_STATUS status; |
| MV_U8 nextOamMsgReadIndex; |
| S_OnuEponOamMsg *oamMsg; |
| |
| if (oamMsgReadIndex != oamMsgWriteIndex) |
| { |
| nextOamMsgReadIndex = oamMsgReadIndex + 1; |
| /* roll over */ |
| if (nextOamMsgReadIndex == OAM_MSG_FIFO_LENGTH) |
| { |
| nextOamMsgReadIndex = 0; |
| } |
| oamMsg = (S_OnuEponOamMsg*)(&(oamMsgData[nextOamMsgReadIndex])); |
| |
| if(onuEponSendCtrlFrameDataFreeStatus(oamMsg->macId) != MV_TRUE) |
| return(MV_OK); |
| |
| /* Send OAM message to queue */ |
| status = onuEponSendCtrlFrameData(&(oamMsg->msg), oamMsg->macId); |
| if (status != MV_OK) |
| { |
| mvPonPrint(PON_PRINT_ERROR, PON_API_MODULE, |
| "ERROR: (%s:%d) onuEponSendCtrlFrameData OAM", __FILE_DESC__, __LINE__); |
| return(status); |
| } |
| |
| oamMsgReadIndex = nextOamMsgReadIndex; |
| mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE, |
| "Handle read(%d) write(%d)\n", oamMsgReadIndex, oamMsgWriteIndex); |
| |
| return(MV_OK); |
| } |
| |
| return(OAM_MSG_NOT_TRANS); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponOamFlushAllMsg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function flush OAM frames from SW FIFO |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponOamFlushAllMsg(void) |
| { |
| oamMsgReadIndex = oamMsgWriteIndex; |
| |
| return(MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponOamAllocMsg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function allocate OAM frame for transmission |
| ** |
| ** PARAMETERS: S_OnuEponOamMsg *msg |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponOamAllocMsg(S_OnuEponCtrlBuffer *msg, MV_U32 macId) |
| { |
| MV_U8 nextOamMsgWriteIndex; |
| |
| if ((oamMsgWriteIndex + 1) != oamMsgReadIndex) |
| { |
| nextOamMsgWriteIndex = oamMsgWriteIndex + 1; |
| /* roll over */ |
| if(nextOamMsgWriteIndex == OAM_MSG_FIFO_LENGTH) nextOamMsgWriteIndex = 0; |
| |
| /* update OAM message to the FIFO */ |
| oamMsgData[nextOamMsgWriteIndex].macId = macId; |
| memcpy (&(oamMsgData[nextOamMsgWriteIndex].msg), msg, sizeof (S_OnuEponCtrlBuffer)); |
| |
| /* update index */ |
| oamMsgWriteIndex = nextOamMsgWriteIndex; |
| |
| mvPonPrint(PON_PRINT_DEBUG, PON_API_MODULE, |
| "Alloc read(%d) write(%d\n", oamMsgReadIndex, oamMsgWriteIndex); |
| |
| if (((oamMsgWriteIndex > oamMsgReadIndex) && |
| ((oamMsgWriteIndex - oamMsgReadIndex) > 2)) || |
| ((oamMsgWriteIndex < oamMsgReadIndex) && |
| ((OAM_MSG_FIFO_LENGTH - (oamMsgReadIndex - oamMsgWriteIndex)) > 2))) |
| { |
| onuEponOamHandleMsg(); |
| onuEponDbaSwRprtMacTimerCfg(62500); |
| } |
| } |
| else |
| { |
| return (MV_ERROR); |
| } |
| |
| return (MV_OK); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponDgHandleMsg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function transmit DG OAM frame from SW FIFO |
| ** |
| ** PARAMETERS: None |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| //MV_STATUS onuEponDgHandleMsg(void) |
| //{ |
| // MV_STATUS status; |
| // |
| // if (oamDgMsgQueue.valid == OAM_MSG_DG_IND) |
| // { |
| // do |
| // { |
| // status = onuEponSendCtrlFrameData(&oamDgMsgQueue.msg, oamDgMsgQueue.macId); |
| // }while (status != MV_OK); |
| // |
| // return(status); |
| // } |
| // |
| // return(OAM_MSG_NOT_TRANS); |
| //} |
| |
| /******************************************************************************* |
| ** |
| ** onuEponDgAllocMsg |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function allocate DG OAM frame for transmission |
| ** |
| ** PARAMETERS: S_OnuEponCtrlBuffer *ctrlBuf |
| ** MV_U32 macId |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| //MV_STATUS onuEponDgAllocMsg(S_OnuEponCtrlBuffer *ctrlBuf, MV_U32 macId) |
| //{ |
| // memcpy(&(oamDgMsgQueue.msg), ctrlBuf, sizeof(S_OnuEponCtrlBuffer)); |
| // oamDgMsgQueue.macId = macId; |
| // oamDgMsgQueue.valid = OAM_MSG_DG_IND; |
| // |
| // return(MV_OK); |
| //} |
| |
| /******************************************************************************* |
| ** |
| ** onuEponDbaModeInit |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function returns EPON PHY output register value |
| ** |
| ** PARAMETERS: dbaMode either ONU_DBA_HW_RPRT_MODE or ONU_DBA_SW_RPRT_MODE |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: MV_U32 status |
| ** |
| *******************************************************************************/ |
| MV_STATUS onuEponDbaModeInit(MV_32 dbaMode) |
| { |
| MV_U32 macId; |
| MV_U32 queueId; |
| MV_U32 currentDbaMode; |
| MV_U32 interruptMask; |
| MV_STATUS status = MV_OK; |
| |
| currentDbaMode = onuEponDbOnuDbaModeGet(); |
| if (currentDbaMode == dbaMode) |
| return(MV_OK); |
| |
| switch (dbaMode) { |
| |
| case ONU_DBA_HW_RPRT_MODE: |
| |
| /* Stop SW DBA event miss timer */ |
| onuEponIsrTimerEventMissStateSet(MV_FALSE); |
| |
| /* Clear DBA Report interrupt */ |
| mvOnuEponMacPonInterruptMaskGet(&interruptMask); |
| interruptMask &= ~(ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK); |
| mvOnuEponMacPonInterruptMaskSet(interruptMask); |
| |
| /* Configure MAC DBA Report Registers */ |
| 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) */ |
| 0x0, /* Queueset1 supported - |
| set to 0, means all 8 queues |
| are active (queueReport) */ |
| 0x1, /* Number of queueSet - |
| support for 1 queueset */ |
| 0x1, /* Queueset1 supported - |
| set to 0x1, Software (reportBitmap) */ |
| macId); |
| |
| status |= mvOnuEponMacTxmCppReportBitMap(0x00FF, macId); /* Queueset1 - 8 queues enabled(0xFF), |
| 8 queues disabled(0x00) */ |
| status |= mvOnuEponMacTxmCppReportQueueSet(0x1, macId); /* Number of queuesets - |
| support for 1 queueset */ |
| |
| for (queueId = 0; queueId < 7; queueId++) |
| status |= mvOnuEponMacTxmCppReportQueueX(queueId, 0x03FF, macId); |
| |
| status |= mvOnuEponMacTxmCppReportQueueX(queueId, 0x53FF, macId); |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, |
| "ERROR: (%s:%d) mvOnuEponMacTxmCppReport...\n\r", __FILE_DESC__, __LINE__); |
| break; |
| } |
| } |
| |
| /* Set HW DBA mode */ |
| onuEponDbOnuSwRprtTimerTypeSet(ONU_EPON_HW_DBA_RPRT_TIMER); |
| |
| /* Start HW DBA Tx module timer */ |
| onuPonTimerEnable(&(onuPonResourceTbl_s.onuPonHwRprtTxModTimerId)); |
| |
| /* Enable HW DBA Report message handling */ |
| onuEponIsrTimerHwReportStateSet(MV_TRUE, /* Enable */ |
| dbaRprtT0StateVal, |
| dbaRprtT0StateInterval, |
| dbaRprtT1StateVal, |
| dbaRprtT1StateInterval); |
| break; |
| |
| case ONU_DBA_SW_RPRT_MODE: |
| |
| /* Disable HW DBA Report message handling */ |
| onuEponIsrTimerHwReportStateSet(MV_FALSE, |
| dbaRprtT0StateVal, |
| dbaRprtT0StateInterval, |
| dbaRprtT1StateVal, |
| dbaRprtT1StateInterval); |
| |
| /* Disable HW DBA Tx module timer */ |
| onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonHwRprtTxModTimerId)); |
| |
| /* Set SW DBA mode */ |
| onuEponDbOnuSwRprtTimerTypeSet(ONU_EPON_SW_DBA_RPRT_TIMER); |
| |
| /* Set SW DBA report update interval - 1 msec */ |
| onuEponDbOnuSwRprtMacTimerIntervalSet(62500); |
| onuEponDbaSwRprtMacTimerCfg(onuEponDbOnuSwRprtMacTimerIntervalGet()); |
| |
| /* Set SW DBA Report interrupt */ |
| mvOnuEponMacPonInterruptMaskGet(&interruptMask); |
| interruptMask |= (ONU_EPON_TIMESTAMP_VALUE_MATCH_MASK); |
| mvOnuEponMacPonInterruptMaskSet(interruptMask); |
| |
| /* Start SW DBA event miss timer */ |
| onuEponIsrTimerEventMissStateSet(MV_TRUE); |
| |
| for (status = MV_OK, 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) */ |
| 0x1, /* Number of queueSet - |
| * support for 1 queueset */ |
| 0x1, /* Queueset1 supported - |
| * set to 0x1, Software (reportBitmap) |
| */ |
| macId); |
| } |
| |
| if (status != MV_OK) { |
| mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, |
| "ERROR: (%s:%d) onuEponDbaModeInit...\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| break; |
| |
| default: |
| mvPonPrint(PON_PRINT_ERROR, PON_INIT_MODULE, |
| "ERROR: (%s:%d) onuEponDbaModeInit: Wrong DBA mode!\n\r", __FILE_DESC__, __LINE__); |
| return(MV_ERROR); |
| } |
| |
| onuEponDbOnuDbaModeSet(dbaMode); |
| |
| return(status); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** onuEponTimerTxPwrHndl |
| ** ____________________________________________________________________________ |
| ** |
| ** DESCRIPTION: The function start / stop 1 sec timer that will disable Tx if |
| ** expired |
| ** |
| ** PARAMETERS: unsigned long data |
| ** |
| ** OUTPUTS: None |
| ** |
| ** RETURNS: None |
| ** |
| *******************************************************************************/ |
| void onuEponTimerTxPwrHndl(unsigned long data) |
| { |
| unsigned long flags; |
| |
| spin_lock_irqsave(&onuPonIrqLock, flags); |
| |
| onuPonResourceTbl_s.onuPonTxPwrTimerId.onuPonTimerActive = ONU_PON_TIMER_NOT_ACTIVE; |
| |
| if (onuEponDbOnuStateGet(0) < ONU_EPON_03_OPERATION) |
| { |
| onuPonTxPowerOn(MV_FALSE); |
| } |
| |
| onuPonTimerDisable(&(onuPonResourceTbl_s.onuPonTxPwrTimerId)); |
| |
| spin_unlock_irqrestore(&onuPonIrqLock, flags); |
| } |
| |
| |