/*
 * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

#if !defined( __I_VOS_TYPES_H )
#define __I_VOS_TYPES_H
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/completion.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/version.h>
#include <asm/div64.h>

/**=========================================================================

  \file  i_vos_Types.h

  \brief virtual Operating System Servies (vOSS) Types

   Linux specific basic type definitions

  ========================================================================*/

/* $Header$ */

/*--------------------------------------------------------------------------
  Include Files
  ------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------
  Preprocessor definitions and constants
  ------------------------------------------------------------------------*/
/*
 * 1. GNU C/C++ Compiler
 *
 * How to detect gcc : __GNUC__
 * How to detect gcc version :
 *   major version : __GNUC__ (2 = 2.x, 3 = 3.x, 4 = 4.x)
 *   minor version : __GNUC_MINOR__
 *
 * 2. Microsoft C/C++ Compiler
 *
 * How to detect msc : _MSC_VER
 * How to detect msc version :
 *   _MSC_VER (1200 = MSVC 6.0, 1300 = MSVC 7.0, ...)
 *
 */

// MACROs to help with compiler and OS specifics.
// \note: may need to get a little more sophisticated than this and define
// these to specific 'VERSIONS' of the compiler and OS.  Until we have a
// need for that, lets go with this.
#if defined( _MSC_VER )

#define VOS_COMPILER_MSC
#define VOS_OS_WINMOBILE    // assuming that if we build with MSC, OS is WinMobile

#elif defined( __GNUC__ )

#define VOS_COMPILER_GNUC
#define VOS_OS_LINUX       // assuming if building with GNUC, OS is Linux

#endif


// VOS definitions (compiler specific) for Packing structures.  Note that the
// Windows compiler defines a way to pack a 'range' of code in a file.  To
// accomodate this, we have to include a file that has the packing #pragmas
// These files are called
// vos_pack_range_n_start.h where "n" is the packing aligment.  For example,
// vos_pack_range_2_start.h is included in the file where you want to
// start packing on a 2 byte alignment.  vos_pack_range_end.h is included
// in the file where you want to stop the packing.
//
// Other compilers allow packing individual strucutres so we have a series
// of macros that are added to the structure to define the packing attributes.
// For example, VOS_PACK_STRUCT_2 will add the attributes to pack an
// individual structure on a 2 byte boundary.
//
// So what does a coder have to do to properly pack a structure for all the
// supported compilers?  You have to add two includes around *all* the
// structures you want packed the same way and you also have to add the
// VOS_PACK_STRUCT_n macros to the individual structures.
//
// For example to properly pack myStruct on a 2 byte boundary for all
// voss supported compilers, the following needs coded...
//
//
// #include <vos_pack_range_2_start.h>
//
// typedef struct
// {
//   unsigned char c;
//   long int i;
// } myStruct VOS_PACK_STRUCT_2;
//
//
// note... you can include other structure definitions in here that have the
// same 2 byte packing
//
// #include <vos_pack_range_end.h>


// /todo: not sure what the flag is to identify the Microsoft compiler for WinMobile
// Let's leave this out for now and just include the defintions for WinMobile.  Need
// to address this when we move to support other operating systems.  Probably best to
// define some of our own 'types' or preprocessor flags like VOS_COMPILER_TYPE,
// VOS_OS_TYPE, etc. and then all our code can base on those flags/types independent
// of the operating system, compiler, etc.
#if defined( VOS_COMPILER_MSC )


#define VOS_INLINE_FN  __inline

// does nothing on Windows.  packing individual structs is not
// supported on the Windows compiler.
#define VOS_PACK_STRUCT_1
#define VOS_PACK_STRUCT_2
#define VOS_PACK_STRUCT_4
#define VOS_PACK_STRUCT_8
#define VOS_PACK_STRUCT_16

#elif defined( VOS_COMPILER_GNUC )

#define VOS_INLINE_FN  static inline

#else
#error "Compiling with an unknown compiler!!"
#endif



/*--------------------------------------------------------------------------
  Type declarations
  ------------------------------------------------------------------------*/

/// unsigned 8-bit types
typedef u8 v_U8_t;
typedef u8 v_UCHAR_t;
typedef u8 v_BYTE_t;

/// unsigned 16-bit types
typedef u16 v_U16_t;
typedef unsigned short v_USHORT_t;

/// unsigned 32-bit types
typedef u32 v_U32_t;
// typedef atomic_t v_U32AT_t;
typedef unsigned long  v_ULONG_t;

/// unsigned 64-bit types
typedef u64 v_U64_t;

/// unsigned integer types
typedef unsigned int  v_UINT_t;

/// signed 8-bit types
typedef s8  v_S7_t;
typedef signed char  v_SCHAR_t;

/// signed 16-bit types
typedef s16 v_S15_t;
typedef signed short v_SSHORT_t;

/// signed 32-bit types
typedef s32 v_S31_t;
typedef signed long v_SLONG_t;

/// signed integer types
typedef signed int   v_SINT_t;

/// Boolean types
typedef unsigned char v_BOOL_t;

/// void type
#define v_VOID_t void

#endif // __I_VOSS_TYPES_H
