1 /* SPDX-License-Identifier: ISC */ 2 /* Copyright (C) 2021 MediaTek Inc. */ 3 4 #define FIRMWARE_MT7622 "mediatek/mt7622pr2h.bin" 5 #define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin" 6 #define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin" 7 #define FIRMWARE_MT7922 "mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin" 8 #define FIRMWARE_MT7902 "mediatek/BT_RAM_CODE_MT7902_1_1_hdr.bin" 9 #define FIRMWARE_MT7961 "mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin" 10 #define FIRMWARE_MT7920 "mediatek/BT_RAM_CODE_MT7961_1a_2_hdr.bin" 11 #define FIRMWARE_MT7925 "mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin" 12 #define FIRMWARE_MT7927 "mediatek/mt7927/BT_RAM_CODE_MT6639_2_1_hdr.bin" 13 #define FIRMWARE_MT7928 "mediatek/mt7928/BT_RAM_CODE_MT7935_1_1_hdr.bin" 14 #define FIRMWARE_MT7928_CBMCU "mediatek/mt7928/CBMCU_CODE_MT7935_1_1.bin" 15 16 #define HCI_EV_WMT 0xe4 17 #define HCI_WMT_MAX_EVENT_SIZE 64 18 19 #define BTMTK_WMT_REG_WRITE 0x1 20 #define BTMTK_WMT_REG_READ 0x2 21 22 #define MT7921_BTSYS_RST 0x70002610 23 #define MT7921_BTSYS_RST_WITH_GPIO BIT(7) 24 25 #define MT7921_PINMUX_0 0x70005050 26 #define MT7921_PINMUX_1 0x70005054 27 28 #define MT7921_DLSTATUS 0x7c053c10 29 #define BT_DL_STATE BIT(1) 30 31 #define MTK_COREDUMP_SIZE (1024 * 1000) 32 #define MTK_COREDUMP_END "coredump end" 33 #define MTK_COREDUMP_END_LEN (sizeof(MTK_COREDUMP_END)) 34 #define MTK_COREDUMP_NUM 255 35 36 /* UHW CR mapping */ 37 #define MTK_BT_MISC 0x70002510 38 #define MTK_BT_SUBSYS_RST 0x70002610 39 #define MTK_UDMA_INT_STA_BT 0x74000024 40 #define MTK_UDMA_INT_STA_BT1 0x74000308 41 #define MTK_BT_WDT_STATUS 0x740003A0 42 #define MTK_EP_RST_OPT 0x74011890 43 #define MTK_EP_RST_IN_OUT_OPT 0x00010001 44 #define MTK_BT_RST_DONE 0x00000100 45 #define MTK_BT_RESET_REG_CONNV3 0x70028610 46 #define MTK_BT_READ_DEV_ID 0x70010200 47 48 /* MediaTek ISO Interface */ 49 #define MTK_ISO_IFNUM 2 50 51 enum { 52 BTMTK_WMT_PATCH_DWNLD = 0x1, 53 BTMTK_WMT_TEST = 0x2, 54 BTMTK_WMT_WAKEUP = 0x3, 55 BTMTK_WMT_HIF = 0x4, 56 BTMTK_WMT_FUNC_CTRL = 0x6, 57 BTMTK_WMT_RST = 0x7, 58 BTMTK_WMT_REGISTER = 0x8, 59 BTMTK_WMT_SEMAPHORE = 0x17, 60 BTMTK_WMT_CBMCU_DWNLD = 0x58, 61 }; 62 63 enum { 64 BTMTK_WMT_INVALID, 65 BTMTK_WMT_PATCH_UNDONE, 66 BTMTK_WMT_PATCH_PROGRESS, 67 BTMTK_WMT_PATCH_DONE, 68 BTMTK_WMT_ON_UNDONE, 69 BTMTK_WMT_ON_DONE, 70 BTMTK_WMT_ON_PROGRESS, 71 }; 72 73 /* Position of a BTMTK_WMT_PATCH_DWNLD packet within a download sequence, 74 * carried in struct btmtk_wmt_hdr's flag field. 75 */ 76 enum btmtk_wmt_pkt_flag { 77 BTMTK_WMT_PKT_START = 1, 78 BTMTK_WMT_PKT_CONTINUE = 2, 79 BTMTK_WMT_PKT_END = 3, 80 }; 81 82 struct btmtk_wmt_hdr { 83 u8 dir; 84 u8 op; 85 __le16 dlen; 86 u8 flag; 87 } __packed; 88 89 struct btmtk_hci_wmt_cmd { 90 struct btmtk_wmt_hdr hdr; 91 u8 data[]; 92 } __packed; 93 94 struct btmtk_hci_wmt_evt { 95 struct hci_event_hdr hhdr; 96 struct btmtk_wmt_hdr whdr; 97 } __packed; 98 99 struct btmtk_hci_wmt_evt_funcc { 100 struct btmtk_hci_wmt_evt hwhdr; 101 __be16 status; 102 } __packed; 103 104 struct btmtk_hci_wmt_evt_reg { 105 struct btmtk_hci_wmt_evt hwhdr; 106 u8 rsv[2]; 107 u8 num; 108 __le32 addr; 109 __le32 val; 110 } __packed; 111 112 struct btmtk_tci_sleep { 113 u8 mode; 114 __le16 duration; 115 __le16 host_duration; 116 u8 host_wakeup_pin; 117 u8 time_compensation; 118 } __packed; 119 120 struct btmtk_wakeon { 121 u8 mode; 122 u8 gpo; 123 u8 active_high; 124 __le16 enable_delay; 125 __le16 wakeup_delay; 126 } __packed; 127 128 struct btmtk_sco { 129 u8 clock_config; 130 u8 transmit_format_config; 131 u8 channel_format_config; 132 u8 channel_select_config; 133 } __packed; 134 135 struct reg_read_cmd { 136 u8 type; 137 u8 rsv; 138 u8 num; 139 __le32 addr; 140 } __packed; 141 142 struct reg_write_cmd { 143 u8 type; 144 u8 rsv; 145 u8 num; 146 __le32 addr; 147 __le32 data; 148 __le32 mask; 149 } __packed; 150 151 struct btmtk_hci_wmt_params { 152 u8 op; 153 u8 flag; 154 u16 dlen; 155 const void *data; 156 u32 *status; 157 }; 158 159 enum { 160 BTMTK_TX_WAIT_VND_EVT, 161 BTMTK_FIRMWARE_LOADED, 162 BTMTK_HW_RESET_ACTIVE, 163 BTMTK_ISOPKT_OVER_INTR, 164 BTMTK_ISOPKT_RUNNING, 165 BTMTK_FIRMWARE_DL_RETRY, 166 }; 167 168 typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); 169 170 struct btmtk_coredump_info { 171 const char *driver_name; 172 u32 fw_version; 173 u16 cnt; 174 int state; 175 }; 176 177 struct btmtk_data { 178 const char *drv_name; 179 unsigned long flags; 180 u32 dev_id; 181 btmtk_reset_sync_func_t reset_sync; 182 struct btmtk_coredump_info cd_info; 183 184 struct usb_device *udev; 185 struct usb_interface *intf; 186 struct usb_anchor *ctrl_anchor; 187 struct sk_buff *evt_skb; 188 struct usb_endpoint_descriptor *isopkt_tx_ep; 189 struct usb_endpoint_descriptor *isopkt_rx_ep; 190 struct usb_interface *isopkt_intf; 191 struct usb_anchor isopkt_anchor; 192 struct sk_buff *isopkt_skb; 193 194 /* spinlock for ISO data transmission */ 195 spinlock_t isorxlock; 196 }; 197 198 typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, 199 struct btmtk_hci_wmt_params *); 200 201 #if IS_ENABLED(CONFIG_BT_MTK) 202 203 int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); 204 205 int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, 206 wmt_cmd_sync_func_t wmt_cmd_sync, 207 u32 dev_id); 208 209 int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 210 wmt_cmd_sync_func_t wmt_cmd_sync); 211 212 void btmtk_reset_sync(struct hci_dev *hdev); 213 214 int btmtk_register_coredump(struct hci_dev *hdev, const char *name, 215 u32 fw_version); 216 217 int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb); 218 219 void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id, u32 fw_ver, 220 u32 fw_flavor); 221 222 int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id); 223 224 int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb); 225 226 struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev, struct sk_buff *skb, 227 usb_complete_t tx_complete); 228 229 int btmtk_usb_resume(struct hci_dev *hdev); 230 231 int btmtk_usb_suspend(struct hci_dev *hdev); 232 233 int btmtk_usb_setup(struct hci_dev *hdev); 234 235 int btmtk_usb_shutdown(struct hci_dev *hdev); 236 237 int btmtk_recv_event(struct hci_dev *hdev, struct sk_buff *skb); 238 #else 239 240 static inline int btmtk_set_bdaddr(struct hci_dev *hdev, 241 const bdaddr_t *bdaddr) 242 { 243 return -EOPNOTSUPP; 244 } 245 246 static inline int btmtk_setup_firmware_79xx(struct hci_dev *hdev, 247 const char *fwname, 248 wmt_cmd_sync_func_t wmt_cmd_sync, 249 u32 dev_id) 250 { 251 return -EOPNOTSUPP; 252 } 253 254 static inline int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 255 wmt_cmd_sync_func_t wmt_cmd_sync) 256 { 257 return -EOPNOTSUPP; 258 } 259 260 static inline void btmtk_reset_sync(struct hci_dev *hdev) 261 { 262 } 263 264 static inline int btmtk_register_coredump(struct hci_dev *hdev, 265 const char *name, u32 fw_version) 266 { 267 return -EOPNOTSUPP; 268 } 269 270 static inline int btmtk_process_coredump(struct hci_dev *hdev, 271 struct sk_buff *skb) 272 { 273 return -EOPNOTSUPP; 274 } 275 276 static inline void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id, 277 u32 fw_ver, u32 fw_flavor) 278 { 279 } 280 281 static inline int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id) 282 { 283 return -EOPNOTSUPP; 284 } 285 286 static inline int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb) 287 { 288 return -EOPNOTSUPP; 289 } 290 291 static inline struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev, 292 struct sk_buff *skb, 293 usb_complete_t tx_complete) 294 { 295 return ERR_PTR(-EOPNOTSUPP); 296 } 297 298 static inline int btmtk_usb_resume(struct hci_dev *hdev) 299 { 300 return -EOPNOTSUPP; 301 } 302 303 static inline int btmtk_usb_suspend(struct hci_dev *hdev) 304 { 305 return -EOPNOTSUPP; 306 } 307 308 static inline int btmtk_usb_setup(struct hci_dev *hdev) 309 { 310 return -EOPNOTSUPP; 311 } 312 313 static inline int btmtk_usb_shutdown(struct hci_dev *hdev) 314 { 315 return -EOPNOTSUPP; 316 } 317 318 static inline int btmtk_recv_event(struct hci_dev *hdev, struct sk_buff *skb) 319 { 320 return hci_recv_frame(hdev, skb); 321 } 322 #endif 323