diff options
author | Philipp Puschmann <philipp.puschmann@emlix.com> | 2019-07-02 10:13:37 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2019-07-06 06:29:25 -0400 |
commit | a2e02f38eff84f199c8e32359eb213f81f270047 (patch) | |
tree | 3623b0624f216adc9e513bee576a945e0a01029c /drivers/bluetooth | |
parent | 98d9856a759f5cc8032efeb5c87badc1c652d430 (diff) |
Bluetooth: hci_ll: set operational frequency earlier
Uploading the firmware needs quite a few seconds if done at 115200 kbps. So set
the operational frequency, usually 3 MHz, before uploading the firmware.
I have successfully tested this with a wl1837mod.
Signed-off-by: Philipp Puschmann <philipp.puschmann@emlix.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/hci_ll.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c index c04f5f9e1ed0..cbd7bc539d5e 100644 --- a/drivers/bluetooth/hci_ll.c +++ b/drivers/bluetooth/hci_ll.c | |||
@@ -601,6 +601,13 @@ static int ll_setup(struct hci_uart *hu) | |||
601 | 601 | ||
602 | serdev_device_set_flow_control(serdev, true); | 602 | serdev_device_set_flow_control(serdev, true); |
603 | 603 | ||
604 | if (hu->oper_speed) | ||
605 | speed = hu->oper_speed; | ||
606 | else if (hu->proto->oper_speed) | ||
607 | speed = hu->proto->oper_speed; | ||
608 | else | ||
609 | speed = 0; | ||
610 | |||
604 | do { | 611 | do { |
605 | /* Reset the Bluetooth device */ | 612 | /* Reset the Bluetooth device */ |
606 | gpiod_set_value_cansleep(lldev->enable_gpio, 0); | 613 | gpiod_set_value_cansleep(lldev->enable_gpio, 0); |
@@ -612,6 +619,20 @@ static int ll_setup(struct hci_uart *hu) | |||
612 | return err; | 619 | return err; |
613 | } | 620 | } |
614 | 621 | ||
622 | if (speed) { | ||
623 | __le32 speed_le = cpu_to_le32(speed); | ||
624 | struct sk_buff *skb; | ||
625 | |||
626 | skb = __hci_cmd_sync(hu->hdev, | ||
627 | HCI_VS_UPDATE_UART_HCI_BAUDRATE, | ||
628 | sizeof(speed_le), &speed_le, | ||
629 | HCI_INIT_TIMEOUT); | ||
630 | if (!IS_ERR(skb)) { | ||
631 | kfree_skb(skb); | ||
632 | serdev_device_set_baudrate(serdev, speed); | ||
633 | } | ||
634 | } | ||
635 | |||
615 | err = download_firmware(lldev); | 636 | err = download_firmware(lldev); |
616 | if (!err) | 637 | if (!err) |
617 | break; | 638 | break; |
@@ -636,25 +657,7 @@ static int ll_setup(struct hci_uart *hu) | |||
636 | } | 657 | } |
637 | 658 | ||
638 | /* Operational speed if any */ | 659 | /* Operational speed if any */ |
639 | if (hu->oper_speed) | ||
640 | speed = hu->oper_speed; | ||
641 | else if (hu->proto->oper_speed) | ||
642 | speed = hu->proto->oper_speed; | ||
643 | else | ||
644 | speed = 0; | ||
645 | |||
646 | if (speed) { | ||
647 | __le32 speed_le = cpu_to_le32(speed); | ||
648 | struct sk_buff *skb; | ||
649 | 660 | ||
650 | skb = __hci_cmd_sync(hu->hdev, HCI_VS_UPDATE_UART_HCI_BAUDRATE, | ||
651 | sizeof(speed_le), &speed_le, | ||
652 | HCI_INIT_TIMEOUT); | ||
653 | if (!IS_ERR(skb)) { | ||
654 | kfree_skb(skb); | ||
655 | serdev_device_set_baudrate(serdev, speed); | ||
656 | } | ||
657 | } | ||
658 | 661 | ||
659 | return 0; | 662 | return 0; |
660 | } | 663 | } |