Commit 8bfe8442ff20fdc2d965c197103d935a99bd3296

Authored by Marcel Holtmann
Committed by Johan Hedberg
1 parent 71bb99a02b

Bluetooth: Fix controller configuration with HCI_QUIRK_INVALID_BDADDR

When controllers set the HCI_QUIRK_INVALID_BDADDR flag, it is required
by userspace to program a valid public Bluetooth device address into
the controller before it can be used.

After successful address configuration, the internal state changes and
the controller runs the complete initialization procedure. However one
small difference is that this is no longer the HCI_SETUP stage. The
HCI_SETUP stage is only valid during initial controller setup. In this
case the stack runs the initialization as part of the HCI_CONFIG stage.

The controller version information, default name and supported commands
are only stored during HCI_SETUP. While these information are static,
they are not read initially when HCI_QUIRK_INVALID_BDADDR is set. So
when running in HCI_CONFIG state, these information need to be updated
as well.

This especially impacts Bluetooth 4.1 and later controllers using
extended feature pages and second event mask page.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Cc: stable@vger.kernel.org # 3.17+

Showing 1 changed file with 6 additions and 3 deletions Side-by-side Diff

net/bluetooth/hci_event.c
... ... @@ -242,7 +242,8 @@
242 242 if (rp->status)
243 243 return;
244 244  
245   - if (test_bit(HCI_SETUP, &hdev->dev_flags))
  245 + if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
  246 + test_bit(HCI_CONFIG, &hdev->dev_flags))
246 247 memcpy(hdev->dev_name, rp->name, HCI_MAX_NAME_LENGTH);
247 248 }
248 249  
... ... @@ -509,7 +510,8 @@
509 510 if (rp->status)
510 511 return;
511 512  
512   - if (test_bit(HCI_SETUP, &hdev->dev_flags)) {
  513 + if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
  514 + test_bit(HCI_CONFIG, &hdev->dev_flags)) {
513 515 hdev->hci_ver = rp->hci_ver;
514 516 hdev->hci_rev = __le16_to_cpu(rp->hci_rev);
515 517 hdev->lmp_ver = rp->lmp_ver;
... ... @@ -528,7 +530,8 @@
528 530 if (rp->status)
529 531 return;
530 532  
531   - if (test_bit(HCI_SETUP, &hdev->dev_flags))
  533 + if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
  534 + test_bit(HCI_CONFIG, &hdev->dev_flags))
532 535 memcpy(hdev->commands, rp->commands, sizeof(hdev->commands));
533 536 }
534 537