Commit a2e02f38 authored by Philipp Puschmann's avatar Philipp Puschmann Committed by Marcel Holtmann

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: default avatarPhilipp Puschmann <philipp.puschmann@emlix.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 98d9856a
...@@ -601,6 +601,13 @@ static int ll_setup(struct hci_uart *hu) ...@@ -601,6 +601,13 @@ static int ll_setup(struct hci_uart *hu)
serdev_device_set_flow_control(serdev, true); 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 { do {
/* Reset the Bluetooth device */ /* Reset the Bluetooth device */
gpiod_set_value_cansleep(lldev->enable_gpio, 0); gpiod_set_value_cansleep(lldev->enable_gpio, 0);
...@@ -612,6 +619,20 @@ static int ll_setup(struct hci_uart *hu) ...@@ -612,6 +619,20 @@ static int ll_setup(struct hci_uart *hu)
return err; 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); err = download_firmware(lldev);
if (!err) if (!err)
break; break;
...@@ -636,25 +657,7 @@ static int ll_setup(struct hci_uart *hu) ...@@ -636,25 +657,7 @@ static int ll_setup(struct hci_uart *hu)
} }
/* Operational speed if any */ /* 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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment