Created
February 24, 2019 20:08
-
-
Save lategoodbye/e72d28f5a6dfa32a03661897a85f348f to your computer and use it in GitHub Desktop.
Enable Bluetooth on Tinker Board V2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 92fd5de0f067b5a347828eaaff098e31fd98f0a9 Mon Sep 17 00:00:00 2001 | |
From: Vasily Khoruzhick <anarsoul@gmail.com> | |
Date: Fri, 18 Jan 2019 09:02:25 -0800 | |
Subject: [PATCH V2 1/4] Bluetooth: Add new quirk for broken local ext features | |
max_page | |
Some adapters (e.g. RTL8723CS) advertise that they have more than | |
2 pages for local ext features, but they don't support any features | |
declared in these pages. RTL8723CS reports max_page = 2 and declares | |
support for sync train and secure connection, but it responds with | |
either garbage or with error in status on corresponding commands. | |
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> | |
--- | |
include/net/bluetooth/hci.h | 7 +++++++ | |
net/bluetooth/hci_event.c | 4 +++- | |
2 files changed, 10 insertions(+), 1 deletion(-) | |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h | |
index c36dc1e..d7849f1 100644 | |
--- a/include/net/bluetooth/hci.h | |
+++ b/include/net/bluetooth/hci.h | |
@@ -192,6 +192,13 @@ enum { | |
* | |
*/ | |
HCI_QUIRK_NON_PERSISTENT_SETUP, | |
+ | |
+ /* When this quirk is set, max_page for local extended features | |
+ * is set to 1, even if controller reports higher number. Some | |
+ * controllers (e.g. RTL8723CS) report more pages, but they | |
+ * don't actually support features declared there. | |
+ */ | |
+ HCI_QUIRK_BROKEN_LOCAL_EXT_FTR_MAX_PAGE, | |
}; | |
/* HCI device flags */ | |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c | |
index ac2826c..9c59af7 100644 | |
--- a/net/bluetooth/hci_event.c | |
+++ b/net/bluetooth/hci_event.c | |
@@ -639,7 +639,9 @@ static void hci_cc_read_local_ext_features(struct hci_dev *hdev, | |
if (rp->status) | |
return; | |
- if (hdev->max_page < rp->max_page) | |
+ if (!test_bit(HCI_QUIRK_BROKEN_LOCAL_EXT_FTR_MAX_PAGE, | |
+ &hdev->quirks) && | |
+ hdev->max_page < rp->max_page) | |
hdev->max_page = rp->max_page; | |
if (rp->page < HCI_MAX_PAGES) | |
-- | |
2.7.4 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 88dee8d63a65a189354d6faae1494f20465c9f80 Mon Sep 17 00:00:00 2001 | |
From: Vasily Khoruzhick <anarsoul@gmail.com> | |
Date: Sun, 24 Feb 2019 13:48:42 +0100 | |
Subject: [PATCH V2 2/4] dt-bindings: net: bluetooth: Add rtl8723bs-bluetooth | |
Add binding document for bluetooth part of RTL8723BS/RTL8723CS | |
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> | |
--- | |
.../bindings/net/rtl8723bs-bluetooth.txt | 34 ++++++++++++++++++++++ | |
1 file changed, 34 insertions(+) | |
create mode 100644 Documentation/devicetree/bindings/net/rtl8723bs-bluetooth.txt | |
diff --git a/Documentation/devicetree/bindings/net/rtl8723bs-bluetooth.txt b/Documentation/devicetree/bindings/net/rtl8723bs-bluetooth.txt | |
new file mode 100644 | |
index 0000000..4bfa523 | |
--- /dev/null | |
+++ b/Documentation/devicetree/bindings/net/rtl8723bs-bluetooth.txt | |
@@ -0,0 +1,34 @@ | |
+RTL8723BS/RTL8723CS Bluetooth | |
+--------------------- | |
+ | |
+RTL8723CS/RTL8723CS is WiFi + BT chip. WiFi part is connected over SDIO, while | |
+BT is connected over serial. It speaks H5 protocol with few extra commands | |
+to upload firmware and change module speed. | |
+ | |
+Required properties: | |
+ | |
+ - compatible: should be one of the following: | |
+ * "realtek,rtl8723bs-bt" | |
+ * "realtek,rtl8723cs-bt" | |
+Optional properties: | |
+ | |
+ - device-wake-gpios: GPIO specifier, used to wakeup the BT module (active high) | |
+ - enable-gpios: GPIO specifier, used to enable the BT module (active high) | |
+ - host-wake-gpios: GPIO specifier, used to wakeup the host processor (active high) | |
+ - firmware-postfix: firmware postfix to be used for firmware config | |
+ | |
+Example: | |
+ | |
+&uart1 { | |
+ pinctrl-names = "default"; | |
+ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; | |
+ status = "okay"; | |
+ | |
+ bluetooth { | |
+ compatible = "realtek,rtl8723bs-bt"; | |
+ enable-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ | |
+ device-wake-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */ | |
+ host-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */ | |
+ firmware-postfix="pine64"; | |
+ }; | |
+}; | |
-- | |
2.7.4 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From fa61c70124413a55dedd00441b74d0690ae06ae7 Mon Sep 17 00:00:00 2001 | |
From: Vasily Khoruzhick <anarsoul@gmail.com> | |
Date: Sun, 24 Feb 2019 13:55:55 +0100 | |
Subject: [PATCH V2 3/4] Bluetooth: hci_h5: Add support for binding RTL8723BS with | |
device tree | |
RTL8723BS is often used in ARM boards, so add ability to bind it | |
using device tree. | |
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> | |
--- | |
drivers/bluetooth/Kconfig | 2 +- | |
drivers/bluetooth/hci_h5.c | 20 ++++++++++++++++++++ | |
2 files changed, 21 insertions(+), 1 deletion(-) | |
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig | |
index 7b2e76e..8392add 100644 | |
--- a/drivers/bluetooth/Kconfig | |
+++ b/drivers/bluetooth/Kconfig | |
@@ -200,7 +200,7 @@ config BT_HCIUART_RTL | |
depends on BT_HCIUART | |
depends on BT_HCIUART_SERDEV | |
depends on GPIOLIB | |
- depends on ACPI | |
+ depends on (!ACPI || SERIAL_DEV_CTRL_TTYPORT) | |
select BT_HCIUART_3WIRE | |
select BT_RTL | |
help | |
diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c | |
index 069d1c8..7ce2d07 100644 | |
--- a/drivers/bluetooth/hci_h5.c | |
+++ b/drivers/bluetooth/hci_h5.c | |
@@ -26,6 +26,7 @@ | |
#include <linux/gpio/consumer.h> | |
#include <linux/kernel.h> | |
#include <linux/mod_devicetable.h> | |
+#include <linux/of_device.h> | |
#include <linux/serdev.h> | |
#include <linux/skbuff.h> | |
@@ -822,6 +823,11 @@ static int h5_serdev_probe(struct serdev_device *serdev) | |
if (h5->vnd->acpi_gpio_map) | |
devm_acpi_dev_add_driver_gpios(dev, | |
h5->vnd->acpi_gpio_map); | |
+ } else { | |
+ h5->vnd = (const struct h5_vnd *) | |
+ of_device_get_match_data(&serdev->dev); | |
+ of_property_read_string(serdev->dev.of_node, | |
+ "firmware-postfix", &h5->id); | |
} | |
h5->enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_LOW); | |
@@ -1015,12 +1021,26 @@ static const struct dev_pm_ops h5_serdev_pm_ops = { | |
SET_SYSTEM_SLEEP_PM_OPS(h5_serdev_suspend, h5_serdev_resume) | |
}; | |
+static struct h5_vnd rtl8723_of_vnd = { | |
+ .setup = h5_btrtl_setup, | |
+ .open = h5_btrtl_open, | |
+ .close = h5_btrtl_close, | |
+}; | |
+ | |
+static const struct of_device_id h5_of_match[] = { | |
+ { .compatible = "realtek,rtl8723bs-bt", .data = &rtl8723_of_vnd }, | |
+ { .compatible = "realtek,rtl8723cs-bt", .data = &rtl8723_of_vnd }, | |
+ { /* sentinel */ }, | |
+}; | |
+MODULE_DEVICE_TABLE(of, h5_of_match); | |
+ | |
static struct serdev_device_driver h5_serdev_driver = { | |
.probe = h5_serdev_probe, | |
.remove = h5_serdev_remove, | |
.driver = { | |
.name = "hci_uart_h5", | |
.acpi_match_table = ACPI_PTR(h5_acpi_match), | |
+ .of_match_table = of_match_ptr(h5_of_match), | |
.pm = &h5_serdev_pm_ops, | |
}, | |
}; | |
-- | |
2.7.4 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From ac73eb79b6ee4a44041c3a0a1d0e52b6dc7f3cfa Mon Sep 17 00:00:00 2001 | |
From: Vasily Khoruzhick <anarsoul@gmail.com> | |
Date: Fri, 18 Jan 2019 09:02:29 -0800 | |
Subject: [PATCH V2 4/4] Bluetooth: btrtl: add support for the RTL8723CS | |
The Realtek RTL8723CS is SDIO WiFi chip. It also contains a Bluetooth | |
module which is connected via UART to the host. | |
It shares lmp subversion with 8703B, so Realtek's userspace | |
initialization tool (rtk_hciattach) differentiates varieties of RTL8723CS | |
(CG, VF, XX) with RTL8703B using vendor's command to read chip type. | |
Also this chip declares support for some features it doesn't support | |
so add a quirk to indicate that these features are broken. | |
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> | |
--- | |
drivers/bluetooth/btrtl.c | 128 +++++++++++++++++++++++++++++++++++++++++++-- | |
drivers/bluetooth/btrtl.h | 12 +++++ | |
drivers/bluetooth/hci_h5.c | 4 ++ | |
3 files changed, 141 insertions(+), 3 deletions(-) | |
diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c | |
index c91bba0..6110d50 100644 | |
--- a/drivers/bluetooth/btrtl.c | |
+++ b/drivers/bluetooth/btrtl.c | |
@@ -27,8 +27,12 @@ | |
#define VERSION "0.1" | |
+#define RTL_CHIP_8723CS_CG 3 | |
+#define RTL_CHIP_8723CS_VF 4 | |
+#define RTL_CHIP_8723CS_XX 5 | |
#define RTL_EPATCH_SIGNATURE "Realtech" | |
#define RTL_ROM_LMP_3499 0x3499 | |
+#define RTL_ROM_LMP_8703B 0x8703 | |
#define RTL_ROM_LMP_8723A 0x1200 | |
#define RTL_ROM_LMP_8723B 0x8723 | |
#define RTL_ROM_LMP_8821A 0x8821 | |
@@ -40,6 +44,7 @@ | |
#define IC_MATCH_FL_HCIREV (1 << 1) | |
#define IC_MATCH_FL_HCIVER (1 << 2) | |
#define IC_MATCH_FL_HCIBUS (1 << 3) | |
+#define IC_MATCH_FL_CHIP_TYPE (1 << 4) | |
#define IC_INFO(lmps, hcir) \ | |
.match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV, \ | |
.lmp_subver = (lmps), \ | |
@@ -51,6 +56,7 @@ struct id_table { | |
__u16 hci_rev; | |
__u8 hci_ver; | |
__u8 hci_bus; | |
+ __u8 chip_type; | |
bool config_needed; | |
bool has_rom_version; | |
char *fw_name; | |
@@ -98,6 +104,39 @@ static const struct id_table ic_id_table[] = { | |
.fw_name = "rtl_bt/rtl8723b_fw.bin", | |
.cfg_name = "rtl_bt/rtl8723b_config" }, | |
+ /* 8723CS-CG */ | |
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE | | |
+ IC_MATCH_FL_HCIBUS, | |
+ .lmp_subver = RTL_ROM_LMP_8703B, | |
+ .chip_type = RTL_CHIP_8723CS_CG, | |
+ .hci_bus = HCI_UART, | |
+ .config_needed = true, | |
+ .has_rom_version = true, | |
+ .fw_name = "rtl_bt/rtl8723cs_cg_fw.bin", | |
+ .cfg_name = "rtl_bt/rtl8723cs_cg_config" }, | |
+ | |
+ /* 8723CS-VF */ | |
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE | | |
+ IC_MATCH_FL_HCIBUS, | |
+ .lmp_subver = RTL_ROM_LMP_8703B, | |
+ .chip_type = RTL_CHIP_8723CS_VF, | |
+ .hci_bus = HCI_UART, | |
+ .config_needed = true, | |
+ .has_rom_version = true, | |
+ .fw_name = "rtl_bt/rtl8723cs_vf_fw.bin", | |
+ .cfg_name = "rtl_bt/rtl8723cs_vf_config" }, | |
+ | |
+ /* 8723CS-XX */ | |
+ { .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_CHIP_TYPE | | |
+ IC_MATCH_FL_HCIBUS, | |
+ .lmp_subver = RTL_ROM_LMP_8703B, | |
+ .chip_type = RTL_CHIP_8723CS_XX, | |
+ .hci_bus = HCI_UART, | |
+ .config_needed = true, | |
+ .has_rom_version = true, | |
+ .fw_name = "rtl_bt/rtl8723cs_xx_fw.bin", | |
+ .cfg_name = "rtl_bt/rtl8723cs_xx_config" }, | |
+ | |
/* 8723D */ | |
{ IC_INFO(RTL_ROM_LMP_8723B, 0xd), | |
.config_needed = true, | |
@@ -154,7 +193,8 @@ static const struct id_table ic_id_table[] = { | |
}; | |
static const struct id_table *btrtl_match_ic(u16 lmp_subver, u16 hci_rev, | |
- u8 hci_ver, u8 hci_bus) | |
+ u8 hci_ver, u8 hci_bus, | |
+ u8 chip_type) | |
{ | |
int i; | |
@@ -171,6 +211,9 @@ static const struct id_table *btrtl_match_ic(u16 lmp_subver, u16 hci_rev, | |
if ((ic_id_table[i].match_flags & IC_MATCH_FL_HCIBUS) && | |
(ic_id_table[i].hci_bus != hci_bus)) | |
continue; | |
+ if ((ic_id_table[i].match_flags & IC_MATCH_FL_CHIP_TYPE) && | |
+ (ic_id_table[i].chip_type != chip_type)) | |
+ continue; | |
break; | |
} | |
@@ -232,6 +275,7 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev, | |
{ RTL_ROM_LMP_8723B, 1 }, | |
{ RTL_ROM_LMP_8821A, 2 }, | |
{ RTL_ROM_LMP_8761A, 3 }, | |
+ { RTL_ROM_LMP_8703B, 7 }, | |
{ RTL_ROM_LMP_8822B, 8 }, | |
{ RTL_ROM_LMP_8723B, 9 }, /* 8723D */ | |
{ RTL_ROM_LMP_8821A, 10 }, /* 8821C */ | |
@@ -507,6 +551,48 @@ static struct sk_buff *btrtl_read_local_version(struct hci_dev *hdev) | |
return skb; | |
} | |
+static bool rtl_has_chip_type(u16 lmp_subver) | |
+{ | |
+ switch (lmp_subver) { | |
+ case RTL_ROM_LMP_8703B: | |
+ return true; | |
+ default: | |
+ break; | |
+ } | |
+ | |
+ return false; | |
+} | |
+ | |
+static int rtl_read_chip_type(struct hci_dev *hdev, u8 *type) | |
+{ | |
+ struct rtl_chip_type_evt *chip_type; | |
+ struct sk_buff *skb; | |
+ const unsigned char cmd_buf[] = {0x00, 0x94, 0xa0, 0x00, 0xb0}; | |
+ | |
+ /* Read RTL chip type command */ | |
+ skb = __hci_cmd_sync(hdev, 0xfc61, 5, cmd_buf, HCI_INIT_TIMEOUT); | |
+ if (IS_ERR(skb)) { | |
+ rtl_dev_err(hdev, "Read chip type failed (%ld)", | |
+ PTR_ERR(skb)); | |
+ return PTR_ERR(skb); | |
+ } | |
+ | |
+ if (skb->len != sizeof(*chip_type)) { | |
+ rtl_dev_err(hdev, "RTL chip type event length mismatch"); | |
+ kfree_skb(skb); | |
+ return -EIO; | |
+ } | |
+ | |
+ chip_type = (struct rtl_chip_type_evt *)skb->data; | |
+ rtl_dev_info(hdev, "chip_type status=%x type=%x", | |
+ chip_type->status, chip_type->type); | |
+ | |
+ *type = chip_type->type & 0x0f; | |
+ | |
+ kfree_skb(skb); | |
+ return 0; | |
+} | |
+ | |
void btrtl_free(struct btrtl_device_info *btrtl_dev) | |
{ | |
kfree(btrtl_dev->fw_data); | |
@@ -523,7 +609,7 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, | |
struct hci_rp_read_local_version *resp; | |
char cfg_name[40]; | |
u16 hci_rev, lmp_subver; | |
- u8 hci_ver; | |
+ u8 hci_ver, chip_type = 0; | |
int ret; | |
btrtl_dev = kzalloc(sizeof(*btrtl_dev), GFP_KERNEL); | |
@@ -548,8 +634,14 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev, | |
lmp_subver = le16_to_cpu(resp->lmp_subver); | |
kfree_skb(skb); | |
+ if (rtl_has_chip_type(lmp_subver)) { | |
+ ret = rtl_read_chip_type(hdev, &chip_type); | |
+ if (ret) | |
+ goto err_free; | |
+ } | |
+ | |
btrtl_dev->ic_info = btrtl_match_ic(lmp_subver, hci_rev, hci_ver, | |
- hdev->bus); | |
+ hdev->bus, chip_type); | |
if (!btrtl_dev->ic_info) { | |
rtl_dev_info(hdev, "rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x", | |
@@ -622,6 +714,7 @@ int btrtl_download_firmware(struct hci_dev *hdev, | |
case RTL_ROM_LMP_8821A: | |
case RTL_ROM_LMP_8761A: | |
case RTL_ROM_LMP_8822B: | |
+ case RTL_ROM_LMP_8703B: | |
return btrtl_setup_rtl8723b(hdev, btrtl_dev); | |
default: | |
rtl_dev_info(hdev, "rtl: assuming no firmware upload needed\n"); | |
@@ -640,7 +733,12 @@ int btrtl_setup_realtek(struct hci_dev *hdev) | |
return PTR_ERR(btrtl_dev); | |
ret = btrtl_download_firmware(hdev, btrtl_dev); | |
+ if (ret) | |
+ goto out_free; | |
+ btrtl_apply_quirks(hdev, btrtl_dev); | |
+ | |
+out_free: | |
btrtl_free(btrtl_dev); | |
return ret; | |
@@ -755,6 +853,24 @@ int btrtl_get_uart_settings(struct hci_dev *hdev, | |
} | |
EXPORT_SYMBOL_GPL(btrtl_get_uart_settings); | |
+void btrtl_apply_quirks(struct hci_dev *hdev, | |
+ struct btrtl_device_info *btrtl_dev) | |
+{ | |
+ switch (btrtl_dev->ic_info->lmp_subver) { | |
+ case RTL_ROM_LMP_8703B: | |
+ /* 8723CS reports two pages for local ext features, | |
+ * but it doesn't support any features from page 2 - | |
+ * it either responds with garbage or with error status | |
+ */ | |
+ set_bit(HCI_QUIRK_BROKEN_LOCAL_EXT_FTR_MAX_PAGE, | |
+ &hdev->quirks); | |
+ break; | |
+ default: | |
+ break; | |
+ } | |
+} | |
+EXPORT_SYMBOL_GPL(btrtl_apply_quirks); | |
+ | |
MODULE_AUTHOR("Daniel Drake <drake@endlessm.com>"); | |
MODULE_DESCRIPTION("Bluetooth support for Realtek devices ver " VERSION); | |
MODULE_VERSION(VERSION); | |
@@ -764,6 +880,12 @@ MODULE_FIRMWARE("rtl_bt/rtl8723b_fw.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8723b_config.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8723bs_fw.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8723bs_config.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_cg_fw.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_cg_config.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_fw.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_vf_config.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_fw.bin"); | |
+MODULE_FIRMWARE("rtl_bt/rtl8723cs_xx_config.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8723ds_fw.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8723ds_config.bin"); | |
MODULE_FIRMWARE("rtl_bt/rtl8761a_fw.bin"); | |
diff --git a/drivers/bluetooth/btrtl.h b/drivers/bluetooth/btrtl.h | |
index f5e36f3..db4e4a1 100644 | |
--- a/drivers/bluetooth/btrtl.h | |
+++ b/drivers/bluetooth/btrtl.h | |
@@ -24,6 +24,11 @@ | |
struct btrtl_device_info; | |
+struct rtl_chip_type_evt { | |
+ __u8 status; | |
+ __u8 type; | |
+} __packed; | |
+ | |
struct rtl_download_cmd { | |
__u8 index; | |
__u8 data[RTL_FRAG_LEN]; | |
@@ -69,6 +74,8 @@ int btrtl_get_uart_settings(struct hci_dev *hdev, | |
struct btrtl_device_info *btrtl_dev, | |
unsigned int *controller_baudrate, | |
u32 *device_baudrate, bool *flow_control); | |
+void btrtl_apply_quirks(struct hci_dev *hdev, | |
+ struct btrtl_device_info *btrtl_dev); | |
#else | |
@@ -100,6 +107,11 @@ static inline int btrtl_get_uart_settings(struct hci_dev *hdev, | |
bool *flow_control) | |
{ | |
return -ENOENT; | |
+ | |
+static inline void btrtl_apply_quirks(struct hci_dev *hdev, | |
+ struct btrtl_device_info *btrtl_dev) | |
+{ | |
+} | |
} | |
#endif | |
diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c | |
index 7ce2d07..0e7d406 100644 | |
--- a/drivers/bluetooth/hci_h5.c | |
+++ b/drivers/bluetooth/hci_h5.c | |
@@ -911,6 +911,10 @@ static int h5_btrtl_setup(struct h5 *h5) | |
err = btrtl_download_firmware(h5->hu->hdev, btrtl_dev); | |
/* Give the device some time before the hci-core sends it a reset */ | |
usleep_range(10000, 20000); | |
+ if (err) | |
+ goto out_free; | |
+ | |
+ btrtl_apply_quirks(h5->hu->hdev, btrtl_dev); | |
out_free: | |
btrtl_free(btrtl_dev); | |
-- | |
2.7.4 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment