Skip to content

Instantly share code, notes, and snippets.

@rometsch
Last active October 16, 2023 08:16
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save rometsch/dfd24fb09c85c1ad2f25223dc1481aaa to your computer and use it in GitHub Desktop.
Save rometsch/dfd24fb09c85c1ad2f25223dc1481aaa to your computer and use it in GitHub Desktop.
MPOW BH456A Bluetooth USB Adapter Kernel Module Adjustements (Realtek RTL8761B chip)

Problem

The MPOW Bluetooth 5 dongle (Model: BH456A) does not work out of the box on Ubuntu 20.04 (kernel 5.4.0-42).

Solution

Patch the bluetooth kernel module and copy the firmware binaries to /lib/firmware.

Copy the fimware

MPOW hosts a linux driver on their homepage. Download it via:

wget https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Linux.tgz

Extract the contents

tar xvf mpow_MPBH456AB_driver+for+Linux.tgz

and copy the firmware files to the appropriate system directory

SRCDIR="20200610_LINUX_BT_DRIVER/rtkbt-firmware/lib/firmware"
sudo cp $SRCDIR/rtl8761bu_fw /lib/firmware/rtl_bt/rtl8761b_fw.bin
sudo cp $SRCDIR/rtl8761bu_config /lib/firmware/rtl_bt/rtl8761b_config.bin

Patch the bluetooth kernel module

This patch fixed a bug in the bluetooth module wrongly identifying the bluetooth chip as another version. For reference, I added the patch to this gist.

To fix this, get the kernel source

git clone --depth 1 --single-branch --branch master git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git

for your ubuntu version. Change master for whatever version you are on if its different.

Then apply the patch with

patch -p 1 <  2-1-1-Bluetooth-btrtl-Add-support-for-RTL8761B.diff

and fix possible conflicts.

Then its time to build the bluetooth module.

First copy the old driver

sudo cp -r /lib/modules/$(uname -r)/kernel/drivers/bluetooth
/lib/modules/$(uname -r)/kernel/drivers/bluetooth_bak

Inside the cloned repository first get the current kernels config

make oldconfig
make prepare
make scripts

and build the bluetooth module

cd drivers/bluetooth
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

and copy the ko module files to the systems module dir which we backed up before.

sudo cp *.ko /lib/modules/$(uname -r)/kernel/drivers/bluetooth

This will overwrite the existing modules. Running make install didn't work for me because of a missing certification error. Probably the official Ubuntu kernel is signed.

I don't have secure boot activated, so for we unsigned drivers work fine.

Now reboot and everything should be fine.

diff --git a/drivers/bluetooth/btrtl.c b/drivers/bluetooth/btrtl.c
index 67f4bc21e7c5..3a9afc905f24 100644
--- a/drivers/bluetooth/btrtl.c
+++ b/drivers/bluetooth/btrtl.c
@@ -130,12 +130,19 @@ static const struct id_table ic_id_table[] = {
.cfg_name = "rtl_bt/rtl8821c_config" },
/* 8761A */
- { IC_MATCH_FL_LMPSUBV, RTL_ROM_LMP_8761A, 0x0,
+ { IC_INFO(RTL_ROM_LMP_8761A, 0xa),
.config_needed = false,
.has_rom_version = true,
.fw_name = "rtl_bt/rtl8761a_fw.bin",
.cfg_name = "rtl_bt/rtl8761a_config" },
+ /* 8761B */
+ { IC_INFO(RTL_ROM_LMP_8761A, 0xb),
+ .config_needed = false,
+ .has_rom_version = true,
+ .fw_name = "rtl_bt/rtl8761b_fw.bin",
+ .cfg_name = "rtl_bt/rtl8761b_config" },
+
/* 8822C with UART interface */
{ .match_flags = IC_MATCH_FL_LMPSUBV | IC_MATCH_FL_HCIREV |
IC_MATCH_FL_HCIBUS,
@@ -267,6 +274,7 @@ static int rtlbt_parse_firmware(struct hci_dev *hdev,
{ RTL_ROM_LMP_8723B, 9 }, /* 8723D */
{ RTL_ROM_LMP_8821A, 10 }, /* 8821C */
{ RTL_ROM_LMP_8822B, 13 }, /* 8822C */
+ { RTL_ROM_LMP_8761A, 14 }, /* 8761B */
};
min_size = sizeof(struct rtl_epatch_header) + sizeof(extension_sig) + 3;
@johann-petrak
Copy link

johann-petrak commented Aug 8, 2022

I do not understand these instructions, the file 20201202_mpow_BH456A_driver+for+Linux.7z
from https://mpow.s3-us-west-1.amazonaws.com/20201202_mpow_BH456A_driver+for+Linux.7z does not contain a file rtl8761bu_fw.bin
The URL https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Linux.tgz gives an access denied error.

I was able to fetch the individual files this way:

wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/rtl_bt/rtl8761bu_fw.bin
wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree/rtl_bt/rtl8761bu_config.bin

After copying to /usr/lib/firmware/rtl_bt the files seem to get loaded, but then I get the error:
Bluetooth: hci0: RTL: extension section signature mismatch

I found a file https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Linux.tgz which expands to 20200610_LINUX_BT_DRIVER/ but this one also does not contain rtl8761bu_{config,fw.}bin

@johann-petrak
Copy link

@satels
Copy link

satels commented Aug 10, 2022

@kairhe
Copy link

kairhe commented Dec 6, 2022

Thanks,i got my issue solved!

@userse31
Copy link

userse31 commented Dec 28, 2022

When attempt download file https://mpow.s3-us-west-1.amazonaws.com/mpow_MPBH456AB_driver+for+Linux.tgz got error forbidden 403 Can someone upload and give link.

upd: find here https://aur.archlinux.org/packages/rtl8761b-fw/

Thank god for archive.org. Like, fuck! That site has saved my ass so many times! Love that site!

Created a special page for convenience: https://archive.org/details/mpow_mpbh456ab_driverforlinux

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment