Bluetooth Broadcom 43142 isn't working

You need to install firmware.

Distribution of Broadcom firmware is not allowed by Broadcom license. So you need to get it yourself. It is a bit complex, but there is no other legal way.

  1. Download Broadcom Windows 8 driver or FROM HERE.

    If your device is not listed in these drivers, you'll need to find a newer version of it somewhere. Broadcom removed the latest drivers from their site to make it more difficult.

    Some laptop vendors have Bluetooth drivers on their sites, but some of them are not unzippable. So it is some quest. I could download the latest Broadcom drivers from their site, but it is not there any more.

  2. Open this file by Archive Manager and find there bcbtums-win8x86-brcm.inf file. Name of the file may differ in some drivers. It can be bcbtums.inf located at Win32 or Win64 directory. It does not matter 32 or 64 bit to download.

  3. Search this file for VID_0A5C&PID_21D7. These numbers are from your lsusb output

    0a5c:21d7 Broadcom Corp. BCM43142 Bluetooth 4.0.

    Comment: Some devices are not recognized as Broadcom BT in lsusb. If you are unsure which one is your BT device, run usb-devices command, it will give more detailed information. There you can find product and vendor IDs.

    You will see some line ending with RAMUSB21D7

    Search this file for RAMUSB21D7. You will find a section there like that:

    [RAMUSB21D7.CopyList]
    bcbtums.sys
    btwampfl.sys
    BCM43142A0_001.001.011.0122.0126.hex
    

    That's what we are looking for. Name of the firmware file. BCM43142A0_001.001.011.0122.0126.hex

  4. Now extract that firmware from the same cab file.

    Then you need to convert this file from hex to hcd format.

  5. Download the tool for that

    git clone git://github.com/jessesung/hex2hcd.git
    cd hex2hcd
    make
    

    You will get hex2hcd folder in your home directory.

  6. Place the firmware file to your home folder and run

    ~/hex2hcd/hex2hcd ~/BCM43142A0_001.001.011.0122.0126.hex ~/BCM43142A0-0a5c-21d7.hcd
    

    You see that 0a5c-21d7 is id of your adapter from lsusb.

    Important: For kernels 4.2+ you call this file as BCM.hcd instead.

    ~/hex2hcd/hex2hcd ~/BCM43142A0_001.001.011.0122.0126.hex ~/BCM.hcd
    

    For kernels 4.8+ name of the file should be BCM-<VID>-<PID>.hcd, like BCM-0a5c-21d7.

    For kernel 5.0 the file name is again BCM43142A0-0a5c-21d7.hcd

    Now just copy BCM43142A0-0a5c-21d7.hcd, or another file according to the kernel version to /lib/firmware/brcm directory by

    sudo cp ~/BCM43142A0-0a5c-21d7.hcd /lib/firmware/brcm
    

    For kernels 4.2+

    sudo cp ~/BCM.hcd /lib/firmware/brcm
    

    For kernels 4.8+

    sudo cp ~/BCM-0a5c-21d7.hcd  /lib/firmware/brcm
    

    You can always check if the file name is correct by running dmesg | grep -i blue. There will be an error message if the file is not found.

    If the requested file name doesn't match the file you created, rename the hcd file.

  7. Turn your computer off and on again. Not just reboot!

    Your adapter will get firmware and bluetooth should work.

All this looks complicated, but it is Broadcom lawyers to blame for that. Most of other vendors allow to re-distribute firmware under condition that it is done accompanied with the license.

That allows Linux maintainers to include firmware in distributions.

But not in case of Broadcom. That's why it is not done an easy way.

Many people could convert all hex files to hcd and make them available. Or just add them to the linux-firmware package of Ubuntu.

But it is not legal :-((


Here is a project that aims to automate the process a bit: https://github.com/winterheart/broadcom-bt-firmware

copy the BCM to the right dir/name depending on the kernel (as described above).

On 4.8 I did not need a reboot, simply in a terminal:

sudo modprobe -r btusb
sudo modprobe btusb

dmesg | grep -i blu

should show if it is loaded. Make sure the hardware ID matched the file. It can be found with :

lsusb

which shows this on my Lenovo (only that line):

Bus 001 Device 006: ID 105b:e065 Foxconn International, Inc. BCM43142A0 Bluetooth module

I hope that helps :)


That's all what you need: https://github.com/winterheart/broadcom-bt-firmware

On this repository you can find more informations and all Broadcom wireless card drivers needed.


To be more concrete I give you the instructions I wrote for myself:

This tutorial is intended to make the wireless/bluetooth network card Broadcom Corporation BCM43142 802.11b/g/n (rev 01) (Device ID: 0a5c:216d) working on Linux systems (I tried it on Elementary OS 0.4.1 Loki, based on Ubuntu 16.04.3 LTS).

It could not work for other devices but it should not vary too much from this procedure for other Broadcom devices. The needed Broadcom drivers are on this GitHub's reposity folder in .hcd format.

  1. Enter the following command to discover which driver name is the kernel looking for when loading the drives while booting:

    dmesg | grep -i 'firmware load'
    

    Try this one if it does not find anything:

    dmesg | grep -i 'bluetooth'
    

    The result should be something like this:

    bluetooth hci0: Direct firmware load for brcm/BCM.hcd failed with error -2
    

    Explanation: in my case the kernel is looking for the file BCM.hcd under the directory /lib/firmware/brcm where the Broadcom drivers are expected to be. If the Kernel is looking for another driver name, you must rename the driver file (BCM43142A0-0a5c-216c.hcd in my case for the BCM43142 (0a5c:216d)) to the required name by the kernel.

  2. Move the renamed driver (BCM.hcd) to your home directory (/home/YourUsername/) and run the following command in order to move it to the folder the kernel is looking on while booting:

    sudo mv ~/BCM.hcd /lib/firmware/brcm
    

    You must use the corresponding driver depending on your device and rename it if requested for the kernel.

  3. Reboot your computer and it should work!* (you can enter dmesg | grep -i 'bluetooth' once again to see if the driver has been loaded)