/*
 * Copyright (c) 2012-2013, 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.
 */
/*
 * Copyright (c) 2012, 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.
 */

#ifndef WLAN_HDD_FTM_H
#define WLAN_HDD_FTM_H
#include "vos_status.h"
#include "vos_mq.h"
#include "vos_api.h"
#include "msg.h"
#include "halTypes.h"
#include "vos_types.h"
#include <wlan_ptt_sock_svc.h>

#define WLAN_FTM_SUCCESS   0
#define WLAN_FTM_FAILURE   1

#define WLAN_FTM_START              1
#define WLAN_FTM_STOP               2        
#define WLAN_FTM_CMD                3


#define WLAN_FTM_PHY_CMD         100
#define SIR_HAL_FTM_CMD          10
#define QUALCOMM_MODULE_TYPE     2
#define WLAN_FTM_COMMAND_TIME_OUT 1000
#define PHYDBG_PREAMBLE_NOT_SUPPORTED 0xFF
/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_INT_GET_NONE    (SIOCIWFIRSTPRIV + 0)
#define WE_FTM_ON_OFF         1
#define WE_TX_PKT_GEN         2
#define WE_SET_TX_IFS         3
#define WE_SET_TX_PKT_CNT     4
#define WE_SET_TX_PKT_LEN     5
#define WE_SET_CHANNEL        6
#define WE_SET_TX_POWER       7
#define WE_CLEAR_RX_PKT_CNT   8
#define WE_RX                 9
#define WE_ENABLE_CHAIN      10

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_NONE_GET_INT    (SIOCIWFIRSTPRIV + 1)
#define WE_GET_CHANNEL      1
#define WE_GET_TX_POWER     2
#define WE_GET_RX_PKT_CNT   3

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_INT_GET_INT     (SIOCIWFIRSTPRIV + 2)

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_CHAR_GET_NONE   (SIOCIWFIRSTPRIV + 3)
#define WE_SET_MAC_ADDRESS   1
#define WE_SET_TX_RATE       2

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_THREE_INT_GET_NONE   (SIOCIWFIRSTPRIV + 4)
#define WE_SET_WLAN_DBG      1

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_GET_CHAR_SET_NONE   (SIOCIWFIRSTPRIV + 5)
#define WE_GET_MAC_ADDRESS   1
#define WE_GET_TX_RATE        2
#define WE_GET_FTM_VERSION   3
#define WE_GET_FTM_STATUS    4
#define WE_GET_RX_RSSI       5

/* Private ioctls and their sub-ioctls */
#define WLAN_FTM_PRIV_SET_NONE_GET_NONE   (SIOCIWFIRSTPRIV + 6)
#define WE_SET_NV_DEFAULTS    1

#define WLAN_FTM_PRIV_SET_VAR_INT_GET_NONE   (SIOCIWFIRSTPRIV + 7)
#define WE_SET_RSSI_OFFSET 1


#define WE_FTM_MAX_STR_LEN 1024
#define MAX_FTM_VAR_ARGS  7

#define MAX_NV_TABLE_SIZE  30000

typedef enum {
    WLAN_FTM_CMD_START = 1,
    WLAN_FTM_CMD_STOP,        
    WLAN_FTM_CMD_CMD
} wlan_hdd_ftm_cmds;
typedef struct ftm_hdr_s {
    v_U16_t cmd_id;
    v_U16_t data_len;
    v_U16_t respPktSize;
} ftm_hdr_t;

/* The request buffer of FTM which contains a byte of command and the request */
typedef struct wlan_hdd_ftm_payload_s {
    v_U16_t    ftm_cmd_type;
    v_U8_t    pFtmCmd[1];
}wlan_hdd_ftm_payload;
#define SIZE_OF_FTM_DIAG_HEADER_LEN 12
/* the FTM command/response structure */
typedef struct wlan_hdd_ftm_request_s
{
    v_U8_t    cmd_code;
    v_U8_t    sub_sys_id;
    v_U16_t   mode_id;
    ftm_hdr_t ftm_hdr; 
    v_U16_t   module_type;
    wlan_hdd_ftm_payload ftmpkt;
}wlan_hdd_ftm_request_t;

typedef struct wlan_hdd_ftm_response_s
{
    v_U8_t    cmd_code;
    v_U8_t    sub_sys_id;
    v_U16_t   mode_id;
    ftm_hdr_t ftm_hdr; 
    v_U16_t   ftm_err_code;
    wlan_hdd_ftm_payload ftmpkt;
}wlan_hdd_ftm_response_t;

typedef enum {
    WLAN_FTM_INITIALIZED,
    WLAN_FTM_STOPPED,
    WLAN_FTM_STARTED,
} wlan_hdd_ftm_state;
typedef struct wlan_hdd_ftm_status_s
{
    v_U8_t ftm_state;
    wlan_hdd_ftm_request_t    *pRequestBuf;
    wlan_hdd_ftm_response_t   *pResponseBuf;
    tAniNlHdr *wnl;
        /**vos event */
    vos_event_t  ftm_vos_event;
    
   /** completion variable for ftm command to complete*/
    struct completion ftm_comp_var;
    v_BOOL_t  IsCmdPending;
    v_BOOL_t  cmd_iwpriv;

#ifdef FEATURE_WLAN_INTEGRATED_SOC
    /** Large size of NV Table Handle **/
    eNvTable  processingNVTable;
    v_U32_t   targetNVTableSize;
    v_U8_t   *targetNVTablePointer;
    v_U32_t   processedNVTableSize;
    v_U8_t   *tempNVTableBuffer;
#endif /* FEATURE_WLAN_INTEGRATED_SOC */

} wlan_hdd_ftm_status_t;
typedef struct ftm_msg_s
{
    /* This field can be used as sequence 
        number/dialogue token for matching request/response */
    v_U16_t type;
    
    /* This guy carries the command buffer along with command id */
    void *cmd_ptr;
    v_U32_t bodyval;
} ftm_msg_t;
typedef struct ftm_rsp_msg_s
{
    v_U16_t   msgId;
    v_U16_t   msgBodyLength;
    v_U32_t   respStatus;
    v_U8_t   *msgResponse;
} ftm_rsp_msg_t;

typedef struct rateIndex2Preamble
{
    v_U16_t   rate_index;
    v_U16_t   Preamble;
} rateIndex2Preamble_t;
typedef struct freq_chan_s
{
    v_U16_t   freq;
    v_U16_t   chan;
} freq_chan_t;

typedef struct rateStr2rateIndex_s
{
    v_U16_t   rate_index;
    char      rate_str[30];
} rateStr2rateIndex_t;


#define FTM_SWAP16(A) ((((tANI_U16)(A) & 0xff00) >> 8) | \
                         (((tANI_U16)(A) & 0x00ff) << 8)   \
                      )
#define PTT_HEADER_LENGTH 8

#define FTM_VOS_EVENT_WAIT_TIME 10000

#define SIZE_OF_TABLE(a) (sizeof(a) / sizeof(a[0]))

int wlan_hdd_ftm_open(hdd_context_t *pHddCtx);
void wlan_hdd_process_ftm_cmd (hdd_context_t *pHddCtx,tAniNlHdr *wnl);
int wlan_hdd_ftm_close(hdd_context_t *pHddCtx);

#endif
