/*
 * Copyright (c) 2013-2014, 2016 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( __VOS_TYPES_H )
#define __VOS_TYPES_H
/**=========================================================================
  \file  vos_Types.h

  \brief virtual Operating System Servies (vOS)

   Basic type definitions
  ========================================================================*/

/* $Header$ */

/*--------------------------------------------------------------------------
  Include Files
  ------------------------------------------------------------------------*/
#include "i_vos_types.h"
#include <string.h>

/*--------------------------------------------------------------------------
  Preprocessor definitions and constants
  ------------------------------------------------------------------------*/
// macro to get maximum of two values.
#define VOS_MAX( _x, _y ) ( ( (_x) > (_y) ) ? (_x) : (_y) )

// macro to get minimum of two values
#define VOS_MIN( _x, _y ) ( ( (_x) < (_y) ) ? (_x) : (_y)  )

// macro to get the ceiling of an integer division operation...
#define VOS_CEIL_DIV( _a, _b ) (( 0 != (_a) % (_b) ) ? ( (_a) / (_b) + 1 ) : ( (_a) / (_b) ))

// macro to return the floor of an integer division operation
#define VOS_FLOOR_DIV( _a, _b ) ( ( (_a) - ( (_a) % (_b) ) ) / (_b) )

static inline unsigned int vos_round_div(unsigned int dividend,
					 unsigned int divisor)
{
	return (dividend + (divisor / 2)) / divisor;
}

#define VOS_SWAP_U16(_x) \
   ( ( ( (_x) << 8 ) & 0xFF00 ) | ( ( (_x) >> 8 ) & 0x00FF ) )

#define VOS_SWAP_U32(_x) \
  (( ( ( (_x) << 24 ) & 0xFF000000 ) | ( ( (_x) >> 24 ) & 0x000000FF ) ) | \
   ( ( ( (_x) << 8 ) & 0x00FF0000 ) | ( ( (_x) >> 8 ) & 0x0000FF00 ) ))

// Endian operations for Big Endian and Small Endian modes
#ifdef ANI_LITTLE_BYTE_ENDIAN

#define vos_cpu_to_be32(_x) VOS_SWAP_U32(_x)
#define vos_be32_to_cpu(_x) VOS_SWAP_U32(_x)
#define vos_cpu_to_be16(_x) VOS_SWAP_U16(_x)
#define vos_be16_to_cpu(_x) VOS_SWAP_U16(_x)
#define vos_cpu_to_le32(_x) (_x)
#define vos_le32_to_cpu(_x) (_x)
#define vos_cpu_to_le16(_x) (_x)
#define vos_le16_to_cpu(_x) (_x)

#endif

#ifdef ANI_BIG_BYTE_ENDIAN

#define vos_cpu_to_be32(_x) (_x)
#define vos_be32_to_cpu(_x) (_x)
#define vos_cpu_to_be16(_x) (_x)
#define vos_be16_to_cpu(_x) (_x)
#define vos_cpu_to_le32(_x) VOS_SWAP_U32(_x)
#define vos_le32_to_cpu(_x) VOS_SWAP_U32(_x)
#define vos_cpu_to_le16(_x) VOS_SWAP_U16(_x)
#define vos_le16_to_cpu(_x) VOS_SWAP_U16(_x)

#endif

typedef unsigned long vos_time_t;
/*--------------------------------------------------------------------------
  Type declarations
  ------------------------------------------------------------------------*/

/// Module IDs.  These are generic IDs that identify the various modules
/// in the software system.
typedef enum
{
   /* 0 is unused for historical purposes */
   VOS_MODULE_ID_TL         = 1,
   VOS_MODULE_ID_WDI        = 2,
   // 3 & 4 are unused for historical purposes
   VOS_MODULE_ID_RSV3       = 3,
   VOS_MODULE_ID_RSV4       = 4,
   VOS_MODULE_ID_HDD        = 5,
   VOS_MODULE_ID_SME        = 6,
   VOS_MODULE_ID_PE         = 7,
   VOS_MODULE_ID_WDA        = 8,
   VOS_MODULE_ID_SYS        = 9,
   VOS_MODULE_ID_VOSS       = 10,
   VOS_MODULE_ID_SAP        = 11,
   VOS_MODULE_ID_HDD_SOFTAP = 12,
   VOS_MODULE_ID_PMC        = 13,
   VOS_MODULE_ID_HDD_DATA   = 14,
   VOS_MODULE_ID_HDD_SAP_DATA  = 15,

   VOS_MODULE_ID_HIF        = 16,
   VOS_MODULE_ID_HTC        = 17,
   VOS_MODULE_ID_TXRX       = 18,
   VOS_MODULE_ID_ADF        = 19,
   VOS_MODULE_ID_CFG        = 20,

   // not a real module ID.  This is used to identify the maxiumum
   // number of VOS_MODULE_IDs and should always be at the END of
   // this enum.  If IDs are added, they need to go in front of this
   VOS_MODULE_ID_MAX

} VOS_MODULE_ID;


/// Concurrency role.  These are generic IDs that identify the various roles
/// in the software system.
typedef enum
{ /*ON linux maintain 1-1 corespondence with device_mode_t in hdd*/
    VOS_STA_MODE=0,
    VOS_STA_SAP_MODE=1, //to support softAp  mode . This is misleading. It means AP MODE only.
                        //The constant name has historical reason
    VOS_P2P_CLIENT_MODE,
    VOS_P2P_GO_MODE,
    VOS_MONITOR_MODE,
    VOS_FTM_MODE = 5,
    VOS_IBSS_MODE,
    VOS_P2P_DEVICE_MODE,
    VOS_OCB_MODE,
    VOS_NDI_MODE,
    VOS_MAX_NO_OF_MODE
} tVOS_CON_MODE;

#ifdef WLAN_OPEN_P2P_INTERFACE
#define VOS_MAX_CONCURRENCY_PERSONA    4  // This should match with WLAN_MAX_INTERFACES
#else
/*
 * This should match with WLAN_MAX_INTERFACES
 */
#ifdef WLAN_4SAP_CONCURRENCY
#define VOS_MAX_CONCURRENCY_PERSONA    4
#else
#define VOS_MAX_CONCURRENCY_PERSONA    3
#endif
#endif

/*
 * MAX concurrency channel count in MCC
 */
#define MAX_CONCURRENCY_CHAN_COUNT 2

/*
 * MAX Session count per channel in MCC
 */
#define MAX_SESSSION_PER_CHAN_MCC 2


//This is a bit pattern to be set for each mode
//bit 0 - sta mode
//bit 1 - ap mode
//bit 2 - p2p client mode
//bit 3 - p2p go mode
typedef enum
{
    VOS_STA=1,
    VOS_SAP=2,
    VOS_STA_SAP=3, //to support sta, softAp  mode . This means STA+AP mode
    VOS_P2P_CLIENT=4,
    VOS_P2P_GO=8,
} tVOS_CONCURRENCY_MODE;

#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
typedef enum
{
    VOS_MCC_TO_SCC_SWITCH_DISABLE = 0,
    VOS_MCC_TO_SCC_SWITCH_ENABLE,
    VOS_MCC_TO_SCC_SWITCH_FORCE,
    VOS_MCC_TO_SCC_SWITCH_MAX
} tVOS_MCC_TO_SCC_SWITCH_MODE;
#endif

#if !defined( NULL )
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

enum
{
   VOS_FALSE = 0,
   VOS_TRUE  = ( !VOS_FALSE )
};

/// pointer to void types
typedef v_VOID_t *v_PVOID_t;

/// "Size" type...
typedef v_UINT_t v_SIZE_t;

/// 'Time' type
typedef v_ULONG_t v_TIME_t;

// typedef for VOSS Context...
typedef v_VOID_t *v_CONTEXT_t;


/// MAC address data type and corresponding macros/functions to
/// manipulate MAC addresses...
/// Macro defining the size of a MAC Address...
#define VOS_MAC_ADDR_SIZE ( 6 )

typedef struct
{
   /// the bytes that make up the macAddress.
   v_BYTE_t bytes[ VOS_MAC_ADDR_SIZE ];

} v_MACADDR_t;


/// This macro is used to initialize a vOSS MacAddress to the
/// broadcast MacAddress.  It is used like this...
/// v_MACADDR_t macAddress = VOS_MAC_ADDR_BROADCAST_INITIALIZER;
#define VOS_MAC_ADDR_BROADCAST_INITIALIZER { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }

/// This macro is used to initialize a vOSS MacAddress to zero
/// It is used like this...
/// v_MACADDR_t macAddress = VOS_MAC_ADDR_ZERO_INITIALIZER;
#define VOS_MAC_ADDR_ZERO_INITIALIZER { { 0, 0, 0, 0, 0, 0 } }

#define VOS_IPV4_ADDR_SIZE ( 4 )

/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_equal() - compare two vOSS MacAddress

  This function returns a boolean that tells if a two vOSS MacAddress'
  are equivalent.

  \param pMacAddr1 - pointer to one voss MacAddress to compare
  \param pMacAddr2 - pointer to the other voss MacAddress to compare

  \return  true - the MacAddress's are equal
           not true - the MacAddress's are not equal

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_equal( v_MACADDR_t *pMacAddr1,
                                             v_MACADDR_t *pMacAddr2 )
{
   return ( 0 == memcmp( pMacAddr1, pMacAddr2, VOS_MAC_ADDR_SIZE ) );
}



/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_zero() - check for a MacAddress of all zeros.

  This function returns a boolean that tells if a MacAddress is made up of
  all zeros.

  \param pMacAddr - pointer to the v_MACADDR_t to check.

  \return  true - the MacAddress is all Zeros
           not true - the MacAddress is not all Zeros.

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_zero( v_MACADDR_t *pMacAddr )
{
   v_MACADDR_t zeroMacAddr = VOS_MAC_ADDR_ZERO_INITIALIZER;

   return( vos_is_macaddr_equal( pMacAddr, &zeroMacAddr ) );
}


/*----------------------------------------------------------------------------

  \brief vos_zero_macaddr() - zero out a MacAddress

  This function zeros out a vOSS MacAddress type.

  \param pMacAddr - pointer to the v_MACADDR_t to zero.

  \return  nothing

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_VOID_t vos_zero_macaddr( v_MACADDR_t *pMacAddr )
{
   memset( pMacAddr, 0, VOS_MAC_ADDR_SIZE );
}


/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_group() - check for a MacAddress is a 'group' address

  This function returns a boolean that tells if a the input vOSS MacAddress
  is a "group" address.  Group addresses have the 'group address bit' turned
  on in the MacAddress.  Group addresses are made up of Broadcast and
  Multicast addresses.

  \param pMacAddr1 - pointer to the voss MacAddress to check

  \return  true - the input MacAddress is a Group address
           not true - the input MacAddress is not a Group address

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_group( v_MACADDR_t *pMacAddr )
{
    return( pMacAddr->bytes[ 0 ] & 0x01 );
}


/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_broadcast() - check for a MacAddress is a broadcast address

  This function returns a boolean that tells if a the input vOSS MacAddress
  is a "broadcast" address.

  \param pMacAddr - pointer to the voss MacAddress to check

  \return  true - the input MacAddress is a broadcast address
           not true - the input MacAddress is not a broadcast address

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_broadcast( v_MACADDR_t *pMacAddr )
{
   v_MACADDR_t broadcastMacAddr = VOS_MAC_ADDR_BROADCAST_INITIALIZER;

   return( vos_is_macaddr_equal( pMacAddr, &broadcastMacAddr ) );
}

/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_multicast() - check for a MacAddress is a multicast address

  This function returns a boolean that tells if a the input vOSS MacAddress
  is a "Multicast" address.

  \param pMacAddr - pointer to the voss MacAddress to check

  \return  true - the input MacAddress is a Multicast address
           not true - the input MacAddress is not a Multicast address

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_multicast( v_MACADDR_t *pMacAddr )
{
   return( vos_is_macaddr_group( pMacAddr ) &&
          !vos_is_macaddr_broadcast( pMacAddr ) );
}



/*----------------------------------------------------------------------------

  \brief vos_is_macaddr_directed() - check for a MacAddress is a directed address

  This function returns a boolean that tells if a the input vOSS MacAddress
  is a "directed" address.

  \param pMacAddr - pointer to the voss MacAddress to check

  \return  true - the input MacAddress is a directed address
           not true - the input MacAddress is not a directed address

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_BOOL_t vos_is_macaddr_directed( v_MACADDR_t *pMacAddr )
{
    return( !vos_is_macaddr_group( pMacAddr ) );
}

/*----------------------------------------------------------------------------

  \brief vos_copy_macaddr() - copy a vOSS MacAddress

  This function copies a vOSS MacAddress into another vOSS MacAddress.

  \param pDst - pointer to the voss MacAddress to copy TO (the destination)
  \param pSrc - pointer to the voss MacAddress to copy FROM (the source)

  \return  nothing

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_VOID_t vos_copy_macaddr( v_MACADDR_t *pDst, v_MACADDR_t *pSrc )
{
    *pDst = *pSrc;
}


/*----------------------------------------------------------------------------

  \brief vos_set_macaddr_broadcast() - set a vOSS MacAddress to the 'broadcast'

  This function sets a vOSS MacAddress to the 'broadcast' MacAddress. Broadcast
  MacAddress contains all 0xFF bytes.

  \param pMacAddr - pointer to the voss MacAddress to set to broadcast

  \return  nothing

  \sa

  --------------------------------------------------------------------------*/
VOS_INLINE_FN v_VOID_t vos_set_macaddr_broadcast( v_MACADDR_t *pMacAddr )
{
   memset( pMacAddr, 0xff, VOS_MAC_ADDR_SIZE );
}

/*----------------------------------------------------------------------------

  \brief vos_atomic_set() - set a variable atomically

  \param pTarget - pointer to the variable to set.

  \param value - the value to set in the  variable.

  \return This function returns the value previously in the uintptr_t before
          the new value is set.

  \sa vos_atomic_increment_U32(), vos_atomic_decrement_U32()

  --------------------------------------------------------------------------*/
uintptr_t vos_atomic_set( uintptr_t *pTarget, uintptr_t value );


// TODO: the below function is a stub to perform atomic set on a BYTE
// Clearly the function below is not an atomic function
VOS_INLINE_FN v_U8_t vos_atomic_set_U8( v_U8_t *pVariable, v_U8_t value )
{
  if (pVariable == NULL)
  {
    return 0;
  }
  *pVariable = value;
  return value;
}

/*----------------------------------------------------------------------------

  \brief vos_atomic_increment_U32() - Increment a U32 variable atomically

  \param pTarget - pointer to the v_U32_t to increment.

  \return This function returns the value of the variable after the
          increment occurs.

  \sa vos_atomic_decrement_U32(), vos_atomic_set_U32()

  --------------------------------------------------------------------------*/
v_U32_t vos_atomic_increment_U32( v_U32_t *pTarget );


/*----------------------------------------------------------------------------

  \brief vos_atomic_decrement_U32() - Decrement a U32 variable atomically

  \param pTarget - pointer to the v_U32_t to decrement.

  \return This function returns the value of the variable after the
          decrement occurs.

  \sa vos_atomic_increment_U32(), vos_atomic_set_U32()

  --------------------------------------------------------------------------*/
v_U32_t vos_atomic_decrement_U32( v_U32_t *pTarget );

/*----------------------------------------------------------------------------

  \brief vos_atomic_increment_U32_by_value() - Increment a U32 variable atomically
  by a given value

  \param pTarget - pointer to the v_U32_t to decrement.
  \param value   - the value that needs to be added to target

  \return This function returns the value of the variable after the
          decrement occurs.

  \sa vos_atomic_increment_U32(), vos_atomic_set_U32()

  --------------------------------------------------------------------------*/
v_U32_t vos_atomic_increment_U32_by_value( v_U32_t *pTarget, v_U32_t value  );

/*----------------------------------------------------------------------------

  \brief vos_atomic_decrement_U32_by_value() - Decrement a U32 variable atomically
  by a given value

  \param pTarget - pointer to the v_U32_t to decrement.
  \param value   - the value that needs to be substracted from target

  \return This function returns the value of the variable after the
          decrement occurs.

  \sa vos_atomic_increment_U32(), vos_atomic_set_U32()

  --------------------------------------------------------------------------*/
v_U32_t vos_atomic_decrement_U32_by_value( v_U32_t *pTarget, v_U32_t value  );


v_U32_t vos_get_skip_ssid_check(void);

v_U32_t vos_get_skip_11e_check(void);



#endif // if !defined __VOSS_TYPES_H
