/*******************************************************************************
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_FREE_TEXT			(9)

#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 */

  


