/*
 *  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.
 *
 *
 */


/*******************************************************************
 *
 *    NAME: types.h     
 * 
 *    DESCRIPTION: Defines types
 *
 *******************************************************************/

#ifndef _TYPES_H_
#define _TYPES_H_

#include "config.h"

// Make sure ENDIAN variable is defined properly
#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG)
#error Must define either ENDIAN_LITTLE or ENDIAN_BIG
#endif

typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
// NOTE: The PFE GNU toolchain aligns doubleword variables on 4-byte boundaries.
//	To keep shared data structures compatible with the 8-byte alignment of
//	the ARM toolchain, we force U64/V64 to be 8-byte aligned.
typedef unsigned long long U64 __attribute__((aligned(8)));

typedef volatile unsigned char V8;
typedef volatile unsigned short V16;
typedef volatile unsigned int V32;
typedef volatile unsigned long long V64 __attribute__((aligned(8)));

typedef unsigned char BOOL;

typedef void VOID; 
typedef void *PVOID; 

typedef signed char  S8;
typedef signed short S16;
typedef signed int   S32;

typedef void (*INTVECHANDLER)(void);
typedef	void (*EVENTHANDLER)(void);
typedef int (*GETFILLHANDLER)(void);

typedef struct tSTIME {
	U32 msec;
	U32 cycles;
} STIME;

/** Structure common to all interface types */
struct itf {
	struct itf *phys;	/**< pointer to lower lever interface */
	U8 type;		/**< interface type */
	U8 index;		/**< unique interface index */
};

struct physical_port_util {
	U8 flags;
};

struct physical_port {
	struct itf itf;
	U8 mac_addr[6];
	U8 id;
	U8 flags;

#ifdef CFG_STATS
	/*stats*/
	U64 rx_bytes __attribute__((aligned(8)));
	U32 rx_pkts;
#endif
};

/*physical_port flags bit fields */
#define TX_ENABLED		(1 << 0)
#define L2_BRIDGE_ENABLED	(1 << 1)
#define QOS_ENABLED		(1 << 2)

typedef struct tDataQueue {
	void* head;
	void* tail;
} DataQueue, *PDataQueue;

struct tMetadata;

#if defined(COMCERTO_100) || defined(COMCERTO_1000)
typedef int channel_t;
#elif defined(COMCERTO_2000)
typedef void (*channel_t)(struct tMetadata *);
#endif

#define INLINE	__inline

#define TRUE	1
#define FALSE	0

#if !defined(COMCERTO_2000_CONTROL)
#define NULL	(PVOID)0		/* match rtxc def */
#endif

#define HANDLE	PVOID

#define K 			1024
#define M			(K*K)

#define __TOSTR(v)	#v
#define TOSTR(v)	__TOSTR(v)

// enum used to idenity mtd source 
enum FPP_L3_PROTO {
    PROTO_IPV4 = 0,
    PROTO_IPV6,
    PROTO_PPPOE,
    PROTO_MC4,    
    PROTO_MC6,
    MAX_L3_PROTO	
};
#define PROTO_NONE 0xFF

enum FPP_L4_PROTO {
	PROTO_L4_TCP=0,
	PROTO_L4_UDP,
	PROTO_L4_UNKNOWN,
	MAX_L4_PROTO
};



enum FPP_ITF {
	ITF_ETH0 = 0,
	ITF_ETH2
};


#endif /* _TYPES_H_ */
