mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Bluetooth: fix invalid-bdaddr quirk for non-persistent setup
[ Upstream commit0cb7365850] Devices that lack persistent storage for the device address can indicate this by setting the HCI_QUIRK_INVALID_BDADDR which causes the controller to be marked as unconfigured until user space has set a valid address. Once configured, the device address must be set on every setup for controllers with HCI_QUIRK_NON_PERSISTENT_SETUP to avoid marking the controller as unconfigured and requiring the address to be set again. Fixes:740011cfe9("Bluetooth: Add new quirk for non-persistent setup settings") Signed-off-by: Johan Hovold <johan+linaro@kernel.org> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
102f3555ce
commit
018b12ff16
@@ -4567,23 +4567,17 @@ static int hci_dev_setup_sync(struct hci_dev *hdev)
|
||||
invalid_bdaddr = test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
|
||||
if (!ret) {
|
||||
if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) {
|
||||
if (!bacmp(&hdev->public_addr, BDADDR_ANY))
|
||||
hci_dev_get_bd_addr_from_property(hdev);
|
||||
if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks) &&
|
||||
!bacmp(&hdev->public_addr, BDADDR_ANY))
|
||||
hci_dev_get_bd_addr_from_property(hdev);
|
||||
|
||||
if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
|
||||
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;
|
||||
}
|
||||
if ((invalid_bdaddr ||
|
||||
test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
|
||||
bacmp(&hdev->public_addr, BDADDR_ANY) &&
|
||||
hdev->set_bdaddr) {
|
||||
ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
|
||||
if (!ret)
|
||||
invalid_bdaddr = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user