]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Bluetooth: hci_ll: set operational frequency earlier
authorPhilipp Puschmann <philipp.puschmann@emlix.com>
Tue, 2 Jul 2019 14:13:37 +0000 (16:13 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 6 Jul 2019 10:29:25 +0000 (12:29 +0200)
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>
drivers/bluetooth/hci_ll.c

index c04f5f9e1ed0137cbc831ec20942cfbabee608c5..cbd7bc539d5e5c9ffff7ae885eb91bc888c72f10 100644 (file)
@@ -601,6 +601,13 @@ static int ll_setup(struct hci_uart *hu)
 
        serdev_device_set_flow_control(serdev, true);
 
+       if (hu->oper_speed)
+               speed = hu->oper_speed;
+       else if (hu->proto->oper_speed)
+               speed = hu->proto->oper_speed;
+       else
+               speed = 0;
+
        do {
                /* Reset the Bluetooth device */
                gpiod_set_value_cansleep(lldev->enable_gpio, 0);
@@ -612,6 +619,20 @@ static int ll_setup(struct hci_uart *hu)
                        return err;
                }
 
+               if (speed) {
+                       __le32 speed_le = cpu_to_le32(speed);
+                       struct sk_buff *skb;
+
+                       skb = __hci_cmd_sync(hu->hdev,
+                                            HCI_VS_UPDATE_UART_HCI_BAUDRATE,
+                                            sizeof(speed_le), &speed_le,
+                                            HCI_INIT_TIMEOUT);
+                       if (!IS_ERR(skb)) {
+                               kfree_skb(skb);
+                               serdev_device_set_baudrate(serdev, speed);
+                       }
+               }
+
                err = download_firmware(lldev);
                if (!err)
                        break;
@@ -636,25 +657,7 @@ static int ll_setup(struct hci_uart *hu)
        }
 
        /* Operational speed if any */
-       if (hu->oper_speed)
-               speed = hu->oper_speed;
-       else if (hu->proto->oper_speed)
-               speed = hu->proto->oper_speed;
-       else
-               speed = 0;
-
-       if (speed) {
-               __le32 speed_le = cpu_to_le32(speed);
-               struct sk_buff *skb;
 
-               skb = __hci_cmd_sync(hu->hdev, HCI_VS_UPDATE_UART_HCI_BAUDRATE,
-                                    sizeof(speed_le), &speed_le,
-                                    HCI_INIT_TIMEOUT);
-               if (!IS_ERR(skb)) {
-                       kfree_skb(skb);
-                       serdev_device_set_baudrate(serdev, speed);
-               }
-       }
 
        return 0;
 }