blob: 5b3c454462deab1e88c93a01eb00c3507e172dd3 [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms. Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.
********************************************************************************
Marvell Commercial License Option
If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.
********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of Marvell nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
/******************************************************************************
** FILE : gponOnuSrvc.c **
** **
** DESCRIPTION : This file implements ONU GPON Service Routines **
** functionality **
*******************************************************************************
* *
* MODIFICATION HISTORY: *
* *
* 29Oct06 Oren Ben Hayun created *
* =========================================================================== *
******************************************************************************/
/* Include Files
------------------------------------------------------------------------------*/
#include "gponOnuHeader.h"
#include "tpm_api.h"
/* Local Constant
------------------------------------------------------------------------------*/
#define __FILE_DESC__ "mv_pon/core/gpon/gponOnuSrvc.c"
#define POLYNOMIAL (0x04c11db7)
static unsigned long crc_table[256];
MV_U32 randomInternalDelayKey[5] = {0,0,0,0,0};
/* Global Variables
------------------------------------------------------------------------------*/
S_DbrBlockSize gponDbrArray[2048];
MV_U32 gponDbrBlock2048AndMore;
extern u8 mvMacAddr[CONFIG_MV_ETH_PORTS_NUM][MV_MAC_ADDR_SIZE];
MV_U32 randomCode = 0;
MV_U32 randomType = 0;
/* Local Variables
------------------------------------------------------------------------------*/
S_OnuGponLogEntry onuGponLogDb[ONU_GPON_LOG_SIZE + 1];
MV_32 onuGponLogDbEntryIndex = 0;
MV_32 onuGponLogDbEntryCount = 0;
MV_BOOL onuGponLogEnable = MV_FALSE;
MV_32 onuGponTcontFlushState[8] = {TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE,
TCONT_FLUSH_READY_STATE};
/* Export Functions
------------------------------------------------------------------------------*/
MV_STATUS onuGponSrvcGenCrcTable(void);
unsigned long onuGponSrvcUpdateCrc(unsigned long crc_accum, char *data_blk_ptr, int data_blk_size);
MV_STATUS onuGponSrvcGenDbrTable(void);
/* Local Functions
------------------------------------------------------------------------------*/
/*******************************************************************************
**
** onuGponSrvcInit
** ____________________________________________________________________________
**
** DESCRIPTION: The function init onu CRC generator
**
** PARAMETERS: None
**
** OUTPUTS: None
**
** RETURNS: MV_OK
**
*******************************************************************************/
MV_STATUS onuGponSrvcInit(void)
{
MV_STATUS rcode;
rcode = onuGponSrvcGenDbrTable();
if (rcode != MV_OK)
return(MV_ERROR);
rcode = onuGponSrvcGenCrcTable();
if (rcode != MV_OK)
return(MV_ERROR);
return (MV_OK);
}
/*******************************************************************************
**
** onuGponSrvcGenCrcTable
** ____________________________________________________________________________
**
** DESCRIPTION: The function generate the table of CRC remainders
** for all possible bytes
**
** PARAMETERS: None
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
MV_STATUS onuGponSrvcGenCrcTable(void)
{
register int i, j;
register unsigned long crc_accum;
for ( i = 0; i < 256; i++ )
{
crc_accum = ( (unsigned long) i << 24 );
for ( j = 0; j < 8; j++ )
{
if ( crc_accum & 0x80000000 )
{
crc_accum = ( crc_accum << 1 ) ^ POLYNOMIAL;
}
else
{
crc_accum = ( crc_accum << 1 );
}
}
crc_table[i] = crc_accum;
}
return(MV_OK);
}
/*******************************************************************************
**
** onuGponSrvcUpdateCrc
** ____________________________________________________________________________
**
** DESCRIPTION: The function CRC table
**
** PARAMETERS: unsigned long crc_accum
** char *data_blk_ptr
** int data_blk_size
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
unsigned long onuGponSrvcUpdateCrc(unsigned long crc_accum, char *data_blk_ptr, int data_blk_size)
{
register int i, j;
for ( j = 0; j < data_blk_size; j++ )
{
i = ( (int) ( crc_accum >> 24) ^ *data_blk_ptr++ ) & 0xff;
crc_accum = ( crc_accum << 8 ) ^ crc_table[i];
}
return (crc_accum ^ 0xFFFFFFFF);
}
/*******************************************************************************
**
** onuGponSrvcCalcCrc
** ____________________________________________________________________________
**
** DESCRIPTION: The function calc CRC
**
** PARAMETERS: unsigned long crc_accum
** char *data_blk_ptr
** int data_blk_size
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
unsigned int onuGponSrvcCalcCrc(unsigned char msg[], int size)
{
unsigned char data;
unsigned int idx;
unsigned int calcCrc = 0;
for (idx = 0; idx < size; idx++)
{
data = (unsigned char)((msg[idx]) ^ (calcCrc >> 24));
calcCrc = ((crc_table[data]) ^ (calcCrc << 8));
}
return (calcCrc);
}
/*******************************************************************************
**
** onuGponSrvcSerialNumberSet
** ____________________________________________________________________________
**
** DESCRIPTION: The function set SN in database and GPON MAC
**
** PARAMETERS: MV_U8 *serialNumber
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponSrvcSerialNumberSet(MV_U8 *serialNumber)
{
MV_STATUS rcode;
MV_U32 snMsg[ONU_GPON_MSG_LEN];
MV_U32 onuId;
/* Update Serial Number In Data Base */
/* --------------------------------- */
rcode = onuGponDbSerialNumSet((MV_U8*)serialNumber);
if (rcode != MV_OK)
return (rcode);
/* Get Serial Number Message from Database */
onuGponDbSnMsgGet(snMsg);
/* Update the Serial Number in S/N Message */
snMsg[0] = (snMsg[0] & 0xFFFF0000) |
(((MV_U32)(serialNumber[1])) |
(((MV_U32)(serialNumber[0])) << 8));
snMsg[1] = (((MV_U32)(serialNumber[5])) |
(((MV_U32)(serialNumber[4])) << 8) |
(((MV_U32)(serialNumber[3])) << 16)|
(((MV_U32)(serialNumber[2])) << 24));
snMsg[2] = ((((MV_U32)(serialNumber[7])) << 16) |
(((MV_U32)(serialNumber[6])) << 24) |
0x00000505);
/* Put back the updated Serial Number Message to Database */
onuGponDbSnMsgSet(snMsg);
/* Update Serial Number in ASIC */
/* ---------------------------- */
onuId = onuGponDbOnuIdGet();
rcode = mvOnuGponMacTxConstSerialNumberMsgSet(onuId,serialNumber,0);
if (rcode != MV_OK)
return (rcode);
return (MV_OK);
}
/*******************************************************************************
**
** onuGponSrvcConstPloamFromDbInit
** ____________________________________________________________________________
**
** DESCRIPTION: The function initialize the Constant Ploams in ASIC
** by values are in Database
**
** PARAMETERS: MV_BOOL initTime
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponSrvcConstPloamFromDbInit(MV_BOOL initTime)
{
MV_U32 onuId;
MV_U8 serialNumber[8];
MV_STATUS rcode;
if (initTime != MV_FALSE) /* In init time we wouldn't want to use semaphore */
{
onuId = onuGponDbOnuIdGet();
onuGponDbSerialNumGet(serialNumber);
rcode = mvOnuGponMacTxConstIdleMsgSet(onuId);
rcode |= mvOnuGponMacTxConstSerialNumberMsgSet(onuId, serialNumber,0);
return (rcode);
}
onuId = onuGponDbOnuIdGet();
onuGponDbSerialNumGet(serialNumber);
rcode = mvOnuGponMacTxConstIdleMsgSet(onuId);
rcode |= mvOnuGponMacTxConstSerialNumberMsgSet(onuId, serialNumber,0);
return (rcode);
}
/*******************************************************************************
**
** onuGponSrvcOnuIdUpdate
** ____________________________________________________________________________
**
** DESCRIPTION: The function update the ONU ID in the ASIC register and
** const ram
**
** PARAMETERS: MV_U32 onuId
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponSrvcOnuIdUpdate(MV_U32 onuId, MV_BOOL valid)
{
MV_STATUS rcode;
MV_U32 snMsg[ONU_GPON_MSG_LEN];
MV_U32 idleMsg[ONU_GPON_MSG_LEN];
MV_U8 serialNumber[8];
/* update onu Id register */
rcode = mvOnuGponMacOnuIdSet (onuId, valid);
if (rcode != MV_OK) return (rcode);
/* Get Serial Number Message from Database */
onuGponDbSnMsgGet(snMsg);
/* Update the Serial Number in S/N Message */
snMsg[0] = (ONU_GPON_US_MSG_SN_ONU << 16) | (onuId << 24) |
(snMsg[0] & 0x0000FFFF);
/* Put back the updated Serial Number Message to Database */
onuGponDbSnMsgSet(snMsg);
/* Get Idle Message from Database */
onuGponDbIdleMsgGet(idleMsg);
/* Update the Serial Number in S/N Message */
idleMsg[0] = (ONU_GPON_US_MSG_NO_MESSAGE << 16) | (onuId << 24) |
(idleMsg[0] & 0x0000FFFF);
/* Put back the updated Serial Number Message to Database */
onuGponDbIdleMsgSet(idleMsg);
onuGponDbSerialNumGet(serialNumber);
/* Write to ASIC the new Constant Messages */
rcode = mvOnuGponMacTxConstIdleMsgSet(onuId);
rcode |= mvOnuGponMacTxConstSerialNumberMsgSet(onuId, serialNumber,0);
return(rcode);
}
/*******************************************************************************
**
** onuGponSrvcAlarmNotify
** ____________________________________________________________________________
**
** DESCRIPTION: The function call Alarm Notification routine (if exist)
**
** PARAMETERS: MV_U32 alarm
** MV_U32 status
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
void onuGponSrvcAlarmNotify(MV_U32 alarm, MV_U32 status)
{
ALARMNOTIFYFUNC alarmFunc;
alarmFunc = onuGponDbAlarmNotifyGet();
if (alarmFunc != NULL)
{
alarmFunc(alarm, status);
}
}
/*******************************************************************************
**
** onuGponSrvcStatusNotify
** ____________________________________________________________________________
**
** DESCRIPTION: The function call Status Notification routine (if exist)
**
** PARAMETERS: MV_U32 status
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
void onuGponSrvcStatusNotify(MV_U32 status)
{
STATUSNOTIFYFUNC statusFunc = NULL;
/* Send signal to management layer ONLY for US sync */
if (status != GPON_ONU_STATUS_RANGED)
return;
statusFunc = onuGponDbStatusNotifyGet();
if (statusFunc != NULL)
{
statusFunc(status);
}
}
/*******************************************************************************
**
** onuGponSrvcOmccNotify
** ____________________________________________________________________________
**
** DESCRIPTION: The function call OMCC Port Notification routine (if exist)
**
** PARAMETERS: MV_U32 omccPortId
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
void onuGponSrvcOmccNotify(MV_U32 omccPortId)
{
OMCCNOTIFYFUNC omccFunc;
omccFunc = onuGponDbOmccNotifyGet();
if (omccFunc != NULL)
{
omccFunc(omccPortId);
}
}
/*******************************************************************************
**
** onuGponSrvcDisableMsgNotify
** ____________________________________________________________________________
**
** DESCRIPTION: The function call onu dusable Notification routine (if exist)
**
** PARAMETERS: MV_BOOL disable
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
void onuGponSrvcDisableMsgNotify(MV_BOOL disable)
{
DISABLENOTIFYFUNC disableFunc;
disableFunc = onuGponDbDisableNotifyGet();
if (disableFunc != NULL)
{
disableFunc(disable);
}
}
/*******************************************************************************
**
** onuGponSrvcAesKeyGenerate
** ____________________________________________________________________________
**
** DESCRIPTION: The function generates AES key
**
** PARAMETERS: MV_U8 *key
**
** OUTPUTS: 8 bytes buffer
**
** RETURNS: None
**
*******************************************************************************/
void onuGponSrvcAesKeyGenerate(MV_U8 *key)
{
MV_U32 aesKey[4] = {0x00000000,0x00000000,0x00000000,0x00000000};
MV_U32 i;
MV_U32 j;
static MV_U32 counter = 0;
MV_U32 microSec;
MV_U32 microSec_1;
MV_U32 advancer;
MV_U32 bw;
MV_U32 sfc;
mvOnuGponMacMicroSecCounterGet(&microSec);
mvOnuGponMacTxPloamDataFreeGet(&advancer);
mvOnuGponMacMicroSecCounterGet(&microSec_1);
microSec_1 += 0x11111111;
bw = 0xA5A5A5A5;
mvOnuGponMacRxSuperFrameCounterGet(&sfc);
bw ^= sfc;
for (i = 0 ; i < 8 ; i++)
{
aesKey[0] |= (MV_U32)((microSec >> i) & 0x1) << (4*i);
aesKey[0] |= (MV_U32)((bw >> i) & 0x1) << (4*i + 1);
aesKey[0] |= (MV_U32)((counter >> i) & 0x1) << (4*i + 2);
aesKey[0] |= (MV_U32)((microSec_1 >> i) & 0x1) << (4*i + 3);
}
for (i = 8 ; i < 16 ; i++)
{
aesKey[1] |= (MV_U32)((microSec >> i) & 0x1) << (4*(i-8));
aesKey[1] |= (MV_U32)((bw >> i) & 0x1) << (4*(i-8) + 1);
aesKey[1] |= (MV_U32)((counter >> i) & 0x1) << (4*(i-8) + 2);
aesKey[1] |= (MV_U32)((microSec_1 >> i) & 0x1) << (4*(i-8) + 3);
}
for (i = 16 ; i < 24 ; i++)
{
aesKey[2] |= (MV_U32)((microSec >> i) & 0x1) << (4*(i-16));
aesKey[2] |= (MV_U32)((bw >> i) & 0x1) << (4*(i-16) + 1);
aesKey[2] |= (MV_U32)((counter >> i) & 0x1) << (4*(i-16) + 2);
aesKey[2] |= (MV_U32)((microSec_1 >> i) & 0x1) << (4*(i-16) + 3);
}
for (i = 24 ; i < 32 ; i++)
{
aesKey[3] |= (MV_U32)((microSec >> i) & 0x1) << (4*(i-24));
aesKey[3] |= (MV_U32)((bw >> i) & 0x1) << (4*(i-24) + 1);
aesKey[3] |= (MV_U32)((counter >> i) & 0x1) << (4*(i-24) + 2);
aesKey[3] |= (MV_U32)((microSec_1 >> i) & 0x1) << (4*(i-24) + 3);
}
counter += advancer;
for (i = 0 ; i < 4 ; i++)
{
for (j = 0 ; j < 4 ; j++)
{
key[(j * 4) + i] = (MV_U8)((aesKey[j] >> (8 * (3 - i))) & 0xFF);
}
}
}
/*******************************************************************************
**
** onuGponSrvcGenDbrTable
** ____________________________________________________________________________
**
** DESCRIPTION: The function init onu DBR table
**
** PARAMETERS: None
**
** OUTPUTS: None
**
** RETURNS: MV_OK
**
*******************************************************************************/
MV_STATUS onuGponSrvcGenDbrTable(void)
{
MV_U32 index;
/* DBR table for all block size supported - NOT sorted
===================================================
Config 1/512 1/256 1/128 1/64 1/32 1/16 SUM 1/SUM (1/SUM) * 4 Block Size
0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0
000001 0.0000 0.0000 0.0000 0.0000 0.0000 0.0625 0.0625 16.0000 64.0000 64
000010 0.0000 0.0000 0.0000 0.0000 0.0313 0.0000 0.0313 32.0000 128.0000 128
000011 0.0000 0.0000 0.0000 0.0000 0.0313 0.0625 0.0938 10.6667 42.6667 43
000100 0.0000 0.0000 0.0000 0.0156 0.0000 0.0000 0.0156 64.0000 256.0000 256
000101 0.0000 0.0000 0.0000 0.0156 0.0000 0.0625 0.0781 12.8000 51.2000 51
000110 0.0000 0.0000 0.0000 0.0156 0.0313 0.0000 0.0469 21.3333 85.3333 85
000111 0.0000 0.0000 0.0000 0.0156 0.0313 0.0625 0.1094 9.1429 36.5714 37
001000 0.0000 0.0000 0.0078 0.0000 0.0000 0.0000 0.0078 128.0000 512.0000 512
001001 0.0000 0.0000 0.0078 0.0000 0.0000 0.0625 0.0703 14.2222 56.8889 57
001010 0.0000 0.0000 0.0078 0.0000 0.0313 0.0000 0.0391 25.6000 102.4000 102
001011 0.0000 0.0000 0.0078 0.0000 0.0313 0.0625 0.1016 9.8462 39.3846 39
001100 0.0000 0.0000 0.0078 0.0156 0.0000 0.0000 0.0234 42.6667 170.6667 171
001101 0.0000 0.0000 0.0078 0.0156 0.0000 0.0625 0.0859 11.6364 46.5455 47
001110 0.0000 0.0000 0.0078 0.0156 0.0313 0.0000 0.0547 18.2857 73.1429 73
001111 0.0000 0.0000 0.0078 0.0156 0.0313 0.0625 0.1172 8.5333 34.1333 34
010000 0.0000 0.0039 0.0000 0.0000 0.0000 0.0000 0.0039 256.0000 1024.0000 1024
010001 0.0000 0.0039 0.0000 0.0000 0.0000 0.0625 0.0664 15.0588 60.2353 60
010010 0.0000 0.0039 0.0000 0.0000 0.0313 0.0000 0.0352 28.4444 113.7778 114
010011 0.0000 0.0039 0.0000 0.0000 0.0313 0.0625 0.0977 10.2400 40.9600 41
010100 0.0000 0.0039 0.0000 0.0156 0.0000 0.0000 0.0195 51.2000 204.8000 205
010101 0.0000 0.0039 0.0000 0.0156 0.0000 0.0625 0.0820 12.1905 48.7619 49
010110 0.0000 0.0039 0.0000 0.0156 0.0313 0.0000 0.0508 19.6923 78.7692 79
010111 0.0000 0.0039 0.0000 0.0156 0.0313 0.0625 0.1133 8.8276 35.3103 35
011000 0.0000 0.0039 0.0078 0.0000 0.0000 0.0000 0.0117 85.3333 341.3333 341
011001 0.0000 0.0039 0.0078 0.0000 0.0000 0.0625 0.0742 13.4737 53.8947 54
011010 0.0000 0.0039 0.0078 0.0000 0.0313 0.0000 0.0430 23.2727 93.0909 93
011011 0.0000 0.0039 0.0078 0.0000 0.0313 0.0625 0.1055 9.4815 37.9259 38
011100 0.0000 0.0039 0.0078 0.0156 0.0000 0.0000 0.0273 36.5714 146.2857 146
011101 0.0000 0.0039 0.0078 0.0156 0.0000 0.0625 0.0898 11.1304 44.5217 45
011110 0.0000 0.0039 0.0078 0.0156 0.0313 0.0000 0.0586 17.0667 68.2667 68
011111 0.0000 0.0039 0.0078 0.0156 0.0313 0.0625 0.1211 8.2581 33.0323 33
100000 0.0020 0.0000 0.0000 0.0000 0.0000 0.0000 0.0020 512.0000 2048.0000 2048
100001 0.0020 0.0000 0.0000 0.0000 0.0000 0.0625 0.0645 15.5152 62.0606 62
100010 0.0020 0.0000 0.0000 0.0000 0.0313 0.0000 0.0332 30.1176 120.4706 120
100011 0.0020 0.0000 0.0000 0.0000 0.0313 0.0625 0.0957 10.4490 41.7959 42
100100 0.0020 0.0000 0.0000 0.0156 0.0000 0.0000 0.0176 56.8889 227.5556 228
100101 0.0020 0.0000 0.0000 0.0156 0.0000 0.0625 0.0801 12.4878 49.9512 50
100110 0.0020 0.0000 0.0000 0.0156 0.0313 0.0000 0.0488 20.4800 81.9200 82
100111 0.0020 0.0000 0.0000 0.0156 0.0313 0.0625 0.1113 8.9825 35.9298 36
101000 0.0020 0.0000 0.0078 0.0000 0.0000 0.0000 0.0098 102.4000 409.6000 410
101001 0.0020 0.0000 0.0078 0.0000 0.0000 0.0625 0.0723 13.8378 55.3514 55
101010 0.0020 0.0000 0.0078 0.0000 0.0313 0.0000 0.0410 24.3810 97.5238 98
101011 0.0020 0.0000 0.0078 0.0000 0.0313 0.0625 0.1035 9.6604 38.6415 39
101100 0.0020 0.0000 0.0078 0.0156 0.0000 0.0000 0.0254 39.3846 157.5385 158
101101 0.0020 0.0000 0.0078 0.0156 0.0000 0.0625 0.0879 11.3778 45.5111 46
101110 0.0020 0.0000 0.0078 0.0156 0.0313 0.0000 0.0566 17.6552 70.6207 71
101111 0.0020 0.0000 0.0078 0.0156 0.0313 0.0625 0.1191 8.3934 33.5738 34
110000 0.0020 0.0039 0.0000 0.0000 0.0000 0.0000 0.0059 170.6667 682.6667 683
110001 0.0020 0.0039 0.0000 0.0000 0.0000 0.0625 0.0684 14.6286 58.5143 59
110010 0.0020 0.0039 0.0000 0.0000 0.0313 0.0000 0.0371 26.9474 107.7895 108
110011 0.0020 0.0039 0.0000 0.0000 0.0313 0.0625 0.0996 10.0392 40.1569 40
110100 0.0020 0.0039 0.0000 0.0156 0.0000 0.0000 0.0215 46.5455 186.1818 186
110101 0.0020 0.0039 0.0000 0.0156 0.0000 0.0625 0.0840 11.9070 47.6279 48
110110 0.0020 0.0039 0.0000 0.0156 0.0313 0.0000 0.0527 18.9630 75.8519 76
110111 0.0020 0.0039 0.0000 0.0156 0.0313 0.0625 0.1152 8.6780 34.7119 35
111000 0.0020 0.0039 0.0078 0.0000 0.0000 0.0000 0.0137 73.1429 292.5714 293
111001 0.0020 0.0039 0.0078 0.0000 0.0000 0.0625 0.0762 13.1282 52.5128 53
111010 0.0020 0.0039 0.0078 0.0000 0.0313 0.0000 0.0449 22.2609 89.0435 89
111011 0.0020 0.0039 0.0078 0.0000 0.0313 0.0625 0.1074 9.3091 37.2364 37
111100 0.0020 0.0039 0.0078 0.0156 0.0000 0.0000 0.0293 34.1333 136.5333 137
111101 0.0020 0.0039 0.0078 0.0156 0.0000 0.0625 0.0918 10.8936 43.5745 44
111110 0.0020 0.0039 0.0078 0.0156 0.0313 0.0000 0.0605 16.5161 66.0645 66
111111 0.0020 0.0039 0.0078 0.0156 0.0313 0.0625 0.1230 8.1270 32.5079 33
DBR table for all block size supported - Sorted by Block Size
=============================================================
Config 1/512 1/256 1/128 1/64 1/32 1/16 SUM 1/SUM (1/SUM) * 4 Block Size
0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0
111111 0.0020 0.0039 0.0078 0.0156 0.0313 0.0625 0.1230 8.1270 32.5079 33
011111 0.0000 0.0039 0.0078 0.0156 0.0313 0.0625 0.1211 8.2581 33.0323 33
101111 0.0020 0.0000 0.0078 0.0156 0.0313 0.0625 0.1191 8.3934 33.5738 34
001111 0.0000 0.0000 0.0078 0.0156 0.0313 0.0625 0.1172 8.5333 34.1333 34
110111 0.0020 0.0039 0.0000 0.0156 0.0313 0.0625 0.1152 8.6780 34.7119 35
010111 0.0000 0.0039 0.0000 0.0156 0.0313 0.0625 0.1133 8.8276 35.3103 35
100111 0.0020 0.0000 0.0000 0.0156 0.0313 0.0625 0.1113 8.9825 35.9298 36
000111 0.0000 0.0000 0.0000 0.0156 0.0313 0.0625 0.1094 9.1429 36.5714 37
111011 0.0020 0.0039 0.0078 0.0000 0.0313 0.0625 0.1074 9.3091 37.2364 37
011011 0.0000 0.0039 0.0078 0.0000 0.0313 0.0625 0.1055 9.4815 37.9259 38
101011 0.0020 0.0000 0.0078 0.0000 0.0313 0.0625 0.1035 9.6604 38.6415 39
001011 0.0000 0.0000 0.0078 0.0000 0.0313 0.0625 0.1016 9.8462 39.3846 39
110011 0.0020 0.0039 0.0000 0.0000 0.0313 0.0625 0.0996 10.0392 40.1569 40
010011 0.0000 0.0039 0.0000 0.0000 0.0313 0.0625 0.0977 10.2400 40.9600 41
100011 0.0020 0.0000 0.0000 0.0000 0.0313 0.0625 0.0957 10.4490 41.7959 42
000011 0.0000 0.0000 0.0000 0.0000 0.0313 0.0625 0.0938 10.6667 42.6667 43
111101 0.0020 0.0039 0.0078 0.0156 0.0000 0.0625 0.0918 10.8936 43.5745 44
011101 0.0000 0.0039 0.0078 0.0156 0.0000 0.0625 0.0898 11.1304 44.5217 45
101101 0.0020 0.0000 0.0078 0.0156 0.0000 0.0625 0.0879 11.3778 45.5111 46
001101 0.0000 0.0000 0.0078 0.0156 0.0000 0.0625 0.0859 11.6364 46.5455 47
110101 0.0020 0.0039 0.0000 0.0156 0.0000 0.0625 0.0840 11.9070 47.6279 48
010101 0.0000 0.0039 0.0000 0.0156 0.0000 0.0625 0.0820 12.1905 48.7619 49
100101 0.0020 0.0000 0.0000 0.0156 0.0000 0.0625 0.0801 12.4878 49.9512 50
000101 0.0000 0.0000 0.0000 0.0156 0.0000 0.0625 0.0781 12.8000 51.2000 51
111001 0.0020 0.0039 0.0078 0.0000 0.0000 0.0625 0.0762 13.1282 52.5128 53
011001 0.0000 0.0039 0.0078 0.0000 0.0000 0.0625 0.0742 13.4737 53.8947 54
101001 0.0020 0.0000 0.0078 0.0000 0.0000 0.0625 0.0723 13.8378 55.3514 55
001001 0.0000 0.0000 0.0078 0.0000 0.0000 0.0625 0.0703 14.2222 56.8889 57
110001 0.0020 0.0039 0.0000 0.0000 0.0000 0.0625 0.0684 14.6286 58.5143 59
010001 0.0000 0.0039 0.0000 0.0000 0.0000 0.0625 0.0664 15.0588 60.2353 60
100001 0.0020 0.0000 0.0000 0.0000 0.0000 0.0625 0.0645 15.5152 62.0606 62
000001 0.0000 0.0000 0.0000 0.0000 0.0000 0.0625 0.0625 16.0000 64.0000 64
111110 0.0020 0.0039 0.0078 0.0156 0.0313 0.0000 0.0605 16.5161 66.0645 66
011110 0.0000 0.0039 0.0078 0.0156 0.0313 0.0000 0.0586 17.0667 68.2667 68
101110 0.0020 0.0000 0.0078 0.0156 0.0313 0.0000 0.0566 17.6552 70.6207 71
001110 0.0000 0.0000 0.0078 0.0156 0.0313 0.0000 0.0547 18.2857 73.1429 73
110110 0.0020 0.0039 0.0000 0.0156 0.0313 0.0000 0.0527 18.9630 75.8519 76
010110 0.0000 0.0039 0.0000 0.0156 0.0313 0.0000 0.0508 19.6923 78.7692 79
100110 0.0020 0.0000 0.0000 0.0156 0.0313 0.0000 0.0488 20.4800 81.9200 82
000110 0.0000 0.0000 0.0000 0.0156 0.0313 0.0000 0.0469 21.3333 85.3333 85
111010 0.0020 0.0039 0.0078 0.0000 0.0313 0.0000 0.0449 22.2609 89.0435 89
011010 0.0000 0.0039 0.0078 0.0000 0.0313 0.0000 0.0430 23.2727 93.0909 93
101010 0.0020 0.0000 0.0078 0.0000 0.0313 0.0000 0.0410 24.3810 97.5238 98
001010 0.0000 0.0000 0.0078 0.0000 0.0313 0.0000 0.0391 25.6000 102.4000 102
110010 0.0020 0.0039 0.0000 0.0000 0.0313 0.0000 0.0371 26.9474 107.7895 108
010010 0.0000 0.0039 0.0000 0.0000 0.0313 0.0000 0.0352 28.4444 113.7778 114
100010 0.0020 0.0000 0.0000 0.0000 0.0313 0.0000 0.0332 30.1176 120.4706 120
000010 0.0000 0.0000 0.0000 0.0000 0.0313 0.0000 0.0313 32.0000 128.0000 128
111100 0.0020 0.0039 0.0078 0.0156 0.0000 0.0000 0.0293 34.1333 136.5333 137
011100 0.0000 0.0039 0.0078 0.0156 0.0000 0.0000 0.0273 36.5714 146.2857 146
101100 0.0020 0.0000 0.0078 0.0156 0.0000 0.0000 0.0254 39.3846 157.5385 158
001100 0.0000 0.0000 0.0078 0.0156 0.0000 0.0000 0.0234 42.6667 170.6667 171
110100 0.0020 0.0039 0.0000 0.0156 0.0000 0.0000 0.0215 46.5455 186.1818 186
010100 0.0000 0.0039 0.0000 0.0156 0.0000 0.0000 0.0195 51.2000 204.8000 205
100100 0.0020 0.0000 0.0000 0.0156 0.0000 0.0000 0.0176 56.8889 227.5556 228
000100 0.0000 0.0000 0.0000 0.0156 0.0000 0.0000 0.0156 64.0000 256.0000 256
111000 0.0020 0.0039 0.0078 0.0000 0.0000 0.0000 0.0137 73.1429 292.5714 293
011000 0.0000 0.0039 0.0078 0.0000 0.0000 0.0000 0.0117 85.3333 341.3333 341
101000 0.0020 0.0000 0.0078 0.0000 0.0000 0.0000 0.0098 102.4000 409.6000 410
001000 0.0000 0.0000 0.0078 0.0000 0.0000 0.0000 0.0078 128.0000 512.0000 512
110000 0.0020 0.0039 0.0000 0.0000 0.0000 0.0000 0.0059 170.6667 682.6667 683
010000 0.0000 0.0039 0.0000 0.0000 0.0000 0.0000 0.0039 256.0000 1024.0000 1024
100000 0.0020 0.0000 0.0000 0.0000 0.0000 0.0000 0.0020 512.0000 2048.0000 2048
*/
for (index = 0; index < 34; index++)
{
gponDbrArray[index].bitMask = 0x3F; /*0b111111;*/
gponDbrArray[index].blockSize = 33;
}
gponDbrArray[ 34].bitMask = 0x2F; /*0b101111;*/
gponDbrArray[ 34].blockSize = 34;
gponDbrArray[ 35].bitMask = 0x37; /*0b110111;*/
gponDbrArray[ 35].blockSize = 35;
gponDbrArray[ 36].bitMask = 0x27; /*0b100111;*/
gponDbrArray[ 36].blockSize = 36;
gponDbrArray[ 37].bitMask = 0x07; /*0b000111;*/
gponDbrArray[ 37].blockSize = 37;
gponDbrArray[ 38].bitMask = 0x1B; /*0b011011;*/
gponDbrArray[ 38].blockSize = 38;
gponDbrArray[ 39].bitMask = 0x2B; /*0b101011;*/
gponDbrArray[ 39].blockSize = 39;
gponDbrArray[ 40].bitMask = 0x33; /*0b110011;*/
gponDbrArray[ 40].blockSize = 40;
gponDbrArray[ 41].bitMask = 0x13; /*0b010011;*/
gponDbrArray[ 41].blockSize = 41;
gponDbrArray[ 42].bitMask = 0x23; /*0b100011;*/
gponDbrArray[ 42].blockSize = 42;
gponDbrArray[ 43].bitMask = 0x03; /*0b000011;*/
gponDbrArray[ 43].blockSize = 43;
gponDbrArray[ 44].bitMask = 0x3D; /*0b111101;*/
gponDbrArray[ 44].blockSize = 44;
gponDbrArray[ 45].bitMask = 0x1D; /*0b011101;*/
gponDbrArray[ 45].blockSize = 45;
gponDbrArray[ 46].bitMask = 0x2D; //0b101101;
gponDbrArray[ 46].blockSize = 46;
gponDbrArray[ 47].bitMask = 0x0D; //0b001101;
gponDbrArray[ 47].blockSize = 47;
gponDbrArray[ 48].bitMask = 0x35; //0b110101;
gponDbrArray[ 48].blockSize = 48;
gponDbrArray[ 49].bitMask = 0x15; //0b010101;
gponDbrArray[ 49].blockSize = 49;
gponDbrArray[ 50].bitMask = 0x25; //0b100101;
gponDbrArray[ 50].blockSize = 50;
gponDbrArray[ 51].bitMask = 0x05; //0b000101;
gponDbrArray[ 51].blockSize = 51;
gponDbrArray[ 52].bitMask = 0x05; //0b000101;
gponDbrArray[ 52].blockSize = 51;
gponDbrArray[ 53].bitMask = 0x39; //0b111001;
gponDbrArray[ 53].blockSize = 53;
gponDbrArray[ 54].bitMask = 0x19; //0b011001;
gponDbrArray[ 54].blockSize = 54;
gponDbrArray[ 55].bitMask = 0x29; //0b101001;
gponDbrArray[ 55].blockSize = 55;
gponDbrArray[ 56].bitMask = 0x29; //0b101001;
gponDbrArray[ 56].blockSize = 55;
gponDbrArray[ 57].bitMask = 0x09; //0b001001;
gponDbrArray[ 57].blockSize = 57;
gponDbrArray[ 58].bitMask = 0x09; //0b001001;
gponDbrArray[ 58].blockSize = 57;
gponDbrArray[ 59].bitMask = 0x31; //0b110001;
gponDbrArray[ 59].blockSize = 59;
gponDbrArray[ 60].bitMask = 0x11; //0b010001;
gponDbrArray[ 60].blockSize = 60;
gponDbrArray[ 61].bitMask = 0x11; //0b010001;
gponDbrArray[ 61].blockSize = 60;
gponDbrArray[ 62].bitMask = 0x21; //0b100001;
gponDbrArray[ 62].blockSize = 62;
gponDbrArray[ 63].bitMask = 0x21; //0b100001;
gponDbrArray[ 63].blockSize = 62;
gponDbrArray[ 64].bitMask = 0x01; //0b000001;
gponDbrArray[ 64].blockSize = 64;
gponDbrArray[ 65].bitMask = 0x01; //0b000001;
gponDbrArray[ 65].blockSize = 64;
gponDbrArray[ 66].bitMask = 0x3E; //0b111110;
gponDbrArray[ 66].blockSize = 66;
gponDbrArray[ 67].bitMask = 0x3E; //0b111110;
gponDbrArray[ 67].blockSize = 66;
gponDbrArray[ 68].bitMask = 0x1E; //0b011110;
gponDbrArray[ 68].blockSize = 68;
gponDbrArray[ 69].bitMask = 0x1E; //0b011110;
gponDbrArray[ 69].blockSize = 68;
gponDbrArray[ 70].bitMask = 0x1E; //0b011110;
gponDbrArray[ 70].blockSize = 68;
gponDbrArray[ 71].bitMask = 0x2E; //0b101110;
gponDbrArray[ 71].blockSize = 71;
gponDbrArray[ 72].bitMask = 0x2E; //0b101110;
gponDbrArray[ 72].blockSize = 71;
for (index = 73; index < 76; index++)
{
gponDbrArray[index].bitMask = 0x0E; //0b001110;
gponDbrArray[index].blockSize = 73;
}
for (index = 76; index < 79; index++)
{
gponDbrArray[index].bitMask = 0x36; //0b110110;
gponDbrArray[index].blockSize = 76;
}
for (index = 79; index < 82; index++)
{
gponDbrArray[index].bitMask = 0x16; //0b010110;
gponDbrArray[index].blockSize = 79;
}
for (index = 82; index < 85; index++)
{
gponDbrArray[index].bitMask = 0x26; //0b100110;
gponDbrArray[index].blockSize = 82;
}
for (index = 85; index < 89; index++)
{
gponDbrArray[index].bitMask = 0x06; //0b000110;
gponDbrArray[index].blockSize = 85;
}
for (index = 89; index < 93; index++)
{
gponDbrArray[index].bitMask = 0x3A; //0b111010;
gponDbrArray[index].blockSize = 89;
}
for (index = 93; index < 98; index++)
{
gponDbrArray[index].bitMask = 0x1A; //0b011010;
gponDbrArray[index].blockSize = 93;
}
for (index = 98; index < 102; index++)
{
gponDbrArray[index].bitMask = 0x2A; //0b101010;
gponDbrArray[index].blockSize = 98;
}
for (index = 102; index < 108; index++)
{
gponDbrArray[index].bitMask = 0x0A; //0b001010;
gponDbrArray[index].blockSize = 102;
}
for (index = 108; index < 114; index++)
{
gponDbrArray[index].bitMask = 0x32; //0b110010;
gponDbrArray[index].blockSize = 108;
}
for (index = 114; index < 120; index++)
{
gponDbrArray[index].bitMask = 0x12; //0b010010;
gponDbrArray[index].blockSize = 114;
}
for (index = 120; index < 128; index++)
{
gponDbrArray[index].bitMask = 0x22; //0b100010;
gponDbrArray[index].blockSize = 120;
}
for (index = 128; index < 137; index++)
{
gponDbrArray[index].bitMask = 0x02; //0b000010;
gponDbrArray[index].blockSize = 128;
}
for (index = 137; index < 146; index++)
{
gponDbrArray[index].bitMask = 0x3C; //0b111100;
gponDbrArray[index].blockSize = 137;
}
for (index = 137; index < 146; index++)
{
gponDbrArray[index].bitMask = 0x3C; //0b111100;
gponDbrArray[index].blockSize = 137;
}
for (index = 146; index < 158; index++)
{
gponDbrArray[index].bitMask = 0x1C; //0b011100;
gponDbrArray[index].blockSize = 146;
}
for (index = 158; index < 171; index++)
{
gponDbrArray[index].bitMask = 0x2C; //0b101100;
gponDbrArray[index].blockSize = 158;
}
for (index = 171; index < 186; index++)
{
gponDbrArray[index].bitMask = 0x0C; //0b001100;
gponDbrArray[index].blockSize = 171;
}
for (index = 186; index < 205; index++)
{
gponDbrArray[index].bitMask = 0x34; //0b110100;
gponDbrArray[index].blockSize = 186;
}
for (index = 205; index < 228; index++)
{
gponDbrArray[index].bitMask = 0x14; //0b010100;
gponDbrArray[index].blockSize = 205;
}
for (index = 228; index < 256; index++)
{
gponDbrArray[index].bitMask = 0x24; //0b100100;
gponDbrArray[index].blockSize = 228;
}
for (index = 256; index < 293; index++)
{
gponDbrArray[index].bitMask = 0x04; //0b000100;
gponDbrArray[index].blockSize = 256;
}
for (index = 293; index < 341; index++)
{
gponDbrArray[index].bitMask = 0x38; //0b111000;
gponDbrArray[index].blockSize = 293;
}
for (index = 341; index < 410; index++)
{
gponDbrArray[index].bitMask = 0x18; //0b011000;
gponDbrArray[index].blockSize = 341;
}
for (index = 410; index < 512; index++)
{
gponDbrArray[index].bitMask = 0x28; //0b101000;
gponDbrArray[index].blockSize = 410;
}
for (index = 512; index < 683; index++)
{
gponDbrArray[index].bitMask = 0x08; //0b001000;
gponDbrArray[index].blockSize = 512;
}
for (index = 683; index < 1024; index++)
{
gponDbrArray[index].bitMask = 0x30; //0b110000;
gponDbrArray[index].blockSize = 683;
}
for (index = 1024; index < 2048; index++)
{
gponDbrArray[index].bitMask = 0x10; //0b010000;
gponDbrArray[index].blockSize = 1024;
}
gponDbrBlock2048AndMore = 0x20; //0b100000;
return(MV_OK);
}
/*******************************************************************************
**
** onuGponSrvcDbrBlockSizeSet
** ____________________________________________________________________________
**
** DESCRIPTION: The function configure DBR block size
**
** PARAMETERS: MV_U32 blockSize
**
** OUTPUTS: None
**
** RETURNS: None
**
*******************************************************************************/
MV_STATUS onuGponSrvcDbrBlockSizeSet(MV_U32 blockSize, MV_U32 *actualBlockSize)
{
MV_STATUS rcode;
MV_U32 macBlockSizeBitMask;
MV_U32 macBlockSizeValue;
if (blockSize >= 2048)
{
macBlockSizeBitMask = gponDbrBlock2048AndMore;
macBlockSizeValue = 2048;
}
else
{
macBlockSizeBitMask = gponDbrArray[blockSize].bitMask;
macBlockSizeValue = gponDbrArray[blockSize].blockSize;
}
rcode = mvOnuGponMacTxDbrBlockSizeSet(macBlockSizeBitMask);
if (rcode != MV_OK)
return (rcode);
*actualBlockSize = macBlockSizeValue;
return (rcode);
}
/*******************************************************************************
**
** onuGponSrvcRangingRandomInit
** ____________________________________________________________________________
**
** DESCRIPTION: The function init onu gpon ranging random number
**
** PARAMETERS: None
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponSrvcRangingRandomInit(void)
{
MV_U32 thermalRegAddr = 0x000184D8;
MV_U32 thermalRegValue = 0;
MV_U32 temp = 0;
int tmp_size;
/* 0 MAC */
/* 1 Thermal */
/* 2 Micro Timer */
/* 3 Randon Num 1 */
/* 4 Randon Num 2 */
/* Generate internal delay random part */
randomInternalDelayKey[0] = (mvMacAddr[2][2]);
randomInternalDelayKey[0] |= ((mvMacAddr[2][3]) << 8);
randomInternalDelayKey[0] |= ((mvMacAddr[2][4]) << 16);
randomInternalDelayKey[0] |= ((mvMacAddr[2][5]) << 24);
mvOsDelay((mvMacAddr[2][2]) + (mvMacAddr[2][3]) + (mvMacAddr[2][4]) + (mvMacAddr[2][5]));
thermalRegValue = ((MV_REG_READ(thermalRegAddr) >> 10) & 0x1FF);
randomInternalDelayKey[1] = thermalRegValue;
mvOsDelay((thermalRegValue & 0xFF) + (mvMacAddr[2][4]) + (mvMacAddr[2][5]));
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[2] = (temp & 0xFFFF);
thermalRegValue = ((MV_REG_READ(thermalRegAddr) >> 10) & 0x1FF);
randomInternalDelayKey[1] |= thermalRegValue << 9;
mvOsDelay((thermalRegValue & 0xFF) + (mvMacAddr[2][3]));
thermalRegValue = ((MV_REG_READ(thermalRegAddr) >> 10) & 0x1FF);
randomInternalDelayKey[1] |= thermalRegValue << 18;
mvOsDelay((thermalRegValue & 0xFF) + (mvMacAddr[2][2]));
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[3] = (temp & 0xFFFF);
thermalRegValue = ((MV_REG_READ(thermalRegAddr) >> 10) & 0x1F);
randomInternalDelayKey[1] |= thermalRegValue << 27;
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[2] |= ((temp & 0xFFFF) << 16);
mvOsDelay(randomInternalDelayKey[2] & 0xFF);
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[4] = (temp & 0xFFFF);
mvOsDelay((randomInternalDelayKey[1] & 0xFF000) >> 12);
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[4] |= (((temp & 0xFFFF00) >> 8) << 16);
mvOsDelay((randomInternalDelayKey[1] & 0xFF00000) >> 20);
mvOnuGponMacMicroSecCounterGet(&temp);
randomInternalDelayKey[3] |= (((temp & 0xFFFF000) >> 12) << 16);
for (tmp_size=0; tmp_size<5; tmp_size++)
{
add_input_randomness(randomType, randomCode, randomInternalDelayKey[tmp_size]);
}
return(MV_OK);
}
/*******************************************************************************
**
** SYNC LOG SECTION
**
********************************************************************************/
/*******************************************************************************
**
** onuGponSyncLogEnable
** ____________________________________________________________________________
**
** DESCRIPTION: The function enable log mechanism to start record events
**
** PARAMETERS: MV_U32 enable
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
void onuGponSyncLogEnable(MV_U32 enable)
{
if (enable == 0)
{
onuGponLogEnable = MV_FALSE;
onuGponLogDbEntryCount = 0;
onuGponLogDbEntryIndex = 0;
}
else
{
onuGponLogEnable = MV_TRUE;
}
}
/*******************************************************************************
**
** onuGponSyncLog
** ____________________________________________________________________________
**
** DESCRIPTION: The function logs records into the cyclic log buffer
**
** PARAMETERS: MV_U32 event, MV_U32 data1, MV_U32 data2, MV_U32 data3
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
void onuGponSyncLog(MV_U32 event, MV_U32 data1, MV_U32 data2, MV_U32 data3)
{
MV_U32 currentState;
MV_U32 timeStamp;
if (onuGponLogEnable != MV_TRUE)
{
return;
}
currentState = onuGponDbOnuStateGet();
asicOntGlbRegReadNoCheck(mvAsicReg_GPON_GEN_MICRO_SEC_CNT, &timeStamp, 0);
if (onuGponLogDbEntryIndex == ONU_GPON_LOG_SIZE)
{
onuGponLogDbEntryIndex = 0;
}
/* save log information */
onuGponLogDb[onuGponLogDbEntryIndex].event = event;
onuGponLogDb[onuGponLogDbEntryIndex].state = currentState;
onuGponLogDb[onuGponLogDbEntryIndex].time = timeStamp;
onuGponLogDb[onuGponLogDbEntryIndex].dataVal1 = data1;
onuGponLogDb[onuGponLogDbEntryIndex].dataVal2 = data2;
onuGponLogDb[onuGponLogDbEntryIndex].dataVal3 = data3;
onuGponLogDbEntryIndex++;
/* The max number of counter is 512 */
if (onuGponLogDbEntryCount < ONU_GPON_LOG_SIZE)
{
onuGponLogDbEntryCount++;
}
}
/*******************************************************************************
**
** onuGponSyncLogPrint
** ____________________________________________________________________________
**
** DESCRIPTION: The function print the records placed in the log
**
** PARAMETERS: None
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
void onuGponSyncLogPrint(void)
{
MV_32 index;
MV_U32 printEntry;
MV_BOOL logEnabled;
logEnabled = onuGponLogEnable;
onuGponLogEnable = MV_FALSE;
printk("=======GPON LOG has %d items=======\r\n", onuGponLogDbEntryCount);
for (index = 0; index < onuGponLogDbEntryCount; index++)
{
if ((onuGponLogDbEntryIndex - index) > 0)
{
printEntry = onuGponLogDbEntryIndex - index - 1;
}
else
{
printEntry = ((MV_U32)ONU_GPON_LOG_SIZE - 1) - (index - onuGponLogDbEntryIndex);
}
switch(onuGponLogDb[printEntry].event)
{
case ONU_GPON_LOG_MSG:
printk("[%03d] PLOAM message, state=%d, time=%08x, onuId=%d, msgId=%d\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time,
onuGponLogDb[printEntry].dataVal1,
onuGponLogDb[printEntry].dataVal2);
break;
case ONU_GPON_LOG_MSG_CONTENT:
printk("[%03d] PLOAM message, data=0x%08x%08x%08x [030201000706050411100908]\n", printEntry,
onuGponLogDb[printEntry].dataVal1,
onuGponLogDb[printEntry].dataVal2,
onuGponLogDb[printEntry].dataVal3);
break;
case ONU_GPON_LOG_INTERRUPT:
printk("[%03d] Interrupt, state=%d, time=%08x, event&status=0x%08x\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time,
onuGponLogDb[printEntry].dataVal1);
printk("==========================================================\n");
break;
case ONU_GPON_LOG_INTERRUPT_XVR_SD:
printk("[%03d] LOS Interrupt, state=%d, time=%08x, status=%d\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time,
onuGponLogDb[printEntry].dataVal1);
break;
case ONU_GPON_LOG_INTERRUPT_LOF:
printk("[%03d] LOF Interrupt, state=%d, time=%08x, status=%d\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time,
onuGponLogDb[printEntry].dataVal1);
break;
case ONU_GPON_LOG_INTERRUPT_SERDES_START:
printk("[%03d] SERDES Start, state=%d, time=%08x\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time);
break;
case ONU_GPON_LOG_INTERRUPT_SERDES_STOP:
printk("[%03d] SERDES Stop, state=%d, time=%08x\n", printEntry,
onuGponLogDb[printEntry].state,
onuGponLogDb[printEntry].time);
break;
case ONU_GPON_LOG_STATE:
printk("[%03d] State, state=%d, time=%08x\n", printEntry,
onuGponLogDb[printEntry].dataVal1,
onuGponLogDb[printEntry].time);
break;
case ONU_GPON_LOG_FREE_TEXT:
printk("[%03d] Free, time=%08x %d %d %d\n", printEntry,
onuGponLogDb[printEntry].time,
onuGponLogDb[printEntry].dataVal1,
onuGponLogDb[printEntry].dataVal2,
onuGponLogDb[printEntry].dataVal3);
break;
default:
printk("[%03d] Other\r\n", printEntry);
break;
}
}
onuGponLogDbEntryCount = 0;
onuGponLogDbEntryIndex = 0;
onuGponLogEnable = logEnabled;
}
/*******************************************************************************
**
** T-CONT FLUSH SECTION
**
********************************************************************************/
/*******************************************************************************
**
** onuGponWqTcontFlush
** ____________________________________________________________________________
**
** DESCRIPTION: The function schedule T-Cont queue flush work to the T-Cont
** work queue
**
** PARAMETERS: MV_U32 tcont
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponWqTcontFlush(MV_U32 tcont)
{
if (tcont != 0xFF)
queue_work(gponTcontFlushWq.ponWq, (struct work_struct *)&gponTcontCleanWork[tcont]);
else
queue_work(gponTcontFlushWq.ponWq, (struct work_struct *)&gponTcontCleanAllWork);
return(MV_OK);
}
/*******************************************************************************
**
** onuGponWqTcontActivate
** ____________________________________________________________________________
**
** DESCRIPTION: The function schedule T-Cont queue activate work to the T-Cont
** work queue
**
** PARAMETERS: MV_U32 tcont
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
MV_STATUS onuGponWqTcontActivate(MV_U32 tcont)
{
queue_work(gponTcontFlushWq.ponWq, (struct work_struct *)&gponTcontActiveWork[tcont]);
return(MV_OK);
}
/*******************************************************************************
**
** onuGponWqTcontFunc
** ____________________________________________________________________________
**
** DESCRIPTION: The function process incoming work to the T-Cont work queue
**
** PARAMETERS: struct work_struct *work
**
** OUTPUTS: None
**
** RETURNS: MV_OK or error
**
*******************************************************************************/
void onuGponWqTcontFunc(struct work_struct *work)
{
S_onuPonWork *currentWork = (S_onuPonWork *)work;
MV_U32 tcont = currentWork->param;
MV_U32 index = 0;
MV_U8 *stateText[] = {"",
"Ready State ",
"Running State ",
"Blocking State"};
/* Handle T-Cont Clear */
/* =================== */
if (currentWork->action == TCONT_CLEAN_EVENT)
{
if (onuGponTcontFlushState[tcont] == TCONT_FLUSH_RUNNING_STATE)
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) TCONT (%d) CLEAN_EVENT\n", __FILE_DESC__, __LINE__, tcont);
onuGponTcontFlushState[tcont] = TCONT_FLUSH_BLOCKING_STATE;
tpm_deactive_tcont(tcont);
onuGponTcontFlushState[tcont] = TCONT_FLUSH_READY_STATE;
}
else
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) Received TCONT_CLEAN_EVENT while in T-CONT(%d) state(%s)\n",
__FILE_DESC__, __LINE__, tcont, stateText[onuGponTcontFlushState[tcont]]);
}
}
/* Handle All T-Cont Clear */
/* ======================= */
else if (currentWork->action == TCONT_CLEAN_ALL_EVENT)
{
for (tcont = 0; tcont < 8; tcont++)
{
if (onuGponTcontFlushState[tcont] == TCONT_FLUSH_RUNNING_STATE)
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) TCONT (%d) CLEAN_EVENT\n", __FILE_DESC__, __LINE__, tcont);
onuGponTcontFlushState[tcont] = TCONT_FLUSH_BLOCKING_STATE;
tpm_deactive_tcont(tcont);
onuGponTcontFlushState[tcont] = TCONT_FLUSH_READY_STATE;
}
else
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) Received TCONT_CLEAN_EVENT while in T-CONT(%d) state(%s)\n",
__FILE_DESC__, __LINE__, tcont, stateText[onuGponTcontFlushState[tcont]]);
}
}
}
/* Handle T-Cont Activate */
/* ====================== */
else if (currentWork->action == TCONT_ACTIVE_EVENT)
{
if (onuGponTcontFlushState[tcont] == TCONT_FLUSH_READY_STATE)
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) TCONT (%d) ACTIVE_EVENT\n", __FILE_DESC__, __LINE__, tcont);
onuGponTcontFlushState[tcont] = TCONT_FLUSH_RUNNING_STATE;
tpm_active_tcont(tcont);
}
else
{
mvPonPrint(PON_PRINT_DEBUG, PON_ALLOC_MODULE,
"DEBUG: (%s:%d) Received TCONT_ACTIVE_EVENT while in T-CONT state(%s)\n",
__FILE_DESC__, __LINE__, stateText[onuGponTcontFlushState[tcont]]);
}
}
return;
}