1 /* 2 * Bluetooth supports for Qualcomm Atheros ROME chips 3 * 4 * Copyright (c) 2015 The Linux Foundation. All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 8 * as published by the Free Software Foundation 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 */ 20 21 #define EDL_PATCH_CMD_OPCODE (0xFC00) 22 #define EDL_NVM_ACCESS_OPCODE (0xFC0B) 23 #define EDL_PATCH_CMD_LEN (1) 24 #define EDL_PATCH_VER_REQ_CMD (0x19) 25 #define EDL_PATCH_TLV_REQ_CMD (0x1E) 26 #define EDL_NVM_ACCESS_SET_REQ_CMD (0x01) 27 #define MAX_SIZE_PER_TLV_SEGMENT (243) 28 29 #define EDL_CMD_REQ_RES_EVT (0x00) 30 #define EDL_PATCH_VER_RES_EVT (0x19) 31 #define EDL_APP_VER_RES_EVT (0x02) 32 #define EDL_TVL_DNLD_RES_EVT (0x04) 33 #define EDL_CMD_EXE_STATUS_EVT (0x00) 34 #define EDL_SET_BAUDRATE_RSP_EVT (0x92) 35 #define EDL_NVM_ACCESS_CODE_EVT (0x0B) 36 37 #define EDL_TAG_ID_HCI (17) 38 #define EDL_TAG_ID_DEEP_SLEEP (27) 39 40 enum qca_bardrate { 41 QCA_BAUDRATE_115200 = 0, 42 QCA_BAUDRATE_57600, 43 QCA_BAUDRATE_38400, 44 QCA_BAUDRATE_19200, 45 QCA_BAUDRATE_9600, 46 QCA_BAUDRATE_230400, 47 QCA_BAUDRATE_250000, 48 QCA_BAUDRATE_460800, 49 QCA_BAUDRATE_500000, 50 QCA_BAUDRATE_720000, 51 QCA_BAUDRATE_921600, 52 QCA_BAUDRATE_1000000, 53 QCA_BAUDRATE_1250000, 54 QCA_BAUDRATE_2000000, 55 QCA_BAUDRATE_3000000, 56 QCA_BAUDRATE_4000000, 57 QCA_BAUDRATE_1600000, 58 QCA_BAUDRATE_3200000, 59 QCA_BAUDRATE_3500000, 60 QCA_BAUDRATE_AUTO = 0xFE, 61 QCA_BAUDRATE_RESERVED 62 }; 63 64 enum rome_tlv_dnld_mode { 65 ROME_SKIP_EVT_NONE, 66 ROME_SKIP_EVT_VSE, 67 ROME_SKIP_EVT_CC, 68 ROME_SKIP_EVT_VSE_CC 69 }; 70 71 enum rome_tlv_type { 72 TLV_TYPE_PATCH = 1, 73 TLV_TYPE_NVM 74 }; 75 76 struct rome_config { 77 u8 type; 78 char fwname[64]; 79 uint8_t user_baud_rate; 80 enum rome_tlv_dnld_mode dnld_mode; 81 }; 82 83 struct edl_event_hdr { 84 __u8 cresp; 85 __u8 rtype; 86 __u8 data[0]; 87 } __packed; 88 89 struct rome_version { 90 __le32 product_id; 91 __le16 patch_ver; 92 __le16 rome_ver; 93 __le32 soc_id; 94 } __packed; 95 96 struct tlv_seg_resp { 97 __u8 result; 98 } __packed; 99 100 struct tlv_type_patch { 101 __le32 total_size; 102 __le32 data_length; 103 __u8 format_version; 104 __u8 signature; 105 __u8 download_mode; 106 __u8 reserved1; 107 __le16 product_id; 108 __le16 rom_build; 109 __le16 patch_version; 110 __le16 reserved2; 111 __le32 entry; 112 } __packed; 113 114 struct tlv_type_nvm { 115 __le16 tag_id; 116 __le16 tag_len; 117 __le32 reserve1; 118 __le32 reserve2; 119 __u8 data[0]; 120 } __packed; 121 122 struct tlv_type_hdr { 123 __le32 type_len; 124 __u8 data[0]; 125 } __packed; 126 127 #if IS_ENABLED(CONFIG_BT_QCA) 128 129 int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr); 130 int qca_uart_setup_rome(struct hci_dev *hdev, uint8_t baudrate); 131 132 #else 133 134 static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr) 135 { 136 return -EOPNOTSUPP; 137 } 138 139 static inline int qca_uart_setup_rome(struct hci_dev *hdev, int speed) 140 { 141 return -EOPNOTSUPP; 142 } 143 144 #endif 145