| From d99d0f6c0a189ca763d6c7c7fc6c83f46233412b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 19 Jun 2020 19:52:01 +0000 |
| Subject: Bluetooth: btusb: fix up firmware download sequence |
| |
| From: Sean Wang <sean.wang@mediatek.com> |
| |
| [ Upstream commit f645125711c80f9651e4a57403d799070c6ad13b ] |
| |
| Data RAM on the device have to be powered on before starting to download |
| the firmware. |
| |
| Fixes: a1c49c434e15 ("Bluetooth: btusb: Add protocol support for MediaTek MT7668U USB devices") |
| Co-developed-by: Mark Chen <Mark-YW.Chen@mediatek.com> |
| Signed-off-by: Mark Chen <Mark-YW.Chen@mediatek.com> |
| Signed-off-by: Sean Wang <sean.wang@mediatek.com> |
| Signed-off-by: Marcel Holtmann <marcel@holtmann.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/bluetooth/btusb.c | 16 +++++++++++++++- |
| 1 file changed, 15 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
| index 3d9313c746f39..4085387f13cfb 100644 |
| --- a/drivers/bluetooth/btusb.c |
| +++ b/drivers/bluetooth/btusb.c |
| @@ -2826,7 +2826,7 @@ static int btusb_mtk_setup_firmware(struct hci_dev *hdev, const char *fwname) |
| const u8 *fw_ptr; |
| size_t fw_size; |
| int err, dlen; |
| - u8 flag; |
| + u8 flag, param; |
| |
| err = request_firmware(&fw, fwname, &hdev->dev); |
| if (err < 0) { |
| @@ -2834,6 +2834,20 @@ static int btusb_mtk_setup_firmware(struct hci_dev *hdev, const char *fwname) |
| return err; |
| } |
| |
| + /* Power on data RAM the firmware relies on. */ |
| + param = 1; |
| + wmt_params.op = BTMTK_WMT_FUNC_CTRL; |
| + wmt_params.flag = 3; |
| + wmt_params.dlen = sizeof(param); |
| + wmt_params.data = ¶m; |
| + wmt_params.status = NULL; |
| + |
| + err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params); |
| + if (err < 0) { |
| + bt_dev_err(hdev, "Failed to power on data RAM (%d)", err); |
| + return err; |
| + } |
| + |
| fw_ptr = fw->data; |
| fw_size = fw->size; |
| |
| -- |
| 2.25.1 |
| |