#include <Copyright.h>

/*
 * FILENAME:    $Workfile: mv_types.h $
 * REVISION:    $Revision: 3 $
 * LAST UPDATE: $Modtime: 12/24/02 5:37p $
 *
 * DESCRIPTION:
 *     This file defines common data types used on Host and NetGX sides.
 */


#ifndef MV_TYPES_H
#define MV_TYPES_H


/* general */

#undef IN
#define IN
#undef OUT
#define OUT
#undef INOUT
#define INOUT


#ifndef NULL
#define NULL ((void*)0)
#endif

typedef void  GT_VOID;
typedef char  GT_8;
typedef short GT_16;
typedef long  GT_32;

typedef unsigned char  GT_U8;
typedef unsigned short GT_U16;
typedef unsigned long  GT_U32;
typedef unsigned int   GT_UINT;

typedef union {
    GT_U8    c[8];
    GT_U16    s[4];
    GT_U32    l[2];
} GT_U64;


typedef enum {
    GT_FALSE = 0,
    GT_TRUE  = 1
} GT_BOOL;

typedef void          (*GT_VOIDFUNCPTR) (void); /* ptr to function returning void */
typedef unsigned int  (*GT_INTFUNCPTR)  (void); /* ptr to function returning int  */


/* module state */
typedef enum {
    GT_STATE_NONE = 0,    /* Uninitialized */
    GT_STATE_IDLE,        /* Initialized, but not started (or stopped) */
    GT_STATE_ACTIVE        /* Started */
} GT_STATE;


#define    GT_ETHERNET_HEADER_SIZE        (6)

typedef struct
{
    GT_U8       arEther[GT_ETHERNET_HEADER_SIZE];
}GT_ETHERADDR;

/* This macro checks for a multicast mac address    */
#define GT_IS_MULTICAST_MAC(mac)  ((mac.arEther[0] & 0x1) == 1)


/* This macro checks for an broadcast mac address     */
#define GT_IS_BROADCAST_MAC(mac) (((mac).arEther[0] == 0xFF) && ((mac).arEther[1] == 0xFF) && ((mac).arEther[2] == 0xFF) && ((mac).arEther[3] == 0xFF) && ((mac).arEther[4] == 0xFF) && ((mac).arEther[5] == 0xFF))


/* status / error codes */
typedef int GT_STATUS;

#define GT_ERROR           (-1)
#define GT_OK               (0x00)    /* Operation succeeded                   */
#define GT_FAIL               (0x01)    /* Operation failed                      */
#define GT_BAD_VALUE       (0x02)   /* Illegal value (general)               */
#define GT_BAD_PARAM       (0x04)   /* Illegal parameter in function called  */
#define GT_NOT_FOUND       (0x0B)   /* Item not found                        */
#define GT_NO_MORE         (0x0C)   /* No more items found                   */
#define GT_NO_SUCH         (0x0D)   /* No such item                          */
#define GT_TIMEOUT         (0x0E)   /* Time Out                              */
#define GT_NOT_SUPPORTED   (0x10)   /* This request is not support           */
#define GT_ALREADY_EXIST   (0x1B)   /* Tried to create existing item         */
#define GT_BAD_CPU_PORT    (0x20)   /* Input CPU Port is not valid physical port number */

extern GT_U8 qdLong2Char(GT_U32 data);
extern GT_U8 qdShort2Char(GT_U16 data);
extern GT_U16 qdLong2Short(GT_U32 data);

#endif /* MV_TYPES_H */
