/******************************************************************************* | |
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(µSec); | |
mvOnuGponMacTxPloamDataFreeGet(&advancer); | |
mvOnuGponMacMicroSecCounterGet(µSec_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; | |
} |