/*
 * Copyright (c) 2013,2016 The Linux Foundation. All rights reserved.
 *
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of The Linux Foundation nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


#ifndef _BTCONFIG_H_
#define _BTCONFIG_H_
#define VERSION     "2.14"
//#define DUMP_DEBUG 1
//#define DEBUG 1 // @@ boyi @@
#ifdef ANDROID
#define FW_PATH_AR "/etc/firmware/ar3k/"
#else
#define FW_PATH_AR "/lib/firmware/ar3k/"
#endif
#define BDADDR_FILE "ar3kbdaddr.pst"
#define PS_ASIC_FILE                    "PS_ASIC.pst"
#define PS_FPGA_FILE                    "PS_FPGA.pst"
#define PATCH_FILE        "RamPatch.txt"
#define ROM_DEV_TYPE      0xdeadc0de
#define FPGA_ROM_VERSION  0x99999999

#define PS_RAM_SIZE 2048
#define TRUE    1
#define FALSE   0
#define LINE_SIZE_MAX       3000
#define PS_RESET        2

#define PS_WRITE        1
#define HCI_PS_CMD_HDR_LEN 7

#define PS_RESET_PARAM_LEN 6
#define HCI_MAX_CMD_SIZE   260
#define PS_RESET_CMD_LEN   (HCI_PS_CMD_HDR_LEN + PS_RESET_PARAM_LEN)

#define PS_ID_MASK         0xFF

#define HCI_VENDOR_CMD_OGF    0x3F
#define HCI_PS_CMD_OCF        0x0B
#define HCI_CHG_BAUD_CMD_OCF  0x0C
#define HCI_CMD_OGF_HOST_CTL  0x03
#define HCI_CMD_OGF_INFO_PARAM 0x04

#define HCI_CMD_OCF_RESET     0x0003
#define HCI_CMD_OCF_READ_BD_ADDR  0x0009

#define WRITE_BDADDR_CMD_LEN 14
#define WRITE_BAUD_CMD_LEN   6
#define MAX_CMD_LEN          WRITE_BDADDR_CMD_LEN

#define BD_ADDR_SIZE        6
#define BD_ADDR_PSTAG       1
#define PS_READ         0
#define PS_READ_RAW     3

#define WRITE_PATCH     8
#define ENABLE_PATCH        11


#define PS_WRITE_RAW        4
#define PS_GET_LENGTH       5
#define PS_SET_ACCESS_MODE  6
#define PS_SET_ACCESS_PRIORITY  7
#define PS_WRITE        1
#define PS_DYNMEM_OVERRIDE  10
#define PS_VERIFY_CRC       9
#define CHANGE_BDADDR       15
#define PS_COMMAND_HEADER   4
#define HCI_EVENT_SIZE      7
#define PS_RETRY_COUNT      3
#define RAM_PS_REGION       (1<<0)
#define RAM_PATCH_REGION    (1<<1)
#define RAM_DYN_MEM_REGION  (1<<2)
#define RAMPS_MAX_PS_DATA_PER_TAG       244
#define RAMPS_MAX_PS_TAGS_PER_FILE      50
#define PSTAG_RF_TEST_BLOCK_START      (300)
#define PSTAG_SYSTEM_BLOCK_START    (1)
#define BT_SOC_INIT_TOOL_START_MAGIC_WORD 0xB1B1
#define PSTAG_RF_PARAM_TABLE0        (PSTAG_RF_TEST_BLOCK_START+0)
#define PSTAG_SYSCFG_PARAM_TABLE0    (PSTAG_SYSTEM_BLOCK_START+18)
#define PATCH_MAX_LEN                     20000
#define DYN_MEM_MAX_LEN                   40
#define SKIP_BLANKS(str) while (*str == ' ') str++
#define MAX_RADIO_CFG_TABLE_SIZE    1000
#define MAX_BYTE_LENGTH    244
#define DEBUG_EVENT_TYPE_PS     0x02
#define DEBUG_EVENT_TYPE_MEMBLK     0x03
#define HCI_EVENT_HEADER_SIZE       0x03
#define HI_MAGIC_NUMBER ((const unsigned short int) 0xFADE)
#define HI_VERSION  (0x0300)  //Version 3.0
#define EEPROM_CONFIG   0x00020C00
#define FPGA_REGISTER   0x4FFC
#define MAX_EVENT_SIZE  260

// Vendor specific command OCF
#define OCF_PS  0x000B
#define OCF_MEMOP   0x0014
#define OGF_TEST_CMD    0x06
#define OCF_HOST_INTEREST   0x000A
#define OCF_CONT_TX_TESTER  0x0023
#define OCF_TX_TESTER       0x001B
#define OCF_SLEEP_MODE      0x0004
#define OCF_READ_MEMORY     0x0005
#define OCF_WRITE_MEMORY    0x0006
#define OCF_DISABLE_TX      0x002D
#define OCF_TEST_MODE_SEQN_TRACKING 0x0018
#define OCF_READ_VERSION    0x001E
#define OCF_AUDIO_CMD       0x0013
#define OCF_GET_BERTYPE     0x005C
#define OCF_RX_TESTER       0x005B

#define UCHAR unsigned char
#define BOOL unsigned short
#define UINT16 unsigned short int
#define UINT32 unsigned int
#define SINT16 signed short int
#define UINT8 unsigned char
#define SINT8 signed char

#if __BYTE_ORDER == __LITTLE_ENDIAN
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define htobs(d) (d)
#define htobl(d) (d)
#define btohs(d) (d)
#define btohl(d) (d)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#elif __BYTE_ORDER == __BIG_ENDIAN
#define htobs(d) bswap_16(d)
#define htobl(d) bswap_32(d)
#define btohs(d) bswap_16(d)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define btohl(d) bswap_32(d)
#else
#error "Unknown byte order"
#endif
#define MAX_TAGS              50
#define PS_HDR_LEN            4
#define HCI_VENDOR_CMD_OGF    0x3F
#define HCI_PS_CMD_OCF        0x0B
#define PS_EVENT_LEN 100
#define HCI_EV_SUCCESS        0x00

#define BT_PORT 2398

/* For ROME QCA61x4 chipset */
#define EVT_VENDOR          (0xFF)
#define EVT_CMD_COMPLETE        (0x0E)
#define HCI_COMMAND_PKT         (0x01)
#define HCI_MAX_EVENT_SIZE      (260)

#define MAX_SIZE_PER_TLV_SEGMENT    (243)
#define EDL_PATCH_CMD_LEN       (1)

#define EDL_PATCH_VER_REQ_CMD       (0x19)
#define EDL_PATCH_TLV_REQ_CMD       (0x1E)

#define EDL_CMD_REQ_RES_EVT     (0x00)
#define EDL_PATCH_VER_RES_EVT       (0x19)
#define EDL_APP_VER_RES_EVT     (0x02)
#define EDL_TVL_DNLD_RES_EVT        (0x04)
#define EDL_CMD_EXE_STATUS_EVT      (0x00)
#define EDL_SET_BAUDRATE_RSP_EVT    (0x92)
#define EDL_NVM_ACCESS_CODE_EVT     (0x0B)

#define HCI_PATCH_CMD_OCF       (0)

#define FW_PATH_ROME            "/lib/firmware/qca"
#define FLOW_CTL            (0x0001)
#define BAUDRATE_CHANGE_SUCCESS     (0x01)
#define CC_MIN_SIZE             (0x7)
#define HCI_CMD_SUCCESS         (0x0)

enum qca_bardrate_type {
    QCA_BAUDRATE_115200     = 0,
    QCA_BAUDRATE_57600,
    QCA_BAUDRATE_38400,
    QCA_BAUDRATE_19200,
    QCA_BAUDRATE_9600,
    QCA_BAUDRATE_230400,
    QCA_BAUDRATE_250000,
    QCA_BAUDRATE_460800,
    QCA_BAUDRATE_500000,
    QCA_BAUDRATE_720000,
    QCA_BAUDRATE_921600,
    QCA_BAUDRATE_1000000,
    QCA_BAUDRATE_1250000,
    QCA_BAUDRATE_2000000,
    QCA_BAUDRATE_3000000,
    QCA_BAUDRATE_4000000,
    QCA_BAUDRATE_1600000,
    QCA_BAUDRATE_3200000,
    QCA_BAUDRATE_3500000,
    QCA_BAUDRATE_AUTO   = 0xFE,
    QCA_BAUDRATE_RESERVED
};

enum qca_tlv_type {
    TLV_TYPE_PATCH = 1,
    TLV_TYPE_NVM
};

struct patch_data {
    int8_t type;
    int64_t len;
    uint8_t *data;
};
#ifndef ANDROID
size_t
strlcpy(char *dst, const char *src, size_t size)
{
    const char *s = src;
    size_t n = size;

    if (n && --n)
        do {
            if (!(*dst++ = *src++))
                break;
        } while (--n);

    if (!n) {
        if (size)
            *dst = '\0';
        while (*src++);
    }
    return src - s - 1;
}
#endif //strlcpy is present on the string.h on android but not on the x86. hence use this instead.
typedef struct tPsTagEntry
{
    int   TagId;
    UCHAR   TagLen;
    UCHAR    TagData[RAMPS_MAX_PS_DATA_PER_TAG];
} tPsTagEntry, *tpPsTagEntry;

typedef struct tRamPatch
{
    int   Len;
    UCHAR    Data[PATCH_MAX_LEN];
} tRamPatch, *ptRamPatch;

typedef struct tRamDynMemOverride
{
    int   Len;
    UCHAR    Data[DYN_MEM_MAX_LEN];
} tRamDynMemOverride, *ptRamDynMemOverride;

tPsTagEntry PsTagEntry[RAMPS_MAX_PS_TAGS_PER_FILE];
tRamPatch   RamPatch[50];
tRamDynMemOverride RamDynMemOverride;

enum MB_FILEFORMAT {
    MB_FILEFORMAT_PS,
    MB_FILEFORMAT_PATCH,
    MB_FILEFORMAT_DY,
};
enum RamPsSection
{
    RAM_PS_SECTION,
    RAM_PATCH_SECTION,
    RAM_DYN_MEM_SECTION
};

enum eType {
    eHex,
    edecimal,
};

struct ST_PS_DATA_FORMAT {
    enum eType   eDataType;
    BOOL    bIsArray;
};
#define CONV_DEC_DIGIT_TO_VALUE(c) ((c) - '0')
#define IS_HEX(c)   (IS_BETWEEN((c), '0', '9') || IS_BETWEEN((c), 'a', 'f') || IS_BETWEEN((c), 'A', 'F'))
#define IS_BETWEEN(x, lower, upper) (((lower) <= (x)) && ((x) <= (upper)))
#define IS_DIGIT(c) (IS_BETWEEN((c), '0', '9'))
#define CONV_HEX_DIGIT_TO_VALUE(c) (IS_DIGIT(c) ? ((c) - '0') : (IS_BETWEEN((c), 'A', 'Z') ? ((c) - 'A' + 10) : ((c) - 'a' + 10)))
#define BYTES_OF_PS_DATA_PER_LINE    16
struct ST_READ_STATUS {
    unsigned uTagID;
    unsigned uSection;
    unsigned uLineCount;
    unsigned uCharCount;
    unsigned uByteCount;
};

//DUT MODE related
#define MC_BCAM_COMPARE_ADDRESS           0x00008080
#define HCI_3_PATCH_SPACE_LENGTH_1            (0x80)
#define HCI_3_PATCH_SPACE_LENGTH_2            (0x279C)
#define MEM_BLK_DATA_MAX                (244)
#define MC_BCAM_VALID_ADDRESS                    0x00008100

//Audio stat

typedef struct tAudio_Stat {
    UINT16      RxSilenceInsert;
    UINT16      RxAirPktDump;
    UINT16      RxCmplt;
    UINT16      TxCmplt;
    UINT16      MaxPLCGenInterval;
    UINT16      RxAirPktStatusGood;
    UINT16      RxAirPktStatusError;
    UINT16      RxAirPktStatusLost;
    UINT16      RxAirPktStatusPartial;
    SINT16      SampleMin;
    SINT16      SampleMax;
    UINT16      SampleCounter;
    UINT16      SampleStatEnable;
} tAudioStat;

//DMA stats

typedef struct tBRM_Stats {
  // DMA Stats
  UINT32 DmaIntrs;

  // Voice Stats
  UINT16 VoiceTxDmaIntrs;
  UINT16 VoiceTxErrorIntrs;
  UINT16 VoiceTxDmaErrorIntrs;
  UINT16 VoiceTxPktAvail;
  UINT16 VoiceTxPktDumped;
  UINT16 VoiceTxDmaSilenceInserts;

  UINT16 VoiceRxDmaIntrs;
  UINT16 VoiceRxErrorIntrs;
  UINT16 VoiceRxGoodPkts;
  UINT16 VoiceRxErrCrc;
  UINT16 VoiceRxErrUnderOverFlow;
  UINT16 VoiceRxPktDumped;

  UINT16 VoiceTxReapOnError;
  UINT16 VoiceRxReapOnError;
  UINT16 VoiceSchedulingError;
  UINT16 SchedOnVoiceError;

  UINT16 Temp1;
  UINT16 Temp2;

  // Control Stats
  UINT16 ErrWrongLlid;
  UINT16 ErrL2CapLen;
  UINT16 ErrUnderOverFlow;
  UINT16 RxBufferDumped;
  UINT16 ErrWrongLmpPktType;
  UINT16 ErrWrongL2CapPktType;
  UINT16 HecFailPkts;
  UINT16 IgnoredPkts;
  UINT16 CrcFailPkts;
  UINT16 HwErrRxOverflow;

  UINT16 CtrlErrNoLmpBufs;

  // ACL Stats
  UINT16 DataTxBuffers;
  UINT16 DataRxBuffers;
  UINT16 DataRxErrCrc;
  UINT16 DataRxPktDumped;
  UINT16 LmpTxBuffers;
  UINT16 LmpRxBuffers;
  UINT16 ForceOverQosJob;

  // Sniff Stats
  UINT16 SniffSchedulingError;
  UINT16 SniffIntervalNoCorr;

  // Test Mode Stats
  UINT16 TestModeDroppedTxPkts;
  UINT16 TestModeDroppedLmps;

  // Error Stats
  UINT16 TimePassedIntrs;
  UINT16 NoCommandIntrs;

} tBRM_Stats;

typedef struct tSYSUTIL_ChipId {
  char *pName;
  UINT32 HwRev;
} tSYSUTIL_ChipId;

typedef struct tSU_RevInfo {
  tSYSUTIL_ChipId *pChipId;
  tSYSUTIL_ChipId *pChipRadioId;
  UINT32 ChipRadioId;
  UINT32 SubRadioId;
  UINT32 RomVersion;
  UINT32 RomBuildNumber;
  UINT32 BuildVersion;
  UINT32 BuildNumber;
  UINT16 RadioFormat;
  UINT16 RadioContent;
  UINT16 SysCfgFormat;
  UINT16 SysCfgContent;
  UINT8 ProductId;
} tSU_RevInfo;

typedef struct {
    UINT8 b[6];
} __attribute__((packed)) bdaddr_t;

typedef struct {
    UINT16 opcode;      /* OCF & OGF */
    UINT8   plen;
} __attribute__((packed)) hci_command_hdr;

typedef struct {
    UINT8   evt;
    UINT8   plen;
} __attribute__((packed)) hci_event_hdr;

typedef struct {
    UINT8   ncmd;
    UINT16  opcode;
} __attribute__ ((packed)) evt_cmd_complete;

#define HCI_COMMAND_HEADER_SIZE 3
#define HCI_OPCODE_PACK(ogf, ocf) (UINT16)((ocf & 0x03ff)|(ogf << 10))

#endif

