RE: [PATCH v6 7/9] Bluetooth: hci_sync: Add NVMEM-backed BD address retrieval
"Kwapulinski, Piotr" <[email protected]> Mon, 29 Jun 2026 09:23:07 +0000
| Newsgroups | org.infradead.lists.ath10k,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-block,org.kernel.vger.linux-bluetooth,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-mmc,org.kernel.vger.linux-wireless,org.kernel.vger.netdev |
|---|---|
| Message-ID | <PH7PR11MB5983F94CEA966F037C4E768CF3E82@PH7PR11MB5983.namprd11.prod.outlook.com> |
>-----Original Message----- >From: Loic Poulain <[email protected]> >Sent: Monday, June 29, 2026 10:55 AM >To: Ulf Hansson <[email protected]>; Rob Herring <[email protected]>; Krzysztof Kozlowski <[email protected]>; Conor Dooley <[email protected]>; Bjorn Andersson <[email protected]>; Konrad Dybcio <[email protected]>; Jens Axboe <[email protected]>; Johannes Berg <[email protected]>; Jeff Johnson <[email protected]>; Bartosz Golaszewski <[email protected]>; Marcel Holtmann <[email protected]>; Luiz Augusto von Dentz <[email protected]>; Balakrishna Godavarthi <[email protected]>; Rocky Liao <[email protected]>; David S. Miller <[email protected]>; Eric Dumazet <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni <[email protected]>; Simon Horman <[email protected]>; Srinivas Kandagatla <[email protected]>; Andrew Lunn <[email protected]>; Heiner Kallweit <[email protected]>; Russell King <[email protected]>; Saravana Kannan <[email protected]>; Christian Marangi <[email protected]> >Cc: [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; [email protected]; Loic Poulain <[email protected]>; Bartosz Golaszewski <[email protected]> >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 <[email protected]> >Signed-off-by: Loic Poulain <[email protected]> >--- > 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 <[email protected]> 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 >