linux/drivers/bluetooth/btqca.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 *  Bluetooth supports for Qualcomm Atheros ROME chips
   4 *
   5 *  Copyright (c) 2015 The Linux Foundation. All rights reserved.
   6 */
   7
   8#define EDL_PATCH_CMD_OPCODE            (0xFC00)
   9#define EDL_NVM_ACCESS_OPCODE           (0xFC0B)
  10#define EDL_WRITE_BD_ADDR_OPCODE        (0xFC14)
  11#define EDL_PATCH_CMD_LEN               (1)
  12#define EDL_PATCH_VER_REQ_CMD           (0x19)
  13#define EDL_PATCH_TLV_REQ_CMD           (0x1E)
  14#define EDL_NVM_ACCESS_SET_REQ_CMD      (0x01)
  15#define MAX_SIZE_PER_TLV_SEGMENT        (243)
  16#define QCA_PRE_SHUTDOWN_CMD            (0xFC08)
  17
  18#define EDL_CMD_REQ_RES_EVT             (0x00)
  19#define EDL_PATCH_VER_RES_EVT           (0x19)
  20#define EDL_APP_VER_RES_EVT             (0x02)
  21#define EDL_TVL_DNLD_RES_EVT            (0x04)
  22#define EDL_CMD_EXE_STATUS_EVT          (0x00)
  23#define EDL_SET_BAUDRATE_RSP_EVT        (0x92)
  24#define EDL_NVM_ACCESS_CODE_EVT         (0x0B)
  25
  26#define EDL_TAG_ID_HCI                  (17)
  27#define EDL_TAG_ID_DEEP_SLEEP           (27)
  28
  29#define QCA_WCN3990_POWERON_PULSE       0xFC
  30#define QCA_WCN3990_POWEROFF_PULSE      0xC0
  31
  32#define QCA_HCI_CC_OPCODE               0xFC00
  33#define QCA_HCI_CC_SUCCESS              0x00
  34
  35enum qca_baudrate {
  36        QCA_BAUDRATE_115200     = 0,
  37        QCA_BAUDRATE_57600,
  38        QCA_BAUDRATE_38400,
  39        QCA_BAUDRATE_19200,
  40        QCA_BAUDRATE_9600,
  41        QCA_BAUDRATE_230400,
  42        QCA_BAUDRATE_250000,
  43        QCA_BAUDRATE_460800,
  44        QCA_BAUDRATE_500000,
  45        QCA_BAUDRATE_720000,
  46        QCA_BAUDRATE_921600,
  47        QCA_BAUDRATE_1000000,
  48        QCA_BAUDRATE_1250000,
  49        QCA_BAUDRATE_2000000,
  50        QCA_BAUDRATE_3000000,
  51        QCA_BAUDRATE_4000000,
  52        QCA_BAUDRATE_1600000,
  53        QCA_BAUDRATE_3200000,
  54        QCA_BAUDRATE_3500000,
  55        QCA_BAUDRATE_AUTO       = 0xFE,
  56        QCA_BAUDRATE_RESERVED
  57};
  58
  59enum rome_tlv_dnld_mode {
  60        ROME_SKIP_EVT_NONE,
  61        ROME_SKIP_EVT_VSE,
  62        ROME_SKIP_EVT_CC,
  63        ROME_SKIP_EVT_VSE_CC
  64};
  65
  66enum rome_tlv_type {
  67        TLV_TYPE_PATCH = 1,
  68        TLV_TYPE_NVM
  69};
  70
  71struct rome_config {
  72        u8 type;
  73        char fwname[64];
  74        uint8_t user_baud_rate;
  75        enum rome_tlv_dnld_mode dnld_mode;
  76        enum rome_tlv_dnld_mode dnld_type;
  77};
  78
  79struct edl_event_hdr {
  80        __u8 cresp;
  81        __u8 rtype;
  82        __u8 data[0];
  83} __packed;
  84
  85struct rome_version {
  86        __le32 product_id;
  87        __le16 patch_ver;
  88        __le16 rome_ver;
  89        __le32 soc_id;
  90} __packed;
  91
  92struct tlv_seg_resp {
  93        __u8 result;
  94} __packed;
  95
  96struct tlv_type_patch {
  97        __le32 total_size;
  98        __le32 data_length;
  99        __u8   format_version;
 100        __u8   signature;
 101        __u8   download_mode;
 102        __u8   reserved1;
 103        __le16 product_id;
 104        __le16 rom_build;
 105        __le16 patch_version;
 106        __le16 reserved2;
 107        __le32 entry;
 108} __packed;
 109
 110struct tlv_type_nvm {
 111        __le16 tag_id;
 112        __le16 tag_len;
 113        __le32 reserve1;
 114        __le32 reserve2;
 115        __u8   data[0];
 116} __packed;
 117
 118struct tlv_type_hdr {
 119        __le32 type_len;
 120        __u8   data[0];
 121} __packed;
 122
 123enum qca_btsoc_type {
 124        QCA_INVALID = -1,
 125        QCA_AR3002,
 126        QCA_ROME,
 127        QCA_WCN3990,
 128        QCA_WCN3998,
 129};
 130
 131#if IS_ENABLED(CONFIG_BT_QCA)
 132
 133int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr);
 134int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 135                   enum qca_btsoc_type soc_type, u32 soc_ver,
 136                   const char *firmware_name);
 137int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version);
 138int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
 139int qca_send_pre_shutdown_cmd(struct hci_dev *hdev);
 140static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
 141{
 142        return soc_type == QCA_WCN3990 || soc_type == QCA_WCN3998;
 143}
 144#else
 145
 146static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
 147{
 148        return -EOPNOTSUPP;
 149}
 150
 151static inline int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 152                                 enum qca_btsoc_type soc_type, u32 soc_ver,
 153                                 const char *firmware_name)
 154{
 155        return -EOPNOTSUPP;
 156}
 157
 158static inline int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version)
 159{
 160        return -EOPNOTSUPP;
 161}
 162
 163static inline int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
 164{
 165        return -EOPNOTSUPP;
 166}
 167
 168static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
 169{
 170        return false;
 171}
 172
 173static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
 174{
 175        return -EOPNOTSUPP;
 176}
 177#endif
 178