Re: [PATCH] Bluetooth: qca: check the device address on every setup
From: Bartosz Golaszewski
Date: Mon Oct 19 2026 - 04:15:12 EST
On Fri, 16 Oct 2026 14:46:15 +0200, Joonhoe Kim <26rote@xxxxxxxxx> said:
> qca_check_bdaddr() sets HCI_QUIRK_USE_BDADDR_PROPERTY when the
> controller reports the default address from its NVM file, so that the
> core programs the configured address again on every setup. The check
> is skipped once hdev->public_addr is set.
>
> If the first setup runs on the ROM firmware because the rampatch and NVM
> files could not be loaded (driver built in, firmware not in the
> initramfs), the check is not reached. Once user space sets the address
> with MGMT_OP_SET_PUBLIC_ADDRESS, every later setup skips it, so the
> controller falls back to the default address on the next power on and
> bonded devices no longer connect. Seen with a WCN7850 on a Lenovo Legion
> Tab Y700 Gen 5.
>
> Check the address on every setup. Setting the quirk while
> hdev->public_addr is set does not make the controller unconfigured, as
> is_configured() only looks at it while no address is set.
>
> Fixes: 32868e126c78 ("Bluetooth: qca: fix invalid device address check")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Joonhoe Kim <26rote@xxxxxxxxx>
> ---
> Tested with the WCN7850 over UART: the configured address survives
> three power cycles, a bluetoothd restart and an rfkill block/unblock;
> without this patch the first power cycle reverts it. The NVMEM BD
> address series [1] changes the same branch; the two apply in either
> order.
>
> [1] https://lore.kernel.org/all/20261015-block-as-nvmem-v11-6-f890ac74f87d@xxxxxxxxxxxxxxxx/
>
> drivers/bluetooth/btqca.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c
> index 22b08ab05b82..756a4a8d5631 100644
> --- a/drivers/bluetooth/btqca.c
> +++ b/drivers/bluetooth/btqca.c
> @@ -686,9 +686,6 @@ static int qca_check_bdaddr(struct hci_dev *hdev, const struct qca_fw_config *co
> struct sk_buff *skb;
> int err;
>
> - if (bacmp(&hdev->public_addr, BDADDR_ANY))
> - return 0;
> -
> skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
> HCI_INIT_TIMEOUT);
> if (IS_ERR(skb)) {
> --
> 2.43.0
>
>
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxxxxxxxx>