/*******************************************************************************
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.h                                              **
**                                                                           **
**  DESCRIPTION : This file contains ONU GPON Services routines              **
*******************************************************************************
*                                                                             *                              
*  MODIFICATION HISTORY:                                                      *
*                                                                             *
*   29Oct06  Oren Ben Hayun   created                                         *  
* =========================================================================== *      
******************************************************************************/
#ifndef _ONU_GPON_SRVC_H
#define _ONU_GPON_SRVC_H

/* Include Files
------------------------------------------------------------------------------*/
 
/* Definitions
------------------------------------------------------------------------------*/
#define ONU_GPON_LOG_INTERRUPT			(1)
#define ONU_GPON_LOG_INTERRUPT_XVR_SD		(2)
#define ONU_GPON_LOG_INTERRUPT_LOF		(3)
#define ONU_GPON_LOG_INTERRUPT_SERDES_START	(4)
#define ONU_GPON_LOG_INTERRUPT_SERDES_STOP	(5)
#define ONU_GPON_LOG_STATE			(6)
#define ONU_GPON_LOG_MSG			(7)
#define ONU_GPON_LOG_MSG_CONTENT		(8)

#define ONU_GPON_LOG_SIZE                       (512)

#define TCONT_CLEAN_EVENT                       (0)
#define TCONT_CLEAN_ALL_EVENT                   (1)
#define TCONT_ACTIVE_EVENT                      (2)

#define TCONT_FLUSH_READY_STATE                 (1)
#define TCONT_FLUSH_RUNNING_STATE               (2)
#define TCONT_FLUSH_BLOCKING_STATE              (3)

/* Enums
------------------------------------------------------------------------------*/

/* Typedefs
------------------------------------------------------------------------------*/
typedef struct
{
  MV_U32 bitMask;
  MV_U32 blockSize;
}S_DbrBlockSize;

typedef struct
{
  MV_U16  event;
  MV_U16  state;
  MV_U32  time;
  MV_U32  dataVal1;
  MV_U32  dataVal2;
  MV_U32  dataVal3;
}S_OnuGponLogEntry;

/* Global variables
------------------------------------------------------------------------------*/
extern S_onuPonWork      gponTcontCleanWork[8];
extern S_onuPonWork      gponTcontCleanAllWork;
extern S_onuPonWork      gponTcontActiveWork[8];
extern S_onuPonWorkQueue gponTcontFlushWq;

/* Global functions
------------------------------------------------------------------------------*/
MV_STATUS     onuGponSrvcInit(void);
MV_STATUS     onuGponSrvcSerialNumberSet(MV_U8 *serialNumber);
MV_STATUS     onuGponSrvcConstPloamFromDbInit(MV_BOOL initTime);
MV_STATUS     onuGponSrvcOnuIdUpdate(MV_U32 onuId, MV_BOOL valid);
void          onuGponSrvcAlarmNotify(MV_U32 alarm, MV_U32 status);
void          onuGponSrvcStatusNotify(MV_U32 status);
void          onuGponSrvcOmccNotify(MV_U32 omccPortId);
void          onuGponSrvcDisableMsgNotify(MV_BOOL disable);
unsigned long onuGponSrvcUpdateCrc(unsigned long crc_accum, char *data_blk_ptr, int data_blk_size);
unsigned int  onuGponSrvcCalcCrc(unsigned char msg[], int size);
void          onuGponSrvcAesKeyGenerate(MV_U8 *key);
MV_STATUS     onuGponSrvcDbrBlockSizeSet(MV_U32 blockSize, MV_U32 *actualBlockSize);
MV_STATUS     onuGponSrvcRangingRandomInit(void);

void 	      onuGponSyncLog(MV_U32 event, MV_U32 data1, MV_U32 data2, MV_U32 data3);
void 	      onuGponSyncLogEnable(MV_U32 enable);
void 	      onuGponSyncLogPrint(void);

extern void onuGponWqTcontFunc(struct work_struct *work);
extern MV_STATUS onuGponWqTcontFlush(MV_U32 tcont);
extern MV_STATUS onuGponWqTcontActivate(MV_U32 tcont);

/* Macros
------------------------------------------------------------------------------*/    

#endif /* _ONU_GPON_APM_H */

  


