RE: [PATCH v6 7/9] Bluetooth: hci_sync: Add NVMEM-backed BD address retrieval
From: Kwapulinski, Piotr
Date: Mon Jun 29 2026 - 05:28:38 EST
>-----Original Message-----
>From: Loic Poulain <loic.poulain@xxxxxxxxxxxxxxxx>
>Sent: Monday, June 29, 2026 10:55 AM
>To: Ulf Hansson <ulfh@xxxxxxxxxx>; Rob Herring <robh@xxxxxxxxxx>; Krzysztof Kozlowski <krzk+dt@xxxxxxxxxx>; Conor Dooley <conor+dt@xxxxxxxxxx>; Bjorn Andersson <andersson@xxxxxxxxxx>; Konrad Dybcio <konradybcio@xxxxxxxxxx>; Jens Axboe <axboe@xxxxxxxxx>; Johannes Berg <johannes@xxxxxxxxxxxxxxxx>; Jeff Johnson <jjohnson@xxxxxxxxxx>; Bartosz Golaszewski <brgl@xxxxxxxxxx>; Marcel Holtmann <marcel@xxxxxxxxxxxx>; Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx>; Balakrishna Godavarthi <quic_bgodavar@xxxxxxxxxxx>; Rocky Liao <quic_rjliao@xxxxxxxxxxx>; David S. Miller <davem@xxxxxxxxxxxxx>; Eric Dumazet <edumazet@xxxxxxxxxx>; Jakub Kicinski <kuba@xxxxxxxxxx>; Paolo Abeni <pabeni@xxxxxxxxxx>; Simon Horman <horms@xxxxxxxxxx>; Srinivas Kandagatla <srini@xxxxxxxxxx>; Andrew Lunn <andrew@xxxxxxx>; Heiner Kallweit <hkallweit1@xxxxxxxxx>; Russell King <linux@xxxxxxxxxxxxxxx>; Saravana Kannan <saravanak@xxxxxxxxxx>; Christian Marangi <ansuelsmth@xxxxxxxxx>
>Cc: linux-mmc@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; linux-arm-msm@xxxxxxxxxxxxxxx; linux-block@xxxxxxxxxxxxxxx; linux-wireless@xxxxxxxxxxxxxxx; ath10k@xxxxxxxxxxxxxxxxxxx; linux-bluetooth@xxxxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx; daniel@xxxxxxxxxxxxxx; Loic Poulain <loic.poulain@xxxxxxxxxxxxxxxx>; Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxxxxxxxx>
>Subject: [PATCH v6 7/9] Bluetooth: hci_sync: Add NVMEM-backed BD address retrieval
>
>Some devices store the Bluetooth BD address in non-volatile memory, which can be accessed through the NVMEM framework.
>Similar to Ethernet or WiFi MAC addresses, add support for reading the BD address from a 'local-bd-address' NVMEM cell.
>
>As with the device-tree provided BD address, add a quirk to indicate whether a device or platform should attempt to read the address from NVMEM when no valid in-chip address is present.
>Also add a quirk to indicate if the address is stored in big-endian byte order.
>
>Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxxxxxxxx>
>Signed-off-by: Loic Poulain <loic.poulain@xxxxxxxxxxxxxxxx>
>---
> include/net/bluetooth/hci.h | 18 ++++++++++++++++++
> net/bluetooth/hci_sync.c | 39 ++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 56 insertions(+), 1 deletion(-)
>
>diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 572b1c620c5d653a1fe10b26c1b0ba33e8f4968f..7686466d1109253b0d75edeb5f6a99fb98ce4cc6 100644
>--- a/include/net/bluetooth/hci.h
>+++ b/include/net/bluetooth/hci.h
>@@ -164,6 +164,24 @@ enum {
> */
> HCI_QUIRK_BDADDR_PROPERTY_BROKEN,
>
>+ /* When this quirk is set, the public Bluetooth address
>+ * initially reported by HCI Read BD Address command
>+ * is considered invalid. The public BD Address can be
>+ * retrieved via a 'local-bd-address' NVMEM cell.
>+ *
>+ * This quirk can be set before hci_register_dev is called or
>+ * during the hdev->setup vendor callback.
>+ */
>+ HCI_QUIRK_USE_BDADDR_NVMEM,
>+
>+ /* When this quirk is set, the Bluetooth Device Address provided by
>+ * the 'local-bd-address' NVMEM is stored in big-endian order.
>+ *
>+ * This quirk can be set before hci_register_dev is called or
>+ * during the hdev->setup vendor callback.
>+ */
>+ HCI_QUIRK_BDADDR_NVMEM_BE,
>+
> /* When this quirk is set, the duplicate filtering during
> * scanning is based on Bluetooth devices addresses. To allow
> * RSSI based updates, restart scanning if needed.
>diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index fd3aacdea512a37c22b9a2be90c89ddca4b4d99f..589ccdfa26c1281d6eb979370523fff0d7920302 100644
>--- a/net/bluetooth/hci_sync.c
>+++ b/net/bluetooth/hci_sync.c
>@@ -7,6 +7,7 @@
> */
>
> #include <linux/property.h>
>+#include <linux/of_net.h>
>
> #include <net/bluetooth/bluetooth.h>
> #include <net/bluetooth/hci_core.h>
>@@ -3588,6 +3589,37 @@ int hci_powered_update_sync(struct hci_dev *hdev)
> return 0;
> }
>
>+/**
>+ * hci_dev_get_bd_addr_from_nvmem - Get the Bluetooth Device Address
>+ * (BD_ADDR) for a HCI device from
>+ * an NVMEM cell.
>+ * @hdev: The HCI device
>+ *
>+ * Search for 'local-bd-address' NVMEM cell in the device firmware node.
>+ *
>+ * All-zero BD addresses are rejected (unprovisioned).
Please add return value description and
Reviewed-by: Piotr Kwapulinski <piotr.kwapulinski@xxxxxxxxx>
Thank you.
Piotr
>+ */
>+static int hci_dev_get_bd_addr_from_nvmem(struct hci_dev *hdev) {
>+ struct device_node *np = dev_of_node(hdev->dev.parent);
>+ u8 ba[sizeof(bdaddr_t)];
>+ int err;
>+
>+ if (!np)
>+ return -ENODEV;
>+
>+ err = of_get_nvmem_eui48(np, "local-bd-address", ba);
>+ if (err)
>+ return err;
>+
>+ if (hci_test_quirk(hdev, HCI_QUIRK_BDADDR_NVMEM_BE))
>+ baswap(&hdev->public_addr, (bdaddr_t *)ba);
>+ else
>+ bacpy(&hdev->public_addr, (bdaddr_t *)ba);
>+
>+ return 0;
>+}
>+
> /**
> * hci_dev_get_bd_addr_from_property - Get the Bluetooth Device Address
> * (BD_ADDR) for a HCI device from
>@@ -5042,12 +5074,17 @@ static int hci_dev_setup_sync(struct hci_dev *hdev)
> * its setup callback.
> */
> invalid_bdaddr = hci_test_quirk(hdev, HCI_QUIRK_INVALID_BDADDR) ||
>- hci_test_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
>+ hci_test_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY) ||
>+ hci_test_quirk(hdev, HCI_QUIRK_USE_BDADDR_NVMEM);
> if (!ret) {
> if (hci_test_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY) &&
> !bacmp(&hdev->public_addr, BDADDR_ANY))
> hci_dev_get_bd_addr_from_property(hdev);
>
>+ if (hci_test_quirk(hdev, HCI_QUIRK_USE_BDADDR_NVMEM) &&
>+ !bacmp(&hdev->public_addr, BDADDR_ANY))
>+ hci_dev_get_bd_addr_from_nvmem(hdev);
>+
> if (invalid_bdaddr && bacmp(&hdev->public_addr, BDADDR_ANY) &&
> hdev->set_bdaddr) {
> ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
>
>--
>2.34.1
>