Adding support for RTL 8851BE Bluetooth Devices

2026-02-17

linux

Adding support for RTL 8851BE Bluetooth Devices

In 2025, I switched to daily-driving Linux on my ASUS Vivobook 14 because my Windows install died (it no longer recognised my SSD) right before my promotional examinations. However, the Bluetooth hasn’t been working since then despite the fixes I tried, and I resorted to using my phone if I ever needed Bluetooth to connect my headphones.

In December, I finally got the motivation to fix the issue.

Debugging

At first, I assumed it was simply an issue with outdated or incompatible bluez / bluetoothctl. I ran various checks to see if bluetooth was active, but show or scan on in bluetoothctl didn’t seem to return anything. I tried booting Ubuntu from a live USB to check if bluetooth was working there, but it wasn’t. This meant that the issue wasn’t specific to my EndeavourOS install.

Finding the issue

After some searching, I ran lsusb and identified my Bluetooth USB device as Bus 001 Device 004: ID 0489:e112 Foxconn / Hon Hai Bluetooth Radio. Apparently, the device isn’t being recognised by the bluetooth driver (btusb). Eventually, I found this pull request on the CachyOS repo, which suggested that adding the device IDs in drivers/bluetooth/btusb.c adds Bluetooth support for the PRIME B650M-A AX6 II motherboard,which happens to use the same RTL8851BE Bluetooth controller.

Subsequently, I updated my own 6.12.63-1-lts kernel on my EndeavourOS install and Bluetooth worked again!

Contributing to the kernel

While this was a rather trivial change, I wanted to push this to the kernel because it would definitely save time debugging for others who are using the same Bluetooth adapter.

By following this guide, I created a .patch file which I submitted using git send-email to the maintainers. The original patch submission can be found here.

After 2 month-long wait, the addition was finally accepted by maintainer Sasha Levin:

### Conclusion
This is a textbook stable backport candidate: a trivial device ID
addition to an existing driver that enables hardware that otherwise
doesn't work at all. It's obviously correct, fixes a real problem
(Bluetooth completely broken), is tiny in scope, and carries virtually
no regression risk.

**YES**

 drivers/bluetooth/btusb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 646de80c7e7be..de9e484efef71 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -521,6 +521,8 @@ static const struct usb_device_id quirks_table[] = {
        { USB_DEVICE(0x0bda, 0xb850), .driver_info = BTUSB_REALTEK },
        { USB_DEVICE(0x13d3, 0x3600), .driver_info = BTUSB_REALTEK },
        { USB_DEVICE(0x13d3, 0x3601), .driver_info = BTUSB_REALTEK },
+       { USB_DEVICE(0x0489, 0xe112), .driver_info = BTUSB_REALTEK |
+                                                    BTUSB_WIDEBAND_SPEECH },

        /* Realtek 8851BU Bluetooth devices */
        { USB_DEVICE(0x3625, 0x010b), .driver_info = BTUSB_REALTEK |

Interestingly, they used an LLM to generate explanations for the patch submitted, which is then used to evaluate whether the patch should be accepted (see above). See the full report here.

Conclusion

It’s truly inspiring how anyone can contribute to free and open source software like the Linux kernel. From small device additions like mine to larger optimisations to improve performance, the kernel is built on the contributions of so many people, and I believe that that’s what makes free and open source software powerful.

I hope to contribute more meaningful patches to the kernel in the future.