1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2021 MediaTek Inc.
5 #include <linux/module.h>
6 #include <linux/firmware.h>
8 #include <net/bluetooth/bluetooth.h>
9 #include <net/bluetooth/hci_core.h>
15 /* It is for mt79xx download rom patch*/
16 #define MTK_FW_ROM_PATCH_HEADER_SIZE 32
17 #define MTK_FW_ROM_PATCH_GD_SIZE 64
18 #define MTK_FW_ROM_PATCH_SEC_MAP_SIZE 64
19 #define MTK_SEC_MAP_COMMON_SIZE 12
20 #define MTK_SEC_MAP_NEED_SEND_SIZE 52
22 struct btmtk_patch_header {
30 struct btmtk_global_desc {
37 struct btmtk_section_map {
56 int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname,
57 wmt_cmd_sync_func_t wmt_cmd_sync)
59 struct btmtk_hci_wmt_params wmt_params;
60 struct btmtk_global_desc *globaldesc = NULL;
61 struct btmtk_section_map *sectionmap;
62 const struct firmware *fw;
65 int err, dlen, i, status;
66 u8 flag, first_block, retry;
67 u32 section_num, dl_size, section_offset;
70 err = request_firmware(&fw, fwname, &hdev->dev);
72 bt_dev_err(hdev, "Failed to load firmware file (%d)", err);
78 globaldesc = (struct btmtk_global_desc *)(fw_ptr + MTK_FW_ROM_PATCH_HEADER_SIZE);
79 section_num = le32_to_cpu(globaldesc->section_num);
81 for (i = 0; i < section_num; i++) {
84 sectionmap = (struct btmtk_section_map *)(fw_ptr + MTK_FW_ROM_PATCH_HEADER_SIZE +
85 MTK_FW_ROM_PATCH_GD_SIZE + MTK_FW_ROM_PATCH_SEC_MAP_SIZE * i);
87 section_offset = le32_to_cpu(sectionmap->secoffset);
88 dl_size = le32_to_cpu(sectionmap->bin_info_spec.dlsize);
93 cmd[0] = 0; /* 0 means legacy dl mode. */
95 fw_ptr + MTK_FW_ROM_PATCH_HEADER_SIZE +
96 MTK_FW_ROM_PATCH_GD_SIZE +
97 MTK_FW_ROM_PATCH_SEC_MAP_SIZE * i +
98 MTK_SEC_MAP_COMMON_SIZE,
99 MTK_SEC_MAP_NEED_SEND_SIZE + 1);
101 wmt_params.op = BTMTK_WMT_PATCH_DWNLD;
102 wmt_params.status = &status;
104 wmt_params.dlen = MTK_SEC_MAP_NEED_SEND_SIZE + 1;
105 wmt_params.data = &cmd;
107 err = wmt_cmd_sync(hdev, &wmt_params);
109 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)",
114 if (status == BTMTK_WMT_PATCH_UNDONE) {
116 } else if (status == BTMTK_WMT_PATCH_PROGRESS) {
119 } else if (status == BTMTK_WMT_PATCH_DONE) {
122 bt_dev_err(hdev, "Failed wmt patch dwnld status (%d)",
129 fw_ptr += section_offset;
130 wmt_params.op = BTMTK_WMT_PATCH_DWNLD;
131 wmt_params.status = NULL;
133 while (dl_size > 0) {
134 dlen = min_t(int, 250, dl_size);
135 if (first_block == 1) {
138 } else if (dl_size - dlen <= 0) {
144 wmt_params.flag = flag;
145 wmt_params.dlen = dlen;
146 wmt_params.data = fw_ptr;
148 err = wmt_cmd_sync(hdev, &wmt_params);
150 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)",
162 /* Wait a few moments for firmware activation done */
163 usleep_range(100000, 120000);
166 release_firmware(fw);
170 EXPORT_SYMBOL_GPL(btmtk_setup_firmware_79xx);
172 int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,
173 wmt_cmd_sync_func_t wmt_cmd_sync)
175 struct btmtk_hci_wmt_params wmt_params;
176 const struct firmware *fw;
182 err = request_firmware(&fw, fwname, &hdev->dev);
184 bt_dev_err(hdev, "Failed to load firmware file (%d)", err);
188 /* Power on data RAM the firmware relies on. */
190 wmt_params.op = BTMTK_WMT_FUNC_CTRL;
192 wmt_params.dlen = sizeof(param);
193 wmt_params.data = ¶m;
194 wmt_params.status = NULL;
196 err = wmt_cmd_sync(hdev, &wmt_params);
198 bt_dev_err(hdev, "Failed to power on data RAM (%d)", err);
205 /* The size of patch header is 30 bytes, should be skip */
215 wmt_params.op = BTMTK_WMT_PATCH_DWNLD;
216 wmt_params.status = NULL;
218 while (fw_size > 0) {
219 dlen = min_t(int, 250, fw_size);
221 /* Tell device the position in sequence */
222 if (fw_size - dlen <= 0)
224 else if (fw_size < fw->size - 30)
227 wmt_params.flag = flag;
228 wmt_params.dlen = dlen;
229 wmt_params.data = fw_ptr;
231 err = wmt_cmd_sync(hdev, &wmt_params);
233 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)",
242 wmt_params.op = BTMTK_WMT_RST;
245 wmt_params.data = NULL;
246 wmt_params.status = NULL;
248 /* Activate funciton the firmware providing to */
249 err = wmt_cmd_sync(hdev, &wmt_params);
251 bt_dev_err(hdev, "Failed to send wmt rst (%d)", err);
255 /* Wait a few moments for firmware activation done */
256 usleep_range(10000, 12000);
259 release_firmware(fw);
263 EXPORT_SYMBOL_GPL(btmtk_setup_firmware);
265 int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
270 skb = __hci_cmd_sync(hdev, 0xfc1a, 6, bdaddr, HCI_INIT_TIMEOUT);
273 bt_dev_err(hdev, "changing Mediatek device address failed (%ld)",
281 EXPORT_SYMBOL_GPL(btmtk_set_bdaddr);
285 MODULE_DESCRIPTION("Bluetooth support for MediaTek devices ver " VERSION);
286 MODULE_VERSION(VERSION);
287 MODULE_LICENSE("GPL");
288 MODULE_FIRMWARE(FIRMWARE_MT7622);
289 MODULE_FIRMWARE(FIRMWARE_MT7663);
290 MODULE_FIRMWARE(FIRMWARE_MT7668);
291 MODULE_FIRMWARE(FIRMWARE_MT7961);