/*
 *  Copyright (c) 2009 Mindspeed Technologies, Inc.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.

 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.

 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 *
 */


#ifndef _MODULE_IPSEC_C2000_H_
#define _MODULE_IPSEC_C2000_H_

#include "types.h"
#include "channels.h"
#include "modules.h"
#include "fpart.h"
#include "fe.h"
#include "common_hdrs.h"
#include "pfe/cbus/class_csr.h"



#define NUM_LMEM_SA		64
#define HW_SA_VALID		(1 << 0)
#define HW_SA_USED		(1 << 1)
#define HW_SA_UPDATING		(1 << 2)
#define SA_CACHE_COUNTER	128


#define ESPAH_USE_PRNG 1
#define ELP_HW_BYTECNT          1       // uses elliptic hardware bytecount
//#define ESPAH_USE_TRNG 1
// TRNG would require semaphore as spacc (linux) uses it as well
#if defined(ESPAH_USE_TRNG) && defined(ESPAH_USE_PRNG)
#       error "only one of ESPAH_USE_TRNG or ESPAH_USE_PRNG may be defined"
#endif
#if     !defined(ESPAH_USE_TRNG) && !defined(ESPAH_USE_PRNG)
#       error "one of ESPAH_USE_TRNG or ESPAH_USE_PRNG needs to be defined"
#endif

typedef struct _tSA_lft_cur {
#if     !defined(ELP_HW_BYTECNT)||(ELP_HW_BYTECNT == 0)
        U64     bytes;
#else
        /* Elliptic hardware does byte accounting. */
#endif
        U64     packets;
}SA_lft_cur, *PSA_lft_cur;


typedef struct _tSAID {	
	union
	{
	       /*Unused	U32		a4; */
		U32 			a6[4];
		U32			top[4]; // alias
	} daddr;		
	U32		saddr[4];	// added for NAT-T transport mode
	U32		spi;
	U8		proto;
	U8		unused[3];
} SAID, *PSAID;	


#define SA_STATE_INIT		0x1
#define SA_STATE_VALID		0x2
#define SA_STATE_DEAD		0x3
#define SA_STATE_EXPIRED	0x4
#define SA_STATE_DYING		0x5


/*
 * _TSAEntry.flags values
 */
#define SA_NOECN	1
#define SA_DECAP_DSCP	2
#define SA_NOPMTUDISC	4
#define SA_WILDRECV	8
/* Local mirror of the sa flags.  */
#define	SA_ENABLED 	0x10		
#define SA_ALLOW_SEQ_ROLL 0x20


/* Hardware structure for elliptic security association */
typedef struct _tElliptic_SA {
	U32		 	seq; 		//+4
	U32		 	ext_seq;	// +0
	U64			anti_replay_mask;	//+8
	U32			auth_key1;		//+0x14
	U32			auth_key0;		//+0x10
	U32			auth_key3;		//+0x1c
	U32			auth_key2;		//+0x18
	U32			cipher0;	//+0x24
	U32			auth_key4;		//+0x20
	U32			cipher2;	//+0x2c
	U32			cipher1;	//+0x28	
	U32			cipher4;	//+0x34
	U32			cipher3;	//+0x30
	U32			cipher6;	//+0x3C
	U32			cipher5;	//+0x38
	union{
		U32			CTR_Nonce;	//+0x44
		U32			iv0;
	};
	U32			cipher7;	//+0x40
	union {					//+0x4C
	    U32			ext_auth_key1;
	    U32			iv2;
	};
	union {					//+0x48
	    U32			ext_auth_key0;
	    U32			iv1;
	};
	U32			spi;		//+0x54
	union {					//+0x50
	    U32			ext_auth_key2;
	    U32			iv3;
	};
	U8			pad1a[16];
	U32			hard_ttl_hi;	//+0x6c
	U8			pad1b[4];	//+0x68
	U32			soft_ttl_hi;	//+0x74
	U32			hard_ttl_lo;	//+0x70
	U16			flags;		//+0x7c
	U8			res3;
	U8			algo;
	U32			soft_ttl_lo;	//+0x78
} Elliptic_SA, *PElliptic_SA;


#ifdef CFG_STATS
typedef struct _tSAStatEntry {
       U32 total_pkts_processed;
       U32 last_pkts_processed;
       U64 total_bytes_processed;
       U64 last_bytes_processed;
}SAStatEntry , *PSAStatEntry;
#endif


#if defined(COMCERTO_2000_CONTROL)
typedef struct _tSAEntry {
	struct slist_entry      list_spi;
	struct slist_entry      list_h;
	U16			hash_by_h;
        U16			hash_by_spi;
        struct _tSAID           id;             // SA 3-tuple
        struct _tElliptic_SA *elp_sa;           // pointer to elliptic SA descriptor
	U32			elp_sa_dma_addr;
        U8                      family;         // v4/v6
        U8                      header_len;     // ipv4/ipv6 tunnel header
        U8                      mode;           // Tunnel / transport mode
        U8                      flags;          // ECN, TOS ...
        struct _tSA_lft_cur lft_cur;
        struct _tSA_lft_conf lft_conf;
        U8                      direction;      // inbound / outbound
	U8			state:7;          // valid / expired / dead / dying
	U8			notify:1;
        U8                      blocksz;
        U8                      icvzs;
        U16                     handle;
        U16                     mtu;            // used for Transport mode
        union                           // keep union 32 bits aligned !!!
        {
                ipv4_hdr_t      ip4;
                ipv6_hdr_t      ip6;
        } tunnel;
        U16                             dev_mtu;
        /*NAT-T modifications*/
        struct
        {
                unsigned short sport;
                unsigned short dport;
                void*          socket;
        }natt;
	struct _t_hw_sa_entry 	*hw_sa;    /*pointer to the software socket entry */


} SAEntry, *PSAEntry;

typedef struct _t_hw_sa_entry
{
	/* only class requires this */
        union
        {
                ipv4_hdr_t      ip4;
                ipv6_hdr_t      ip6;
        } tunnel;

        struct _tSAID           id;

	/* util and class */
	u32	hw_sa_flags;
	u32	dma_addr;
	u32 	next_h;
	u32	next_spi;

	u16	handle;
	u16	dev_mtu;
	u16	mtu;
	u16	unused1;

        u8	family;       // v4/v6
        u8	header_len;   // ipv4/ipv6 tunnel header
        u8	mode;         // Tunnel / transport mode
        u8	flags;        // ECN, TOS ...
        u8	state;       // valid / expired / dead / dying
	u8	unused[3];

	/* only utilpe */

        struct _tSA_lft_cur     lft_cur;

        struct _tElliptic_SA    *elp_sa;  // pointer to elliptic SA descriptor
	u32	unused3;

        struct
        {
                unsigned short sport;
                unsigned short dport;
                void*          socket;
        }natt;

        struct _tSA_lft_conf    lft_conf;

#ifdef CFG_STATS
	struct _tSAStatEntry stats;
#endif
	/* HOST only */

	struct dlist_head       list_h;
        struct dlist_head       list_spi;
	struct _tSAEntry 	*sw_sa;    /*pointer to the software socket entry */
	struct _tElliptic_SA 	*elp_virt_sa; /* pointer to the elliptic sa entry */ 
	struct _t_hw_sa_entry    *lmem_next;
        unsigned long           removal_time;

}hw_sa_entry;

#elif defined(COMCERTO_2000_CLASS)

typedef struct _tSAEntry {
        /* only class requires this */
        union
        {
                ipv4_hdr_t      ip4;
                ipv6_hdr_t      ip6;
        } tunnel;

        struct _tSAID           id;
        /* util and class */
        u32     hw_sa_flags;
        u32     dma_addr;
        u32     next_h;
        u32     next_spi;

        u16     handle;
        u16     dev_mtu;
        u16     mtu;
        u16     unused1;

        u8      family;       // v4/v6
        u8      header_len;   // ipv4/ipv6 tunnel header
        u8      mode;         // Tunnel / transport mode
        u8      flags;        // ECN, TOS ...
        u8      state;       // valid / expired / dead / dying
        u8      unused[3];
}SAEntry , *PSAEntry;


#else
/* utilpe structures */
typedef struct _tSAEntry {
	/* util and class */
        u32     hw_sa_flags;
        u32     dma_addr;
        u32     next_h;
        u32     next_spi;

        u16     handle;
        u16     dev_mtu;
        u16     mtu;
        u16     unused1;

        u8      family;       // v4/v6
        u8      header_len;   // ipv4/ipv6 tunnel header
        u8      mode;         // Tunnel / transport mode
        u8      flags;        // ECN, TOS ...
        u8      state;       // valid / expired / dead / dying
        u8      unused[3];

	struct _tSA_lft_cur     lft_cur;

        struct _tElliptic_SA    *elp_sa;  // pointer to elliptic SA descriptor
        u32     unused2;

        struct
        {
                unsigned short sport;
                unsigned short dport;
                void*          socket;
        }natt;

        struct _tSA_lft_conf    lft_conf;

#ifdef CFG_STATS
	struct _tSAStatEntry stats;
#endif

}SAEntry , *PSAEntry;

typedef struct _tSACacheEntry {
	SAEntry sa;
	u32 cache_cnt;
}SACacheEntry , *PSACacheEntry;

#endif


#if defined(COMCERTO_2000_UTIL)
#define UTIL_LMEM_SA_START_OFFSET 	96
#define UTIL_LMEM_UPDATE_STATE_LEN	16
#endif
#if defined (COMCERTO_2000_UTIL) || defined (COMCERTO_2000_CLASS)
#define UTIL_PE_OFFSET		80
#define CLASS_PE_OFFSET		0
#endif



/*
 * Hardware dependencies for Elliptic engine
 *
*/
#define ELP_SA_ALIGN 128
#define ELP_SA_ALIGN_LOG 7
#if	(ELP_SA_ALIGN != (1<< ELP_SA_ALIGN_LOG))
#	error "fix  ELP_SA_ALIGN or ELP_SA_ALIGN_LOG"
#endif

/*
 * Codes
*/
#define ELP_HMAC_NULL	0
#define ELP_HMAC_MD5	1
#define ELP_HMAC_SHA1	2
#define ELP_HMAC_SHA2	3
#define ELP_GCM64	4
#define ELP_GCM96	5
#define ELP_GCM128	6

#define ELP_CIPHER_NULL 0
#define ELP_CIPHER_DES	 1
#define ELP_CIPHER_3DES 2
#define ELP_CIPHER_AES128 3
#define ELP_CIPHER_AES192 4
#define ELP_CIPHER_AES256 5
#define ELP_CIPHER_AES128_GCM 6
#define ELP_CIPHER_AES192_GCM 7
#define ELP_CIPHER_AES256_GCM 8
#define ELP_CIPHER_AES128_CTR 9
#define ELP_CIPHER_AES192_CTR 10
#define ELP_CIPHER_AES256_CTR 11



// Elliptic ESP AH Offload Engine registers
#define ESPAH_BASE	0x00000
#define ESPAH_IRQ_EN                             (0x00)
#define		ESPAH_IRQ_OUTBND_CMD_EN		0x1
#define		ESPAH_IRQ_OUTBND_STAT_EN		0x2
#define		ESPAH_IRQ_INBND_CMD_EN		0x4
#define		ESPAH_IRQ_INBND_STAT_EN		0x8
#define		ESPAH_IRQ_ALL_EN		(ESPAH_IRQ_OUTBND_CMD_EN|ESPAH_IRQ_OUTBND_STAT_EN|ESPAH_IRQ_INBND_CMD_EN|ESPAH_IRQ_INBND_STAT_EN)
#define		ESPAH_IRQ_GLBL_EN		(1UL<<31)
#define ESPAH_IRQ_STAT                           (0x04)
#define		ESPAH_STAT_OUTBND_CMD		0x1
#define		ESPAH_STAT_OUTBND_STAT		0x2
#define		ESPAH_STAT_INBND_CMD		0x4
#define		ESPAH_STAT_INBND_STAT		0x8

#define ESPAH_DMA_BURST_SZ                       (0x08)
#define ESPAH_IV_RND                             (0x10)
#define ESPAH_OUT_SRC_PTR                        (0x20)
#define ESPAH_OUT_DST_PTR                        (0x24)
#define ESPAH_OUT_OFFSET                         (0x28)
#define ESPAH_OUT_ID                             (0x2C)
#define ESPAH_OUT_SAI                            (0x30)
#define ESPAH_OUT_POP                            (0x38)
#define ESPAH_OUT_STAT                           (0x3C)
#define ESPAH_IN_SRC_PTR                         (0x40)
#define ESPAH_IN_DST_PTR                         (0x44)
#define ESPAH_IN_OFFSET                          (0x48)
#define ESPAH_IN_ID                              (0x4C)
#define ESPAH_IN_SAI                             (0x50)
#define ESPAH_IN_POP                             (0x58)
#define ESPAH_IN_STAT                            (0x5C)

typedef struct _t_clp30_espah_regs {
  V32 espah_irq_en;	// 0x00
  V32 espah_irq_stat;	// 0x04
  V32 espah_dma_burst_sz;      //  0x0008  maximum in words (8-256)
  U32 _rsv0;
  V32 espah_iv_rnd;            //  0x0010  value to be added to the core's IV
  U32 _rsv1;
  V32 espah_endian_ctrl;       //  0x0018
  U32 _rsv2;
  V32 espah_out_src_ptr;       //  0x0020
  V32 espah_out_dst_ptr;       //  0x0024
  V32 espah_out_offset;        //  0x0028  DDT offset to start of packet
  V32 espah_out_id;            //  0x002c  software tag
  V32 espah_out_sai;           //  0x0030
  U32 _rsvd3;
  V32 espah_out_pop;           //  0x0038
  V32 espah_out_stat;          //  0x003C
  V32 espah_in_src_ptr;        //  0x0040
  V32 espah_in_dst_ptr;        //  0x0044
  V32 espah_in_offset;         //  0x0048  DDT offset to start of packet
  V32 espah_in_id;             //  0x004C  software tag
  V32 espah_in_sai;            //  0x0050
  U32 _rsvd4;
  V32 espah_in_pop;            //  0x0058
  V32 espah_in_stat;           //  0x005C
  U32 _rsvd5[8];
  V32 espah_sa_cache_flush;    //  0x0080
  V32 espah_sa_cache_ready;    //  0x0084
} clp30_espah_regs;

#define BITMASK(pos,width)	(((1UL<<(width))-1) << (pos))
// IN_STAT and OUT_STAT
#define ESPAH_STAT_LEN            0
#define ESPAH_STAT_LEN_BITS      16
#define ESPAH_STAT_LEN_MASK      BITMASK(ESPAH_STAT_LEN, ESPAH_STAT_LEN_BITS)

#define ESPAH_STAT_ID            16
#define ESPAH_STAT_ID_BITS        8
#define ESPAH_STAT_ID_MASK       BITMASK(ESPAH_STAT_ID, ESPAH_STAT_ID_BITS)

#define ESPAH_STAT_RET           24
#define ESPAH_STAT_RET_BITS       4
#define ESPAH_STAT_RET_MASK      BITMASK(ESPAH_STAT_RET, ESPAH_STAT_RET_BITS)

#define ESPAH_STAT_FIFO_FULL      30
#define ESPAH_STAT_FIFO_FULL_MASK      (1UL<<30)
#define ESPAH_STAT_FIFO_EMPTY     31
#define ESPAH_STAT_FIFO_EMPTY_MASK     (1UL<<31)
/* IN_OFFSET and OUT_OFFSET */
#define ESPAH_OFFSET_SRC          0
#define ESPAH_OFFSET_DST          16


typedef struct _tESPAH_XFORM {
  V32 src_ptr;
  V32 dst_ptr;
  V32 offset;
  V32 id;
  V32 sai;
  V32 pop;
  V32 stat;
} ESPAH_XFORM, *PESPAH_XFORM;

/* Elliptic SA Cache mgmt */
#if defined(COMCERTO_2000_CONTROL)
#	define	SA_CACHE_FLUSH		 *((volatile u32*)((u32)pfe->ipsec_baseaddr+ ESPAH_BASE + 0x80))
#	define	SA_CACHE_FLUSH_RDY	 *((volatile u32*)((u32)pfe->ipsec_baseaddr+ ESPAH_BASE + 0x84))
#else
#	define	SA_CACHE_FLUSH		*((volatile U32 *)  0x9a000080)
#	define	SA_CACHE_FLUSH_RDY	*((volatile U32 *)  0x9a000084)
#endif
/* Elliptic TRNG
Note that it is part of SPAcc and likely be protected by spin-lock to share with linux */
#	define	TRNG_CNTL	*((volatile U32 *)  0x0E010000)
#	define	TRNG_IRQ_EN	*((volatile U32 *)  0x0E010004)
#	define	TRNG_IRQ_STAT	*((volatile U32 *)  0x0E010008)
#	define	TRNG_DATA0	*((volatile U32 *)  0x0E010010)
#	define	TRNG_DATA1	*((volatile U32 *)  0x0E010014)
#	define	TRNG_DATA2	*((volatile U32 *)  0x0E010018)
#	define	TRNG_DATA3	*((volatile U32 *)  0x0E01001C)



/* SA flags (oxffest 0x7e) bits  */
#define ESPAH_ENABLED			0x0001
#define ESPAH_SEQ_ROLL_ALLOWED		0x0002
#define ESPAH_TTL_ENABLE		0x0004	
#define ESPAH_TTL_TYPE			0x0008 /* 0:byte 1:time */
#define ESPAH_AH_MODE			0x0010 /* 0:ESP 1:AH */
#define ESPAH_ANTI_REPLAY_ENABLE 	0x0080
#define ESPAH_COFF_EN			0x0400 /* 1:Crypto offload enable */
#define ESPAH_COFF_MODE			0x0800 /* Crypto offload mode: 0: ECB cypher or raw hash, 1 CBC cypher or HMAC hash */
#define ESPAH_IPV6_ENABLE 		0x1000 /* 1:IPv6 SA */ 
#define ESPAH_DST_OP_MODE 		0x2000 /* IPv6 dest opt treatment EDN-0277 page 16 */ 
#define ESPAH_EXTENDED_SEQNUM   	0x4000


/* STAT codes that go into the STAT_RET_CODE  of a register */
#define ESPAH_STAT_OK          	0
#define ESPAH_STAT_BUSY       	1
#define ESPAH_STAT_SOFT_TTL    	2
#define ESPAH_STAT_HARD_TTL    	3
#define ESPAH_STAT_SA_INACTIVE 	4
#define ESPAH_STAT_REPLAY      	5
#define ESPAH_STAT_ICV_FAIL    	6
#define ESPAH_STAT_SEQ_ROLL    	7
#define ESPAH_STAT_MEM_ERROR   	8
#define ESPAH_STAT_VERS_ERROR  	9
#define ESPAH_STAT_PROT_ERROR  	10
#define ESPAH_STAT_PYLD_ERROR  	11
#define ESPAH_STAT_PAD_ERROR   	12
#define ESPAH_DUMMY_PKT   	13


/*
** Implementation limits
*/

// HW fifo size
#define ESPAH_MAX_FIFO 			32
// DDT allocation size
#define ELP_WQ_RING_SIZE		ESPAH_MAX_FIFO
// Need that much extra space in the egress ddt
#define 	ELP_MAX_ESPAH_OVERHEAD	128	// At least ESP + IV + max pad + 2 + 12

/* ELP_MAX_DDT_PER_PKT is a max number of DDTs, which may be required
** Worst case consumption is worse on FPP then on linux because data buffers may spawn 64K boundary.
** worst packet-to-ddt-mapping is ipv6 packet which crosses 64k boundary:
**  - sop-to-64K boundary
**  - 64k boundary -to -eop
**  - null terminator
*/
#define ELP_MAX_DDT_PER_PKT 3

#define ELP_DDT_ENTRY_SIZE sizeof(struct elp_ddtdesc)
#define ELP_DDT_NUMBER 	(ELP_WQ_RING_SIZE * ELP_MAX_DDT_PER_PKT)
#define ELP_SA_ARAM_OFFSET (4*ELP_DDT_NUMBER*ELP_DDT_ENTRY_SIZE) // 4 fifos (src,dst) x (in,out)
/*
 * Soft formats and layouts
 */

/*
** elp_wqentry describes the packet queued to elliptic engine.
** it is functional equivalent of src_ddtring plus dst_ddtring plus pe_entry on the linux side
** All the sizes below are an important consideration because rings map onto dedicated aram
*/
struct elp_wqentry {
	struct elp_ddtdesc src_ddt[ELP_MAX_DDT_PER_PKT];	// 24 bytes
	struct elp_ddtdesc dst_ddt[ELP_MAX_DDT_PER_PKT];	// 24 bytes
};

// Structure above is 48 bytes to avoid division we use macros to convert between addresses and priv_wq_idx
// macros will work as long as structure size is multiple of 32.
#define wqe_addr2pi(base,this_addr) ((((U32) this_addr) - ((U32) base))/16)
#define wqe_pi2addr(base,index) (void*) ((((U32) index) * 16) + ((U32) base))
//
//#if ((sizeof(struct elp_wqentry)) / 32) !=3 )
//#	error " redefine wqe_addr2pi and wqe_pi2addr macros above"
//#endif

/*
** ELP Engine descriptor
*/
struct elp_packet_engine{
        U32     wq_avail;
        struct elp_wqentry                      *pe_wq_ring;            /* work ring */
        struct elp_wqentry                      *pe_wq_ringlast;        /* last entry in work ring */
        struct elp_wqentry                      *pe_wq_free;            /* next wq entry  to use */
 };


typedef struct tIPSec_hw_context {
	// Elliptic driver structure
	clp30_espah_regs *ELP_REGS;
  	U32 ARAM_base;
  	int 	elp_irqm;
	int	irq_en_flags;

  	struct elp_packet_engine in_pe;
  	struct elp_packet_engine out_pe;
  	U32 ARAM_sa_base;
  	U32 ARAM_sa_base_end;
//#if	defined(IPSEC_DEBUG) && (IPSEC_DEBUG)
#if 0
  U32 flush_create_count;
  U32 flush_enable_count;
  U32 flush_disable_count;
  U32 inbound_counters[16];
  U32 outbound_counters[16];
#endif
} IPSec_hw_context;

#ifdef CFG_IPSEC_DEBUG
typedef struct tIPsec_dbg_cntrs {
	u32 dbg_outbnd_rcvd;
	u32 dbg_outbnd_xmit;
	u32 dbg_outbnd_expt;
	u32 dbg_outbnd_drops;
	u32 dbg_inbnd_rcvd;
	u32 dbg_inbnd_xmit;
	u32 dbg_inbnd_expt;
	u32 dbg_inbnd_drops;
	u32 dbg_wa_drops;
}IPSec_dbg_cntrs;
#endif


static __inline U32 elp_read( IPSec_hw_context *pctx, U32 elp_reg_offset) {
    	return  *((volatile U32 *) ((U32)pctx->ELP_REGS + elp_reg_offset));
}
static __inline U32 elp_write( IPSec_hw_context *pctx, U32 elp_reg_offset, U32 val) {
    	*((volatile U32 *) ((U32)pctx->ELP_REGS + elp_reg_offset)) = val;
    	return  val;
}

#if defined(COMCERTO_2000_CLASS)
/* SA notifications */
void M_IPS_IN_process_packet(PMetadata mtd);
void M_IPS_OUT_process_packet(PMetadata mtd);
void M_IPsec_inbound_process_from_util(PMetadata mtd, lmem_trailer_t *trailer);
int prepare_ipsec_oubound_packet(PMetadata mtd);
#endif

//#if	defined(IPSEC_DEBUG) && (IPSEC_DEBUG)
//static unsigned int M_ipsec_ttl_check_data(PSAEntry sa, U16 retcode);
//#else
//static void M_ipsec_ttl_check_data(PSAEntry sa, U16 retcode);
//#endif


static __inline void elp_cache_wait(void) {
	while (SA_CACHE_FLUSH_RDY == 0)
		;
}


static __inline void hw_sa_cache_flush(PElliptic_SA elp_sa_ptr, int sa_cache_flush)
{
#if 0
	printk(KERN_INFO "%s: cache_flush_ready ..:addr:%x - val:%x\n",__func__, ((u32)pfe->ipsec_baseaddr+ ESPAH_BASE + 0x84), SA_CACHE_FLUSH_RDY);
#endif
	if (sa_cache_flush) {
                elp_cache_wait();
                SA_CACHE_FLUSH = (U32)elp_sa_ptr; /* Any value causes flush-all. We write SA address for debug purposes */
                elp_cache_wait();
        }
}


#if defined (COMCERTO_2000_UTIL)
/* Extern declarations required */
extern struct elp_wqentry  dmem_ddt ;
extern u8 upe_dmem_pkt[];
extern void util_ipsec_init();
extern TIMER_ENTRY sa_timer;
#ifdef CFG_STATS
extern U32 gFpStatFeatureBitMask;
#endif
#endif

#if defined (COMCERTO_2000_CLASS) || defined (COMCERTO_2000_UTIL)
#ifdef CFG_IPSEC_DEBUG
extern IPSec_dbg_cntrs g_ipsec_dbg_cntrs;
#define IPSEC_DEBUG_COUNTER_INCREMENT(counter) do { (g_ipsec_dbg_cntrs.dbg_##counter) += 1; } while(0)
#endif
#endif

extern IPSec_hw_context g_ipsec_hw_ctx;
#if defined (COMCERTO_2000_CONTROL)
int hw_sa_set_digest_key(PSAEntry sa, U16 key_bits, U8* key);
int hw_sa_set_cipher_ALG_AESCTR(PSAEntry sa, U16 key_bits, U8* key , U8* algo);
int hw_sa_set_cipher_key(PSAEntry sa, U8* key);
int hw_sa_set_lifetime(CommandIPSecSetLifetime *cmd, PSAEntry sa);
PElliptic_SA allocElpSA(dma_addr_t*);
void freeElpSA(PElliptic_SA psa, dma_addr_t);
int freeAramElpSA(PElliptic_SA psa);
void disableElpSA(PElliptic_SA psa);
#endif

#endif	/* _MODULE_IPSEC_H_ */
