| From 4bc7801e415f93d43030aa5c07f2b89269240f7a Mon Sep 17 00:00:00 2001 |
| From: Marcel Holtmann <marcel@holtmann.org> |
| Date: Fri, 22 Nov 2019 00:33:45 +0100 |
| Subject: [PATCH] Bluetooth: Allow combination of BDADDR_PROPERTY and |
| INVALID_BDADDR quirks |
| |
| commit 7fdf6c6a0d0e032aac2aa4537a23af1e04a397ce upstream. |
| |
| When utilizing BDADDR_PROPERTY and INVALID_BDADDR quirks together it |
| results in an unconfigured controller even if the bootloader provides |
| a valid address. Fix this by allowing a bootloader provided address |
| to mark the controller as configured. |
| |
| Signed-off-by: Marcel Holtmann <marcel@holtmann.org> |
| Tested-by: Andre Heider <a.heider@gmail.com> |
| Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c |
| index d7a58a5a5d6b..90846751ce43 100644 |
| --- a/net/bluetooth/hci_core.c |
| +++ b/net/bluetooth/hci_core.c |
| @@ -1444,11 +1444,20 @@ static int hci_dev_do_open(struct hci_dev *hdev) |
| |
| if (hci_dev_test_flag(hdev, HCI_SETUP) || |
| test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) { |
| + bool invalid_bdaddr; |
| + |
| hci_sock_dev_event(hdev, HCI_DEV_SETUP); |
| |
| if (hdev->setup) |
| ret = hdev->setup(hdev); |
| |
| + /* The transport driver can set the quirk to mark the |
| + * BD_ADDR invalid before creating the HCI device or in |
| + * its setup callback. |
| + */ |
| + invalid_bdaddr = test_bit(HCI_QUIRK_INVALID_BDADDR, |
| + &hdev->quirks); |
| + |
| if (ret) |
| goto setup_failed; |
| |
| @@ -1457,20 +1466,33 @@ static int hci_dev_do_open(struct hci_dev *hdev) |
| hci_dev_get_bd_addr_from_property(hdev); |
| |
| if (bacmp(&hdev->public_addr, BDADDR_ANY) && |
| - hdev->set_bdaddr) |
| + hdev->set_bdaddr) { |
| ret = hdev->set_bdaddr(hdev, |
| &hdev->public_addr); |
| + |
| + /* If setting of the BD_ADDR from the device |
| + * property succeeds, then treat the address |
| + * as valid even if the invalid BD_ADDR |
| + * quirk indicates otherwise. |
| + */ |
| + if (!ret) |
| + invalid_bdaddr = false; |
| + } |
| } |
| |
| setup_failed: |
| /* The transport driver can set these quirks before |
| * creating the HCI device or in its setup callback. |
| * |
| + * For the invalid BD_ADDR quirk it is possible that |
| + * it becomes a valid address if the bootloader does |
| + * provide it (see above). |
| + * |
| * In case any of them is set, the controller has to |
| * start up as unconfigured. |
| */ |
| if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) || |
| - test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks)) |
| + invalid_bdaddr) |
| hci_dev_set_flag(hdev, HCI_UNCONFIGURED); |
| |
| /* For an unconfigured controller it is required to |
| -- |
| 2.7.4 |
| |