Skip to content

Commit b0310d6

Browse files
NeerajSanjayKaleVudentz
authored andcommitted
Bluetooth: btnxpuart: Enable flow control before checking boot signature
This enables flow control before checking for bootloader signature and deciding whether FW download is needed or not. In case of V1 bootloader chips w8987 and w8997, it is observed that if WLAN FW is downloaded first and power save is enabled in wlan core, bootloader signatures are not emitted by the BT core when the chip is put to sleep. As a result, the driver skips FW download and subsequent HCI commands get timeout errors in dmesg as shown below: [ 112.898867] Bluetooth: hci0: Opcode 0x c03 failed: -110 [ 114.914865] Bluetooth: hci0: Setting baudrate failed (-110) [ 116.930856] Bluetooth: hci0: Setting wake-up method failed (-110) By enabling the flow control, the host enables its RTS pin, and an interrupt in chip's UART peripheral causes the bootloader to wake up, enabling the bootloader signatures, which then helps in downloading the bluetooth FW file. This changes all instances of 0/1 for serdev_device_set_flow_control() to false/true. Signed-off-by: Neeraj Sanjay Kale <[email protected]> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent f419863 commit b0310d6

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

drivers/bluetooth/btnxpuart.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ static int nxp_download_firmware(struct hci_dev *hdev)
535535
nxpdev->helper_downloaded = false;
536536

537537
serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE);
538-
serdev_device_set_flow_control(nxpdev->serdev, 0);
538+
serdev_device_set_flow_control(nxpdev->serdev, false);
539539
nxpdev->current_baudrate = HCI_NXP_PRI_BAUDRATE;
540540

541541
/* Wait till FW is downloaded and CTS becomes low */
@@ -548,7 +548,7 @@ static int nxp_download_firmware(struct hci_dev *hdev)
548548
return -ETIMEDOUT;
549549
}
550550

551-
serdev_device_set_flow_control(nxpdev->serdev, 1);
551+
serdev_device_set_flow_control(nxpdev->serdev, true);
552552
err = serdev_device_wait_for_cts(nxpdev->serdev, 1, 60000);
553553
if (err < 0) {
554554
bt_dev_err(hdev, "CTS is still high. FW Download failed.");
@@ -740,7 +740,7 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct sk_buff *skb)
740740
if (nxpdev->baudrate_changed) {
741741
serdev_device_set_baudrate(nxpdev->serdev,
742742
HCI_NXP_SEC_BAUDRATE);
743-
serdev_device_set_flow_control(nxpdev->serdev, 1);
743+
serdev_device_set_flow_control(nxpdev->serdev, true);
744744
nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE;
745745
}
746746
goto free_skb;
@@ -763,7 +763,7 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct sk_buff *skb)
763763
serdev_device_wait_until_sent(nxpdev->serdev, 0);
764764
serdev_device_set_baudrate(nxpdev->serdev,
765765
HCI_NXP_SEC_BAUDRATE);
766-
serdev_device_set_flow_control(nxpdev->serdev, 1);
766+
serdev_device_set_flow_control(nxpdev->serdev, true);
767767
} else {
768768
clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state);
769769
wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q);
@@ -880,7 +880,7 @@ static int nxp_recv_fw_req_v3(struct hci_dev *hdev, struct sk_buff *skb)
880880
if (nxpdev->baudrate_changed) {
881881
serdev_device_set_baudrate(nxpdev->serdev,
882882
HCI_NXP_SEC_BAUDRATE);
883-
serdev_device_set_flow_control(nxpdev->serdev, 1);
883+
serdev_device_set_flow_control(nxpdev->serdev, true);
884884
nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE;
885885
}
886886
goto free_skb;
@@ -984,7 +984,7 @@ static int nxp_set_ind_reset(struct hci_dev *hdev, void *data)
984984
static int nxp_check_boot_sign(struct btnxpuart_dev *nxpdev)
985985
{
986986
serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE);
987-
serdev_device_set_flow_control(nxpdev->serdev, 0);
987+
serdev_device_set_flow_control(nxpdev->serdev, true);
988988
set_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state);
989989

990990
return wait_event_interruptible_timeout(nxpdev->check_boot_sign_wait_q,
@@ -1012,7 +1012,6 @@ static int nxp_setup(struct hci_dev *hdev)
10121012
clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state);
10131013
}
10141014

1015-
serdev_device_set_flow_control(nxpdev->serdev, 1);
10161015
device_property_read_u32(&nxpdev->serdev->dev, "fw-init-baudrate",
10171016
&nxpdev->fw_init_baudrate);
10181017
if (!nxpdev->fw_init_baudrate)

0 commit comments

Comments
 (0)