Bluetooth: btqca: Add a short delay before downloading the NVM [Linux 4.14.143]

This Linux kernel change "Bluetooth: btqca: Add a short delay before downloading the NVM" is included in the Linux 4.14.143 release. This change is authored by Matthias Kaehlcke <mka [at]> on Tue Jul 9 15:44:50 2019 -0700. The commit for this change in Linux stable tree is a8ef54b (patch) which is from upstream commit 8059ba0. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 8059ba0.

Bluetooth: btqca: Add a short delay before downloading the NVM

[ Upstream commit 8059ba0bd0e4694e51c2ee6438a77b325f06c0d5 ]

On WCN3990 downloading the NVM sometimes fails with a "TLV response
size mismatch" error:

[  174.949955] Bluetooth: btqca.c:qca_download_firmware() hci0: QCA Downloading qca/crnv21.bin
[  174.958718] Bluetooth: btqca.c:qca_tlv_send_segment() hci0: QCA TLV response size mismatch

It seems the controller needs a short time after downloading the
firmware before it is ready for the NVM. A delay as short as 1 ms
seems sufficient, make it 10 ms just in case. No event is received
during the delay, hence we don't just silently drop an extra event.

Signed-off-by: Matthias Kaehlcke <>
Signed-off-by: Marcel Holtmann <>
Signed-off-by: Sasha Levin <>

There are 3 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/bluetooth/btqca.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
index 0bbdfce..a48a61f 100644
--- a/drivers/bluetooth/btqca.c
+++ b/drivers/bluetooth/btqca.c
@@ -363,6 +363,9 @@ int qca_uart_setup_rome(struct hci_dev *hdev, uint8_t baudrate)
        return err;

+   /* Give the controller some time to get ready to receive the NVM */
+   msleep(10);
    /* Download NVM configuration */
    config.type = TLV_TYPE_NVM;
    snprintf(config.fwname, sizeof(config.fwname), "qca/nvm_%08x.bin",

Leave a Reply

Your email address will not be published. Required fields are marked *